unsigned int i; i=500; while(i--); }
int keyscan()//键盘扫描 {
unsigned char read,recode,keyvalue; P2=0xf0; read=P2; if(read!=0xf0) { delay(); if(read!=0xf0) { P2=0x0f; recode=P2;
keyvalue=read+recode; return keyvalue; } } return 0; }
void display()//显示 { unsigned
char code Table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //数码管断码表 switch(num) {
case 0:{x=0;y=0;break;} case 1:{x=1;y=0;break;}
- 15 -
case 2:{x=2;y=0;break;} case 3:{x=3;y=0;break;} case 4:{x=4;y=0;break;} case 5:{x=5;y=0;break;} case 6:{x=6;y=0;break;} case 7:{x=7;y=0;break;} case 8:{x=8;y=0;break;} case 9:{x=9;y=0;break;} case 10:{x=0;y=1;break;} } p3_4=0; p3_5=0; P0=Table[x]; p3_4=0; p3_5=1; delay(); p3_4=0; p3_5=0; P0=Table[y]; p3_4=1; p3_5=0; delay(); }
unsigned char decode() //解码按键 {
switch(key) {
case 0xb7:return 1; case 0xbb:return 2; case 0xbd:return 3; case 0xbe:return 4;
- 16 -
case 0xd7:return 5; case 0xdb:return 6; case 0xdd:return 7; case 0xde:return 8; } return 0; }
void main() { while(1) {
while(start==0)//P3.0自锁开关按下,程序跳出循环,开始初始化中断{ num=10; P1=LED_T[9]; display(); if(p3_0==0) start=1; } EA=1; TMOD=0x01; TH0=0xd8; TL0=0xf0; ET0=1; TR0=1; count=100; num=9;
while(flag==0&&p3_0==0)//flag=0且P3.0按下时执行此循环 {
if(flagl==1) //若中断里检测到按键,P1口对应LED亮起
- 17 -
P1=LED_T[num-1]; display(); } start=0; flag=0; flagl=0; } }
void timer_1(void) interrupt 1 { TH0=0xD8; TL0=0xf0;
if(p3_0==1) //中断途中抬起P3.0自锁开关,关中断 { TR0=0; flag=0; }
key=keyscan();//检测到按键,解码按键至对应case,并且显示对应数字,关中断,防止再次进入中断,保证锁住状态 if(key!=0) {
num=decode(); display(); TR0=0; flag=0; flagl=1; }
count--; //10秒倒计时 if(count==0) {
- 18 -
num--; if(num==0) { TR0=0; flag=0; }
count=100; } }
- 19 -