1.題目
為了更好地體現(xiàn)上一講優(yōu)化好的不支持連按代碼的優(yōu)勢,我們來一道題目:用上7盞燈,左邊6盞不停地流水,最右邊1盞實現(xiàn)按鍵切換燈的打開和關(guān)閉,且按鍵動作不能干擾到流水燈的流速狀態(tài)。
實驗現(xiàn)象狀態(tài)模擬如下
11111011//按鍵沒按下 11110111//按鍵沒按下 11101110//按鍵按下后抬起 11011110//按鍵沒按下 10111111//按鍵按下后抬起 01111111//按鍵沒按下 11111011//按鍵沒按下 ......
2.升華
在書寫代碼之前,我們來思考一下如何做到簡化,如果按照以前的思路就是sbit的一個一個位地定義,這樣的話就可以避免影響到LED2,因為LED2要實現(xiàn)自由,僅允許讓按鍵來控制它的亮滅而已。
如果像之前用“P0=~(0x04<<i)”的方式確實可以實現(xiàn)流水燈,但是P0明顯會強(qiáng)制的把P0.0輸出高電平,這樣的話LED2就被強(qiáng)制熄滅了。不過沒關(guān)系,我們再次利用C語言知識就可以解決問題了。
首先要了解到“0xFE|0x00”還是等于0xFE,“0xFE|0x01”就等于0xFF了。
我們也知道LED2要么是等于0,要么是等于1的。當(dāng)然也可以這么說:LED2要么是等于0x00,要么是等于0x01。十進(jìn)制和十六進(jìn)制表示的都是確定的數(shù),只是書寫方法不一樣而已,比如我們都知道“P0=0xFF;”是熄滅8盞燈的作用,
但是我們也可以這樣寫“P0=255;”,因為0xFF和255都是一個確定的數(shù),只不過用0xFF更能讓人快速反應(yīng)出這個值用二進(jìn)制表示會立馬呈現(xiàn)出8個IO端口的輸出狀況。
所以我們只要這樣表示“0xFE|LED2”,那這個表達(dá)式要么是等于0xFE要么是等于0xFF。
我們接著再了解,“(~0x04)&0xFF”還是等于(~0x04),用二進(jìn)制表示為11111011,賦給P0就是只有LED4亮。
而“(~0x04)&0xFE”等于0xFA, 用二進(jìn)制表示11111010,賦給P0就是只有LED2和LED4亮。
于是這么寫“P0=~(0x04)&(0xFE|LED2);”的時候,LED2等于0時,就是LED2和LED4亮;LED2等于1時,只有LED4亮而已。
要想實現(xiàn)六盞燈流水則“P0=~(0x04<<i)&(0xFE|LED2);”i在0和5之間變化即可,這個表達(dá)式的意思就是,高6位的燈隨便流水,但是LED2卻是自由獨立的,它等于0或者1都不影響高6位。這樣我們用按鍵控制“LED2=! LED2”,于是LED2就可以獨立顯示了。
本講的代碼我們在下一講貼出,目的是為了比較當(dāng)使用“while(KEY4==0);”的方式時是有多拙劣。
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)課程