欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
非中斷編寫的一鍵即時流水燈
[打印本頁]
作者:
hutians
時間:
2015-2-10 17:44
標題:
非中斷編寫的一鍵即時流水燈
/*******************************************************************************************************
即時一鍵流水燈(89C52,程序優化)
在老師出的一道簡單的題中,卻出現了程序上的一些小毛病。看似小的毛病實則在大程序
中產生不可估量的后果,如下是對延時中出現的問題的解決辦法:
一鍵流水燈要求即時響應,按下鍵盤立即響應,沒有延時!在我修改之前的里,延時函數
中沒有按鍵檢測,從而導致了在按下按鍵后不能即時響應(需要等到延時完成之后才能響應)。
另外由于疏忽在key0()函數中漏掉了松手檢測,導致了一次按鍵多次選擇。更改后的程序由于
在延時中增加了鍵盤檢測,所以只要有鍵按下,即使延時函數正在運行也會立即跳出。
鍵:key~P3^0 P2用于控制流水燈
心得:在寫程序時要有嚴密的思維,在完成某個程序后要適當給程序一些優化,盡量使程
序更為精簡。更重要的是要細心發現程序中一些不可見的弊端,這樣可以降低程序出錯的機率。
寫程序時要養成好的習慣,使寫出的程序看起來言簡意賅,不容易遺漏!
********************************************************************************************************/
#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; //從數組的第0個單元開始
case 2: flag = 8; break; //從數組的第8個單元開始
case 3: flag = 16; break; //從數組的第16個單元開始
}
}
void key0() //鍵盤掃描
{
if(key==0)
{
delay(10);
if(key==0)
{
count++; //若鍵盤有值則加1
if(count==4) count = 0;
mode_1();
i = 7; //用于跳出循環
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();
}
}
}
復制代碼
作者:
51gxl
時間:
2017-11-23 10:00
不錯的思路,延時程序里加檢測。
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1