![]() |
發布時間: 2018-12-19 14:22
正文摘要:設計倒計時程序,要求按1,10秒倒計時,按2,20秒倒計時。我寫了倒計時程序但鍵盤加不進去。求大神解答,可酬金答謝 說明:P0段選,P2位選。共陽極數碼管 #include<reg52.h> unsigned char s ... |
以解決,感興趣的可以看看 #include<reg51.h> unsigned char shi=0,ge=0,num1,num2,a; unsigned int x,y,z; unsigned char code table[]= {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; void display(shi,ge); unsigned char key() //鍵盤 { unsigned char row=0,col=0,k; unsigned int t; P3=0x0F; if(P3==0x0F) return k; t=20000;while(t--); if(P3==0x0F) return k; for(row=0;row<4;row++) { P3=~(0x80>>row); k=P3&0x0F; if(k!=0x0F) { while(k&(0x08>>col)) col++; k=15-(row*4+col); return k; } } } void delay(x) //延時 { for(y=x;y>0;y--) for(z=110;z>0;z--); } void display(shi,ge) //段選位選控制函數 { P0=table[shi]; P2=0x7f; delay(5); P0=table[ge]; P2=0xbf; delay(5); } main() //主函數 { TMOD=0x01; EA=1;ET0=1;TR0=1; P0=0xc0; P2=0x3f; a=key(); if(a==1) num1=11; if(a==2) num1=21; if(a==3) num1=31; if(a==4) num1=41; if(a==5) num1=51; if(a==6) num1=61; if(a==1||a==2||a==3||a==4||a==5||a==6) {while(1) { display(shi,ge); if(num2==20) { num2=0; num1--; if(num1==0) return; if(key()==0) return; shi=num1/10; ge=num1%10; } } } } void time1() interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; num2++; } |
wsxujn 發表于 2018-12-19 22:52 謝大佬啊,點醒了我,有點效果了,我在小改一下。 |
給你改用5ms查詢方法完成動態數碼管顯示和倒計時,用開發板的矩陣鍵盤P3.7模擬地可以成為4個獨立按鍵。 #include<reg52.h> sbit key1=P3^0; sbit key2=P3^1; //sbit key3=P3^2; //sbit key4=P3^3; sbit GND=P3^7;//開發板矩陣鍵盤模擬地 unsigned char shi,ge,num1=0,num2=0;//a; //unsigned int x,y,z; unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //unsigned char code shu[]={0,10,20,30}; //void delay(x); //void shuhanshu(a); //void display(); void key() { static bit key1_sign,key2_sign; //靜態-按鍵自鎖標志 static unsigned char count1,count2;//靜態-消抖計數變量 if(!key1) //按鍵1按下 { // 10ms消抖 自鎖長按無效 倒計時中鎖定按鍵無效 if((++count1>=2)&&(key1_sign==0)&&(num1==0)) { key1_sign=1; //按鍵1自鎖標志置1 num1=10; //倒計時變量賦值 num2=0; //計時變量清0 } } else //按鍵1抬起 { key1_sign=0; //按鍵1自鎖標志清0 count1=0; //消抖計數1清0 } if(!key2) //按鍵2按下 { if((++count2>=2)&&(key2_sign==0)&&(num1==0)) { key2_sign=1; //按鍵2自鎖標志置1 num1=20; num2=0; } } else //按鍵2抬起 { key2_sign=0; //按鍵2自鎖標志清0 count2=0; //消抖計數2清0 } } /* void delay(x) { for(y=x;y>0;y--) for(z=110;z>0;z--); } */ void display() { static bit i=0; shi=num1/10; ge=num1%10; P0=0xff;//消隱 if(i==0) { P0=table[shi]; P2=0x7f; i=~i; } else { P0=table[ge]; P2=0xbf; i=~i; } } void main() { // key(); // a=key(); // num1=shu[a]; TMOD=0x01; TH0=(65536-5000)/256;//5ms TL0=(65536-5000)%256; EA=1; ET0=1; TR0=1; GND=0; while(1) { if(TF0==1)//查詢定時器中斷溢出標志 { TF0=0; key(); num2++; if(num2==200)//1秒 { num2=0; if(num1>0) num1--; } display(); } } } void time1() interrupt 1 { TH0=(65536-5000)/256; TL0=(65536-5000)%256; } |
把按鍵程序放到 while 里啊 |
求大神幫忙啊 |