按key1启动数码管从24开始倒计时,key2暂停计数,再按一下继续倒计时,当只剩最后5秒时,数码管显示的数字闪烁。按一下key3后,如果再按一下key4,数码管个位数加一;连续按两下key3,再按一下key4,个位数减一;连续按三下key3,再按一下key4十位数加一;连续按四下key3,再按一下key4十位数减一
/*P0控制数码管,P3控制矩阵键盘,P2^5控制蜂鸣器,P2^7,6控制段位*/
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code num[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e
}; //共阳数码管数字显示
uchar temp,m,n,shi,ge,i,shu,flag=1,y;
uint n1,x,d;
sbit voice=P2^5;
sbit wei=P2^7;
sbit duan=P2^6;
void delay(uint a) //a毫秒(ms)延时函数(大约)
{
uint i,j;
for(i=a;i>0;i--)
for(j=110;j>0;j--)
;
}
void show() //显示数码管,no problem
{
shi=shu/10;
ge=shu%10;
P0=num[shi]; //显示"十位"数字
duan=1;
duan=0;
P0=0x80; //在第一位显示
wei=1;
wei=0;
delay(1);
P0=num[ge]; //显示"个位"数字
duan=1;
duan=0;
P0=0x40;//在第二位显示
wei=1;
wei=0;
delay(1);
}
void main()
{
while(1)
{
P3=0xfe;//初始赋值,控制矩阵第4行
temp=P3; //检测键盘按下
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(5);//延迟5ms
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
switch(temp)
{
case 0x7e:TMOD=0x11;//定时器初始设置
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
TH1=(65536-45872)/256;
TL1=(65536-45872)%256;
EA=1;
ET0=1;
ET1=1;
TR0=1;//启动定时器0
TR1=0;
n=0;
shu=24;
break;
case 0xbe: n1++;//根据n1的奇偶性,开关闭定时器0,使数码管上数字停止
m=n1/2;
if(m==1)//取整为奇时关定时器
TR0=0;
else
TR0=1;
break;
case 0xde: P3=0xfe;
TR1=1; //打开定时器1
while(flag)//标记变量
{
temp=P3;
delay(5);
if(temp==0xee)//寄存key4按键次数
x++;
while(temp!=0xee)
;
if(d==40)//到40时为2s,即等待key4连击的时间
{
flag=0;//停止x的累加
TR1=0;
}
}
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
if(x==1)
shu++;
if(x==2)
shu--;
if(x==3)
y=shu/10,shu=(++y)*10+shu%10;//shu=(++(shu/10))*10+(shu%10);//十位数字加加,即加10
if(x==4)
y=shu/10,shu=(--y)*10+shu%10;
flag=1;
if((shi==0)&&(ge<=5)&&(ge>0))//最后5s时闪烁
{
delay(400);
show();
}
else
show();
if((shi==0)&&(ge==0))//关闭定时器0,不再计时,同时蜂鸣器响
{
TR0=0;
}
}
}
void TO_time() interrupt 1
{
TH0=(65536-45872)/256; //溢满需50ms
TL0=(65536-45872)%256;
n++;
if(n==20)//每1s数码管数字减1
shu--;
}
void T1_time() interrupt 3 //用于等待接受key4的连击
{
TH1=(65536-45872)/256;
TL1=(65536-45872)%256;
d++;
}
一周热门 更多>