单键调时,适用带冒号时钟专用数码管。
- #include<reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define key_S 3 //宏定义短按(约15ms)
- #define key_L key_S*40 //宏定义长按(约600ms)
- #define key_I key_S*20 //宏定义长按连+间隔(约300ms)
- sbit K1=P2^4;//连接按键
- sbit DP=P0^7;//连接冒号
- uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳LED段码表
- uchar displayData[4];//显示数据缓存
- char shi=12,fen=0,sec=0;//时,分,秒
- uchar Cnt5ms;//5ms时基
- uchar KeySec;//键值
- uint num=0;//计数
- bit flashing=0;//闪烁标志
- //定时器初始化程序
- void Timer0Init()//5毫秒@12.000MHz
- {
- TMOD=0x01;//定时器T0方式1
- TH0=(65536-5000)/256;
- TL0=(65536-5000)%256;
- TF0=0;//中断请求清0
- TR0=1;//启动T0
- }
- void keyscan()
- {
- static unsigned int time=0;//计数变量
- if(!K1)//按键按下
- {
- time++;
- if(time>=key_L)//长按
- {
- switch(KeySec)
- {
- case 1: shi++;if(shi>23)shi=0; break;
- case 2: fen++;if(fen>59)fen=0; break;
- }
- time=key_I;//连+间隔
- num=1000;//自复位变量赋值(5秒)
- }
- }
- else //松手
- {
- if(time>key_S && time<key_I)//短按
- {
- KeySec++;
- if(KeySec>2)
- {
- KeySec=0;
- Cnt5ms=0;
- sec=0;
- }
- num=1000;//自复位变量赋值(5秒)
- }
- time=0;
- }
- }
- void display()//显示
- {
- static uchar i=0;
- displayData[0] = tab[shi/10%10];
- displayData[1] = tab[shi%10];
- displayData[2] = tab[fen/10%10];
- displayData[3] = tab[fen%10];
- P2&=0xf0;//消隐
- if(KeySec==0)
- P0=displayData[i];
- if(KeySec==1)
- {
- if(flashing && (i==0||i==1) && K1)
- P0=0xff;//时调整闪烁
- else P0=displayData[i];
- }
- if(KeySec==2)
- {
- if(flashing && (i==2||i==3) && K1)
- P0=0xff;//分调整闪烁
- else P0=displayData[i];
- }
- P2|=0x01<<i;
- i=++i%4;
- }
- void main()//主函数
- {
- Timer0Init();//初始化定时器
- while(1)
- {
- if(TF0)//查询定时器中断请求位
- {
- TF0=0;
- TH0=(65536-5000)/256;//5ms
- TL0=(65536-5000)%256;
- Cnt5ms++;
- if(KeySec!=0)
- {
- num--;
- if(num==0)//按键停止操作5秒自动恢复正常显示
- {
- KeySec=0;
- Cnt5ms=0;
- sec=0;
- }
- if(Cnt5ms%50==0) //0.25s 快闪
- flashing=~flashing;
- }
- else if(Cnt5ms%100==0)//0.5s 慢闪
- flashing=~flashing;
- if(Cnt5ms==200)//1s
- {
- Cnt5ms=0;
- sec++;
- if(sec>=60)
- {
- sec=0;
- fen++;
- if(fen>=60)
- {
- fen=0;
- shi++;
- if(shi>23)
- shi=0;
- }
- }
- }
- keyscan(); //按键扫描
- display(); //数码管显示
- if(KeySec==0)
- DP=flashing; //闪冒号 表示走时
- else DP=0;
- }
- }
- }
复制代码
4位数码管时钟仿真.rar
(125.11 KB, 下载次数: 15)
|