数字时钟可修改程序
//已验证可行,消抖效果一般
//4位动态显示数字时钟程序
#include <reg52.h>
#include <intrins.h>
//#include <absacc.h>
#define uchar unsigned char
#define uint unsigned int
//
sbit dp0 =P2^4;
sbit dp1 =P2^5;
sbit dp2 =P2^6;
sbit dp3 =P2^7;
sbit spk =P1^1; //P3^5;
bit set,ms,df;
uchar cnt[3],dpt=0,dpbuf[4]; //全局变量定义
// //显示字模表
code uchar tab[]={0x18,0x7b,0x2c,0x29,0x4b,0x89,0x88,0x3b,0x08,0x09,0xef}; //
void delay_10us(void)
{
_nop_(); _nop_();
_nop_(); _nop_();
_nop_(); _nop_();
_nop_(); _nop_();
} // 8 nop+ret=10 Cycle
//
void timer0(void) interrupt 1 using 1
{ //5mS timer interrupt
// uchar k,j;
TH0=0xee; //65536-4608
TL0=0x00;
if(dpt<3) dpt++; else dpt=0; //动态显示计数器if(dpt==2) P0 = tab[dpbuf[dpt]]&0xf7;
else P0 = tab[dpbuf[dpt]];
switch(dpt)
{ case 0: dp1 = dp2 = dp3 = 1;
dp0=0;
break;
case 1: dp0 = dp2 = dp3 = 1;
dp1=0;
break;
case 2: dp0 = dp1 = dp3 = 1;
dp2=0;
break;
case 3: dp0 = dp1 = dp2 = 1;
dp3=0;
}
if(set) //设置时钟状态
{ cnt[0]++;
if(cnt[0]>=100) //0.5秒闪烁切换
{ cnt[0]=0; //开始进入下个0.5秒计时
df = !df;
}
if(ms) //分闪烁显示
{ dpbuf[0]=cnt[1]%10;
dpbuf[1]=cnt[1]/10;
if(df)
{ dpbuf[2]=cnt[2]%10;
dpbuf[3]=cnt[2]/10;
}
else
{ dpbuf[2]=0xff;
dpbuf[3]=0xff; //消隐,不显示}
}
else //秒闪烁显示
{ dpbuf[2]=cnt[2]%10;
dpbuf[3]=cnt[2]/10;
if(df)
{ dpbuf[0]=cnt[1]%10;
dpbuf[1]=cnt[1]/10;
}
else
{ dpbuf[0]=0xff;
dpbuf[1]=0xff;
}
}
}
//
else //正常显示时钟状态{ cnt[0]++;
if(cnt[0]>=200)
{
cnt[0]=0;
cnt[1]++;
dpbuf[0]=cnt[1]%10;
dpbuf[1]=cnt[1]/10;
if(cnt[1]>=60)
{
cnt[1]=0;
dpbuf[0]=cnt[1]%10;
dpbuf[1]=cnt[1]/10;
cnt[2]++;
dpbuf[2]=cnt[2]%10;
dpbuf[3]=cnt[2]/10;
if(cnt[2]>=60)
{ cnt[2]=0;
dpbuf[2]=cnt[2]%10;
dpbuf[3]=cnt[2]/10;
}
}
}
}
}
//
//******************************************************************* void main(void)
{
uchar k,buf;
uint j;
//
dp0 = dp1 = dp2 = dp3 = 0;
for(k=0;k<10;k++) //数字显示测试
{
P0 = tab[k];
spk=0;
for(j=0;j<5000;j++) delay_10us();
spk=1;
for(j=0;j<5000;j++) delay_10us();
}
//
dpbuf[0]=dpbuf[1]=dpbuf[2]=dpbuf[3]=0;
TMOD=0x11; //定时器初始化;方式1
TR0=1;
ET0=1;
EA=1;
while(1) //主程序循环
{
do
{ k=P2&0x0f;
for(j=0;j<5000;j++) delay_10us();
k=(P2&0x0f)&k; //按键检测,当没有键按下(均为高电平,0x0f),就一直读,直到}while(k==0x0f); //有键按下
buf=k;
while(k!=0x0f)
{ spk=0; //按键音
k=P2&0x0f;
}
spk=1;
if(buf==0x07)
{ set = !set;
dpbuf[0]=cnt[1]%10;
dpbuf[1]=cnt[1]/10;
dpbuf[2]=cnt[2]%10;
dpbuf[3]=cnt[2]/10;
}
if(buf==0x0b) ms = !ms;
if(buf==0x0d)
if(ms)
{ if(cnt[2]<58) cnt[2]++;
}
else
{ if(cnt[1]<58) cnt[1]++;
}
if(buf==0x0e)
if(ms)
{ if(cnt[2]>0) cnt[2]--;
}
else
{ if(cnt[1]>0) cnt[1]--;
}
}
}。