#include <reg52.h>
sbit BUZZER=P3^7;
unsigned char second=0,count=0; //設置初值
unsigned char seg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//LED段碼表
bit RunFlag=0;
unsigned char KeyScan();
void delay(void);
void main(void)
{
unsigned char KeyValue;
TMOD=0x1; //設置T0為定時器模式
TH0=0x3c; //設置T0為50ms定時長度
TL0=0xb0;
PT0=0;
TR0=1; //啟動T0
ET0=1; //T0中斷允許
EA=1; //CPU中斷允許
while(1)
{
P0=seg[second/10]; //顯示十位秒值
P2=seg[second%10]; //顯示個位秒值
KeyValue=KeyScan();
switch (KeyValue)
{
case 0:
second=0;
break;
case 1:
second++;
break;
case 2:
second--;
break;
case 3:
RunFlag=~RunFlag;
break;
default:
break;
}
}
}
unsigned char KeyScan()
{
unsigned char i,j,key=0x10;
P1=0xf0; //Yi=0;
if ((P1 & 0xf0)!= 0xf0) //有鍵按下?
{
delay(); //去抖動
for (i=0;i<4;i++) //共掃描四行
{
P1=(0xf0 | (~(0x01<<i)));
if ((P1 & 0xf0)!=0xf0) //本行有鍵按下?
{
for (j=0;j<4;j++)
{
if ((P1>>j & 0x10)==0x0) //找到按鍵
{
key=i*4+j;
break;
}
}
}
}
P1=0xf0;
while ((P1 & 0xf0)!= 0xf0); //等待鍵抬起
delay(); //去抖動
}
return key;
}
void delay(void)
{
unsigned char i,j;
for (i=0;i<100;i++)
for (j=0;j<100;j++);
}
void T0_INT() interrupt 1 using 1 //定時器T0 50ms 中斷
{
TH0=0x3c; //重置初值
TL0=0xb0;
if (RunFlag==0)
return;
count++; //計數增量
if (count==20) //是否已到1s
{
count=0; //清除計數值
second++; //秒增量
if (second>=60)
second=0;
if (second%5==0)
BUZZER=0;
else
BUZZER=1;
}
}
|