unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x00}; //数码管显示段数据 unsigned char dispbitcode[]={0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f};//数码管位驱动,第一次驱动接在最低位的那一个数码管 unsigned char dispbuf[8]={0,0,16,0,0,16,0,0};//显示缓冲寄存器 unsigned char dispbitcnt;
unsigned char second; unsigned char minite; unsigned char hour; unsigned int tcnt; unsigned char mstcnt;
unsigned char i,j;
void main(void) {
TMOD=0x02;//设置定时器工作方式为2,8位定时状态,自动装入初值。 TH0=0x06;//装入初值 TL0=0x06;
TR0=1;//起动定时器 ET0=1;//开启定时器中断 EA=1;//开总中断 while(1) {//主循环
if(P0_0==0)//如果P0.0位等于0,往下走 {
for(i=5;i>0;i--)
for(j=248;j>0;j--);//延时防抖动
if(P0_0==0)//再次判断P0.0是否等于0,如果是,则设置秒 {
second++;//秒加1
if(second==60)//如果秒等于60,又重0开始,以便开始走时 {
second=0; }
dispbuf[0]=second%10;//刷新秒个位,并装驱动显示缓冲寄存器 dispbuf[1]=second/10;//刷新秒十位,同上。
while(P0_0==0);//等待P0.0放开。(等待按键放开) } }
if(P0_1==0)//如果P0.1位等于0,往下走 {
for(i=5;i>0;i--)
for(j=248;j>0;j--);//延时防抖动
if(P0_1==0)//再次判断P0.1是否等于0,如果是,则设置分钟值 {
minite++;//分钟加1 if(minite==60)// { minite=0;
}
dispbuf[3]=minite%10;//刷新分钟个位,并装驱动显示缓冲寄存器 dispbuf[4]=minite/10;//刷新分钟十位,同上
while(P0_1==0);//等待P0.1放开。(等待按键放开) } }
if(P0_2==0)//大概意思同上,只是这里是用来设置小时值的 {
for(i=5;i>0;i--) for(j=248;j>0;j--); if(P0_2==0) { hour++; if(hour==24) { hour=0; }
dispbuf[6]=hour%10; dispbuf[7]=hour/10; while(P0_2==0); } } } }
void t0(void) interrupt 1 using 0//定时器中断子程序 {
mstcnt++;//用于刷新所显示的数据,第中断8次显示1位数码管(动态显示) if(mstcnt==8)//判断中断8次没,如果是,则显示数据 {
mstcnt=0;
P1=dispcode[dispbuf[dispbitcnt]];//段位码送P1口,驱动数码管显示 P3=dispbitcode[dispbitcnt];//选中数码管显示位 dispbitcnt++;//显示索引,用于调哪一位数据
if(dispbitcnt==8)//判断调完没,如果调完了,则又从第一位开始。 {
dispbitcnt=0; }
}
tcnt++;//第中断一次自动加1,如果中断4000次,则秒自动加1(这里的中断次数可以跟据你所置的定时器初值来改变) if(tcnt==4000) {
tcnt=0;
second++;//秒加1
if(second==60)//如果秒等于60,则分钟自动加1,并且秒回0 {
second=0; minite++;//分钟加1
if(minite==60)//如果分钟等于0,则小时值自动加1,并且分钟回0 { minite=0;
hour++;//小时值加1
if(hour==24)//如果小时值等于24,则回0 { hour=0; } }
}
dispbuf[0]=second%10;//刷新显示缓冲寄存器 dispbuf[1]=second/10; dispbuf[3]=minite%10; dispbuf[4]=minite/10; dispbuf[6]=hour%10; dispbuf[7]=hour/10; } }
因篇幅问题不能全部显示,请点此查看更多更全内容