//***************************************************//
//***数字钟:四个按键,8个数码显视***
//**************************************************//
#include <reg51.h>
#include <math.h>
#define unchar unsigned char
#define uint unsigned int
sbit KEY_1 =P3^2; // 将p3.2定义为KEY_1
sbit KEY_2 =P3^3; // 将p3.3定义为KEY_2
sbit KEY_3 =P3^6; // 将p3.6定义为KEY_3
sbit KEY_4 =P3^7; // 将p3.7定义为KEY_4
//sbit P1_1=P1^1;
//unchar keycnt="0"; //
char hour="0",min=0,sec=0; //时间清零
char disp[6]; //数码管数据缓冲区
//char ddata[4]; //存放原数据
//char ndata[4]; //存放新数据
unchar Tcnt;
unchar code seg7code[]={0x3F,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; //LED段码
void Delay(unsigned int tc) //延时程序
{
while( tc != 0 ) //如果tc为0则终止延时
{
unsigned int i; //局部正整数变量 i
for(i=0; i<100; i++); //执行400次将耗时1毫秒
tc--; //tc计数减一
}
}
//******************************************//
//^^^^^^^^^^^^^^^^^键盘扫描^^^^^^^^^^^^^^^^^//
//******************************************//
//按键扫描程序
//void keyscan();
/*{
unsigned char i,j;
while(1)
{
if(KEY_1==0)
{
for(i=20;i>0;i--)
for(j=248;j>0;j--);
if(KEY_1==0)
{
TR0=0;
keycnt++;
switch(keycnt) //按下次数判断
{
case 1: //第一次按下
ddata[1]=sec;
break;
case 2: //第二次按下
ddata[2]=min;
break;
case 3: //第三次按下
ddata[3]=hour;
break;
}
// }
//}
if(KEY_2==0)
{
for(i=20;i>0;i--)
for(j=248;j>0;j--);
if(KEY_2==0)
{
switch(keycnt)
{
case 1:sec=ddata[1]+1;
if(sec==60)
sec="0";break;
case 2:min=ddata[2]+1;
if(min==60)
min=0;
break;
case 3: hour="ddata"[3]+1;
if(hour==24)
hour="0";
break;
}
//}
//}
/* if(KEY_3==0)
{
for(i=20;i>0;i--)
for(j=248;j>0;j--);
if(KEY_2==0)
{
switch(m)
{
case 1:sec--;
if(sec==0)
sec="0";break;
case 2:min--;
if(min==0)
min=0;break;
case 3:hour--;
if(hour=0)
hour=0;break;
}
}
}*/
/* if(KEY_4==0)
{
for(i=20;i>0;i--)
for(j=248;j>0;j--);
if(KEY_2==0)
{
TR0=1;
return;
}
}
}
}
}
}}*/
conv()
{
if(sec==60)
{
min++;sec=0;
if(min==60)
{
hour++;min=0;
if(hour==24)
{
hour=0;
}
}
}
disp[0]=seg7code[hour/10];
disp[1]=seg7code[hour%10];
disp[2]=seg7code[min/10];
disp[3]=seg7code[min%10];
disp[4]=seg7code[sec/10];
disp[5]=seg7code[sec%10];
}
void main()
{
TMOD=0X01; //TIMER0工作在定时模式,工作方式为1
TL0=0XA0; //装入初值
TH0=0X15;
Tcnt=20; //计数初值为20
TR0=1; //启动定时器
ET0=1; //允许定时器中断
EA=1; //开总中断
//P3=0XFF;
while(1)
{
//keyscan();
conv(); //位显示子程序
P2=0X01; //显示秒个位
P0=disp[5];
Delay(4);
P2=0X02; //秒十位
P0=disp[4];
Delay(4);
P2=0X04;
P0=0X40; //分隔符
Delay(4);
P2=0X08;
P0=disp[3];
Delay(4);
P2=0X10; //分钟
P0=disp[2];
Delay(4);
P2=0X20;
P0=0X40;
Delay(4);
P2=0X40;
P0=disp[1];
Delay(4);
P2=0X80;
P0=disp[0];
Delay(4);
}
}
//******************************************//
//^^^^^^^^^^^^^^^^^键盘扫描^^^^^^^^^^^^^^^^^//
//******************************************//
//按键扫描程序
/*void keyscan()
{
unsigned char i,j;
P3=0XFF;
while(1)
{
if(KEY_1==0)
{
for(i=20;i>0;i--)
for(j=248;j>0;j--);
if(KEY_1==0)
{
//TR0=0;
keycnt++;
switch(keycnt) //按下次数判断
{
case 1: //第一次按下
ddata[1]=sec;
break;
case 2: //第二次按下
ddata[2]=min;
break;
case 3: //第三次按下
ddata[3]=hour;
break;
defaut
}
if(KEY_2==0)
{
for(i=20;i>0;i--)
for(j=248;j>0;j--);
if(KEY_2==0)
{
switch(keycnt)
{
case 1:sec=ddata[1]+1;
if(sec==60)
sec="0";break;
case 2:min=ddata[2]+1;
if(min==60)
min=0;
break;
case 3: hour="ddata"[3]+1;
if(hour==24)
hour="0";
break;
}
if(KEY_4==0)
{
for(i=20;i>0;i--)
for(j=248;j>0;j--);
if(KEY_2==0)
{
//TR0=1;
return;
}
}
}
}
}
}
}
}*/
文章评论(0条评论)
登录后参与讨论