模式按键按键一次时选中小时进行调节,按键两次时进行分钟调节,按键三次时进行秒钟调节。另外单独设置一键控制计数器TO的启停。另外用两个键分别设置成+和-键。可否把启停计数器的TR0=~TR0这一句加入到模式按键检测程序中而省掉一个控制计数器启停的按键?当加入时通过实验没有成功,最后设置成四个键盘,成功调出了数字时钟。这个程序本来按照我的想法,只需三个按键:+、-、和模式选择键,程序调了很久没有成功。最后改成了四个按键。这个程序花了一定的时间,但是还需要改进。多功能按键程序。
/************************************
*********数码时钟的设计**************
***************************时间2月15日
**************************************/
#include<reg52.h>
#define uchar unsigned char
sbit duan=P2^6;
sbit wei=P2^7;
sbit keycon=P3^4;//控制启动和停止定时器
sbit keyfun=P3^5;//多功能键调时模式选择
sbit keyadd=P3^6;//按键加
sbit keysub=P3^7;//按键减
uchar code table1[]=
{0x3e,0x3d,0x3b,0x37,0x2f,0x1f};//位选表
uchar code table2[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39 ,0x5e,0x79,0x71,0x40,0x80};//段码表最后一位是小数点倒数第二个位显示-
char hour,minute,second;
uchar count,keynum;//分别为小时、分钟、秒钟、TO计数器中断计数次数、模式按键的次数
/**********初始化函数***************/
void init()
{
wei=0;
P0=0xff;
duan=0;
P0=0x00;// 初始化关显示
hour=23;
minute=59;
second=50;//初始化时间设置为23点59分50秒
TMOD=0x01;//选择计数器TO模式1定时器1选择模式1
TH0=(65536-46080)/256;
TL0=(65536-46080)%256;//定时器0实现50MS定时
EA=1;//开总中断
ET0=1;//开定时器0中
TR0=1; //定时器0开始计数
}
/*******延时函数***************/
void delay(uchar xms)
{
char x,y;
for(x=xms;x>0;x--)
for(y=110;y>0;y--);
}
/************显示函数***********/
void display(uchar hh,uchar mm,uchar ss)
{
uchar h1,h2,m1,m2,s1,s2;//两位分别对应时间的十位个位
h1=hh/10;//时的十位
h2=hh%10;//时的个位
m1=mm/10;//分的十位
m2=mm%10;//分的个位
s1=ss/10;//秒的十位
s2=ss%10;//秒的个位
P0=0xff; //消隐
wei=1;
P0=table1[0];//第1个数码管选中
wei=0;
duan=1;
P0=table2[h1];
duan=0;
delay(1);
P0=0xff; //消隐
wei=1;
P0=table1[1];//第2个数码管选中
wei=0;
duan=1;
P0=table2[h2]+0x80;
duan=0;
delay(1);
P0=0xff; //消隐
wei=1;
P0=table1[2];//第个数码管选中
wei=0;
duan=1;
P0=table2[m1];
duan=0;
delay(1);
P0=0xff; //消隐
wei=1;
P0=table1[3];//第个数码管选中
wei=0;
duan=1;
P0=table2[m2]+0x80;
duan=0;
delay(1);
P0=0xff; //消隐
wei=1;
P0=table1[4];//第个数码管选中
wei=0;
duan=1;
P0=table2[s1];
duan=0;
delay(1);
P0=0xff;//消隐
wei=1;
P0=table1[5];//第二个数码管选中
wei=0;
duan=1;
P0=table2[s2];
duan=0;
delay(1);
}
/******定时器0中断函数*********/
void t0() interrupt 1 //定时器0中断级别为1
{
TH0=(65536-46080)/256;//数据重载
TL0=(65536-46080)%256;
count++;
if(count==20)
{
count=0;
second++;
if(second==60)
{
second=0;
minute++;
if(minute==60)
{
minute=0;
hour++;
if(hour==24)
{
hour=0;
}
}
}
}
}
/**************按键函数************/
keyscan()
{
if(keycon==0)
{
delay(10);
if(keycon==0)
{
while(!keycon);
TR0=~TR0;//按键启动和停止计数器TO
}
}
if(keyfun==0)
{
delay(10);
if(keyfun==0)
{
while(!keyfun);
keynum++;
if(keynum==4)
{
keynum=0;
//TR0=1;
}
}
}
if(keyadd==0) //+键检测
{
delay(10);
if(keyadd==0)
{
while(!keyadd);
switch(keynum)
{
case 1:
hour++;
if(hour==24)
{hour=0;}
// display(hour,minute,second);
break;
case 2:
minute++;
if(minute==60)
{minute=0;}
// display(hour,minute,second);
break;
case 3:
second++;
if(second==60)
{second=0;}
//display(hour,minute,second);
break;
}
}
}
if(keysub==0) //-键检测
{
delay(10);
if(keysub==0)
{
while(!keysub);
switch(keynum)
{
case 1:
hour--;
if(hour==-1)
{hour=23;}
// display(hour,minute,second);
break;
case 2:
minute--;
if(minute==-1)
{minute=59;}
// display(hour,minute,second);
break;
case 3:
second--;
if(second==-1)
{second=0;}
//display(hour,minute,second);
break;
}
}
}
}
void main()
{
init();
while(1)
{
keyscan();
display(hour,minute,second);
}
}