#include <REGX52.H>
#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^6;
sbit wela=P2^7;
uchar shi,ge,nummiao,num1,num2,num3,num4,num5,num6;
uchar shi2,shi1,fen2,fen1,miao2,miao1,count,fen,miao,shizhong;
uchar shuzi[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void delay()
{
uint i;
for(i=50;i>0;i--);
}
void init()
{
TMOD=0x01;
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
EA=1;
ET0=1;
TR0=1;
}
void time0() interrupt 1
{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
count++;
if(count>20)
{
count=0;
miao++;
if(miao>60)
{
miao=0;
fen++;
if(fen>60)
{
fen=0;
shizhong++;
if(shizhong>24)
{
shizhong=0;
}
}
}
}
miao2=miao/10;
miao1=miao%10;
fen2=fen/10;
fen1=fen%10;
shi2=shizhong/10;
shi1=shizhong%10;
}
void display(uchar shi2,uchar shi1,uchar fen2,uchar fen1,uchar maio2,uchar maio1)
{
dula=0;
P0=shuzi[shi2];
dula=1;
dula=0;
P0=0xff;
wela=0;
P0=0xfe;
wela=1;
wela=0;
delay();
P0=shuzi[shi1];
dula=1;
dula=0;
P0=0xff;
P0=0xfd;
wela=1;
wela=0;
delay();
P0=shuzi[fen2];
dula=1;
dula=0;
P0=0xff;
P0=0xfb;
wela=1;
wela=0;
delay();
P0=shuzi[fen1];
dula=1;
dula=0;
P0=0xff;
P0=0xf7;
wela=1;
wela=0;
delay();
P0=shuzi[miao2];
dula=1;
dula=0;
P0=0xff;
P0=0xef;
wela=1;
wela=0;
delay();
P0=shuzi[maio1];
dula=1;
dula=0;
P0=0xff;
P0=0xdf;
wela=1;
wela=0;
delay();
}
void main()
{
init();
while(1)
{
display(shi2,shi1,fen2,fen1,miao2,miao1);
}
}>
单个的调试每个字符,怀疑是是段选编码有问题!
1,检查显示编码和连接线序是否匹配
2,中断里改变的全局变量,建议定义的时候加上volatile,比如程序里的shi fen miao
共阳极数码管,8个LED的阳极全部并联到一起引出连接+5V。点亮对应的数码管段给低电平,反之熄灭给高电平。
新建数码管SMG文件,用于装相关的驱动文件(smg.c)和头文件(smg.h)。
smg.c
#include "smg.h"
void SMG_Init() //初始化数码管
{
GPIO_InitTypeDef GPIO_InitStructure; //声明结构体变量用于初始化GPIO
RCC_APB2PeriphClockCmd(SMG_PORT_RCC,ENABLE);//开启GPIO时钟 SMG_PORT_RCC=RCC_APB2Periph_GPIOC
/*配置GPIO模式和IO口 */
GPIO_InitStructure.GPIO_Pin=SMG_PIN; //选择IO口引脚
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(SMG_PORT,&GPIO_InitStructure);//初始化GPIO SMG_PORT =GPIOC
}
smg.h
#ifndef _smg_H
#define _smg_H
#include "system.h"
#define SMG_PORT GPIOC
#define SMG_PIN (GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7)
#define SMG_PORT_RCC RCC_APB2Periph_GPIOC
void SMG_Init(void);//
#endif
主函数:
#include "system.h" //位带操作宏定义
#include "SysTick.h" //定时器宏定义
#include "led.h" //LED端口、引脚宏定义
#include "smg.h" //数码管驱动文件内宏定义
u8 smgduan[16]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07,
0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71};// 数码管显示0-F时对应的数码管数据
int main()
{
u8 i=0;
SysTick_Init(72);//精确延时定时器初始化函数
LED_Init();
SMG_Init();
while(1)
{
for(i=0;i<16;i++)
{
GPIO_Write(SMG_PORT,(u16)(~smgduan[i]));
delay_ms(1000); //延迟1000ms
}
}
}