|
- /*******************************************************************************************************
- 即時一鍵流水燈(89C52,程序優(yōu)化)
- 在老師出的一道簡單的題中,卻出現(xiàn)了程序上的一些小毛病?此菩〉拿崉t在大程序
- 中產(chǎn)生不可估量的后果,如下是對延時中出現(xiàn)的問題的解決辦法:
- 一鍵流水燈要求即時響應(yīng),按下鍵盤立即響應(yīng),沒有延時!在我修改之前的里,延時函數(shù)
- 中沒有按鍵檢測,從而導(dǎo)致了在按下按鍵后不能即時響應(yīng)(需要等到延時完成之后才能響應(yīng))。
- 另外由于疏忽在key0()函數(shù)中漏掉了松手檢測,導(dǎo)致了一次按鍵多次選擇。更改后的程序由于
- 在延時中增加了鍵盤檢測,所以只要有鍵按下,即使延時函數(shù)正在運行也會立即跳出。
- 鍵:key~P3^0 P2用于控制流水燈
- 心得:在寫程序時要有嚴(yán)密的思維,在完成某個程序后要適當(dāng)給程序一些優(yōu)化,盡量使程
- 序更為精簡。更重要的是要細(xì)心發(fā)現(xiàn)程序中一些不可見的弊端,這樣可以降低程序出錯的機率。
- 寫程序時要養(yǎng)成好的習(xí)慣,使寫出的程序看起來言簡意賅,不容易遺漏!
- ********************************************************************************************************/
- #include"reg52.h"
- sbit key = P3^0;
- typedef unsigned int uint;
- char i,count=0,flag;
- char code tab[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,
- 0x03,0x06,0x0c,0x18,0x30,0x60,0xc0,0x80,
- 0x07,0x0e,0x1c,0x38,0x70,0xe0,0xc0,0x80
- };
- int delay(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- {
- for(y=120;y>0;y--);
- if(key==0) return 0;
- }
- return 0;
- }
- void mode_1()
- {
- switch(count)
- {
- case 0: flag = 25; break; //不顯示
- case 1: flag = 0; break; //從數(shù)組的第0個單元開始
- case 2: flag = 8; break; //從數(shù)組的第8個單元開始
- case 3: flag = 16; break; //從數(shù)組的第16個單元開始
- }
- }
- void key0() //鍵盤掃描
- {
- if(key==0)
- {
- delay(10);
- if(key==0)
- {
- count++; //若鍵盤有值則加1
- if(count==4) count = 0;
- mode_1();
- i = 7; //用于跳出循環(huán)
- while(!key); //松手檢測
- }
- }
- }
- void main()
- {
- char temp;
- flag = 25;
- while(1)
- {
- temp = flag;
- for(i=0;i<8;i++)
- {
- if(flag==25) P2 = 0x00;
- else
- P2 = tab[temp++];
- delay(300);
- key0();
- }
- }
- }
復(fù)制代碼
|
評分
-
查看全部評分
|