1.同時點亮猜想
在本章第一節(jié)里說過要想點亮數(shù)碼管,那么我們第一章學過的LED小燈就沒有機會點亮了,硬件上的確是這樣。
不過我們軟件上還是可以實現(xiàn)讓一個數(shù)碼管和一盞LED小燈同時點亮的,大家還記得我們之前舉過一個這樣的例子嗎?
#include <reg52.h> sbit LED2 = P0^0; sbit ADDR2 = P1^2; sbit ADDR1 = P1^1; sbit ADDR0 = P1^0; sbit ENLED = P1^4; sbit ADDR3 = P1^3; void main() { ADDR3 = 1;//使能三八譯碼器 ENLED = 0;// ADDR2 = 1;//************************** ADDR1 = 1;//讓三八譯碼器的IO6輸出低電平 ADDR0 = 0;//************************** while (1) { LED2=0;//點亮最右端的燈 LED2=1;//熄滅最右端的燈 } }
這個程序在硬件上的確是讓LED2熄滅過,但是時間太短了,只持續(xù)了0.00000108秒,所以開發(fā)板上的實驗現(xiàn)象看到的是LED2一直常亮。
那么我們借此思考,三八譯碼器的IO6和IO0輪流輸出低電平就可以實現(xiàn)我們的要求了,不過這個輪流切換時間要快,所以在死循環(huán)里我們都不加延時了。
2.代碼分析
我們定義一個變量i,作為每次循環(huán)只執(zhí)行要么是點亮數(shù)碼管要么是點亮LED2的輪流切換功能。
還有我們需在循環(huán)的結尾加入“P0=0xFF;”熄滅所有的發(fā)光二極管,這是用來刷新8個IO端口的,不然有些IO端口的電平會遺留著沒有改變,本來我們只需要LED2被點亮,P0端口沒刷新會造成其他的LED小燈都被點亮。
比如我們只需要P0.0輸出0而其他IO端口需要輸出1這樣只點亮LED2,但數(shù)碼管顯示數(shù)字時卻是要有幾個IO端口需要輸出0的(數(shù)碼管和小燈都用到了P0),所以防止數(shù)碼管顯示之后的IO端口狀態(tài)遺留給LED小燈,所以每次循環(huán)到結尾時需要全部熄滅。
這個熄滅同樣持續(xù)也只是一瞬間而已,但是IO端口狀態(tài)卻改變?yōu)槿?了。
3.代碼
#include <reg52.h> sbit LED2 = P0^0; sbit ADDR2 = P1^2; sbit ADDR1 = P1^1; sbit ADDR0 = P1^0; sbit ENLED = P1^4; sbit ADDR3 = P1^3; void main() { unsigned char i;//用來作為輪流切換語句功能的變量 ADDR3 = 1;//使能三八譯碼器 ENLED = 0;// while(1) { if(i==1){ADDR2 = 0;ADDR1 = 0;ADDR0 = 0;P0=0xC0;}//讓IO0輸出低電平,數(shù)碼管顯示數(shù)字0 else{ADDR2 = 1;ADDR1 = 1;ADDR0 = 0;LED2=0;} //讓IO6輸出低電平,點亮LED2 i++; if(i>=2)i=0;//讓i只能在0~1之間變化 P0=0xFF; //因為8個LED小燈與數(shù)碼管里的8段LED都是用P0的8個IO端口控制,所以需要全部熄滅來重新刷新顯示 } }
這里大家可以嘗試把“P0=0xFF”注釋掉下載進開發(fā)板看看是什么現(xiàn)象,通過現(xiàn)象自己分析產生這樣現(xiàn)象的原因。
如果把“P0=0xFF”刪除后加入2ms的延時呢,會有什么現(xiàn)象?
C語言網(wǎng)提供由在職研發(fā)工程師或ACM藍橋杯競賽優(yōu)秀選手錄制的視頻教程,并配有習題和答疑,點擊了解:
一點編程也不會寫的:零基礎C語言學練課程
解決困擾你多年的C語言疑難雜癥特性的C語言進階課程
從零到寫出一個爬蟲的Python編程課程
只會語法寫不出代碼?手把手帶你寫100個編程真題的編程百練課程
信息學奧賽或C++選手的 必學C++課程
藍橋杯ACM、信息學奧賽的必學課程:算法競賽課入門課程
手把手講解近五年真題的藍橋杯輔導課程