1.延時函數(shù)退出舞臺
有了上一講的理論講解,代碼的實現(xiàn)就比較簡單了,實驗現(xiàn)象就是高6位的6盞燈不停流水,我們用K4按鍵控制LED2的亮滅,并且途中并沒有影響到6盞流水燈的運行。
我們知道以前流水燈是需要延時才能看得到流水現(xiàn)象的,那么現(xiàn)在再用延時函數(shù)的話,按鍵就沒有意義了。比如流水燈的跳變需要間隔50ms才看得出是一個燈一個燈的亮,如果在死循環(huán)里使用“delay_ms(50);”,那么不支持連按代碼里的times要加1都需要過了50ms才行,這樣顯然行不通,我們只能從流水燈的代碼去思考了。
其實一次死循環(huán)里不一定就要求燈實現(xiàn)跳變,可以等到過了很多次死循環(huán)再去執(zhí)行燈的跳變的,所以我們在死循環(huán)里讓變量x每次加1,死循環(huán)了3000次之后再執(zhí)行燈的跳變,這樣不就能實現(xiàn)間隔50ms左右燈才跳變了嗎,同時又不影響按鍵代碼的times,也就是一次死循環(huán)所花費的時間被大大縮短了,掃描按鍵IO端口的機(jī)會更多了。那么延時函數(shù)在我們寫一些高效率的代碼的時候就很少去使用了,畢竟這樣不僅影響執(zhí)行效率,還會使某些功能模塊失去作用。
2.流水燈代碼新書寫模式
#include <reg52.h> sbit ADDR2 = P1^2; sbit ADDR1 = P1^1; sbit ADDR0 = P1^0; sbit ENLED = P1^4; sbit ADDR3 = P1^3; sbit LED2 = P0^0; sbit KEY4 = P2^7; void main() { unsigned char key_up=1;//定義記錄按鍵狀態(tài)值的變量,初始值為1避免程序一開始就進(jìn)入了“if(key_up==0)” unsigned char i=0; unsigned int times=0; //用來記錄進(jìn)入過按鍵判斷語句的次數(shù) unsigned int x; //作為記錄死循環(huán)的次數(shù)以達(dá)到間隔切換燈的跳變 ADDR3 = 1;//使能三八譯碼器 ENLED = 0;// ADDR2 = 1;//************************** ADDR1 = 1;//讓三八譯碼器的IO6輸出低電平 ADDR0 = 0;//************************** P2 = 0xF7;//讓K4能具備有被拉低的條件先 while(1) { if(key_up==0) { times++; if(times>=1000&&KEY4==1) { times=0; LED2=!LED2; } } key_up=KEY4; //以下是流水燈任務(wù)部分 x++; if(x>=3000)//程序的運行已經(jīng)過去50ms左右了 { x=0; P0=~(0x04<<i)&(0xFE|LED2);//既不影響高6位,又可以使LED2隨意亮滅 i++; if(i>=6)i=0; } } }
還是不明白“P0=~(0x04<<i)&(0xFE|LED2);”的意思大家就一步步用二進(jìn)制地寫出當(dāng)i等于0時“~(0x04<<i)”是等于多少,得到的值再跟“(0xFE|LED2)”相與運算看看當(dāng)LED2為0或者1時,“~(0x04<<i)&(0xFE|LED2)”的最終值是多少。
然后當(dāng)i等于1時“~(0x04<<i)&(0xFE|LED2)”又是等于多少。
我們這個例程代碼是對比了用“while(KEY4==0);”的時候是多么的不足,這樣吧,我們把上面例程的這部分代碼
if(key_up==0) { times++; if(times>=1000&&KEY4==1) { times=0; LED2=!LED2; } } key_up=KEY4;
改為以前初步學(xué)習(xí)的代碼如下
if(KEY4==0) { delay_ms(10);//等待抖動過去 if(KEY4==0) //二次判斷 { LED2=!LED2; while(KEY4==0); } }
延時函數(shù)大家再自己找以前的代碼去添加,實驗現(xiàn)象就是按鍵動作影響了流水燈的流速,如果按著不放直接導(dǎo)致停止流水。
C語言網(wǎng)提供由在職研發(fā)工程師或ACM藍(lán)橋杯競賽優(yōu)秀選手錄制的視頻教程,并配有習(xí)題和答疑,點擊了解:
一點編程也不會寫的:零基礎(chǔ)C語言學(xué)練課程
解決困擾你多年的C語言疑難雜癥特性的C語言進(jìn)階課程
從零到寫出一個爬蟲的Python編程課程
只會語法寫不出代碼?手把手帶你寫100個編程真題的編程百練課程
信息學(xué)奧賽或C++選手的 必學(xué)C++課程
藍(lán)橋杯ACM、信息學(xué)奧賽的必學(xué)課程:算法競賽課入門課程
手把手講解近五年真題的藍(lán)橋杯輔導(dǎo)課程