在上一講代碼基礎(chǔ)上,根據(jù)常識,變量沒有到達10時,數(shù)碼管1和數(shù)碼管2應(yīng)該是不需要點亮的,也就是高位不顯示0。
1.代碼參考
筆者參考了宋老師的代碼,他的做法就是額外開辟出一個數(shù)組用來做緩存,P0去取這個數(shù)組里的值即可,初始化的時候如下
unsigned char LedBuff[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
然后各塊內(nèi)存用來存放對應(yīng)的數(shù)碼管顯示的狀態(tài)值,比如像上一講的代碼,我們這樣存放好:
LedBuff[0]= LedChar[Second%10];
LedBuff[1]= LedChar[(Second/10)%10];
LedBuff[2]= LedChar[(Second/100)%10];
到時賦給P0的值就是LedBuff[0],LedBuff[1],LedBuff[2]。像一開始LedBuff[1]和LedBuff[2]的值都是0xFF, Second沒到10時,
不執(zhí)行“LedBuff[1]= LedChar[(Second/10)%10]; ”,即使數(shù)碼管1已在允許被點亮狀態(tài),
但是由于“P0= LedBuff[1];(也就是P0= 0xFF;)”導致所有段的燈都無法點亮也就不顯示內(nèi)容了。
當然用額外的數(shù)組存放數(shù)碼管狀態(tài)值還有另一個好處,當我們學到后面的計分功能要這樣顯示時
中間要顯示非數(shù)字或字母時,給LedBuff[2]和LedBuff[3]提前賦值0xBF只點亮一段燈就在中間顯示一杠了。
現(xiàn)在我們實現(xiàn)上一講的功能但高位不顯示0。
2.代碼實現(xiàn)
#include <reg52.h> sbit ADDR2 = P1^2; sbit ADDR1 = P1^1; sbit ADDR0 = P1^0; sbit ENLED = P1^4; sbit ADDR3 = P1^3; unsigned char code LedChar[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};//數(shù)碼管狀態(tài)值初始化 unsigned char LedBuff[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};//數(shù)碼管顯示緩存區(qū) void main() { unsigned int i=0,x; unsigned char Second=0;//定義一個一秒之后自增1的變量 ADDR3 = 1;//使能三八譯碼器 ENLED = 0;// while(1) { LedBuff[0]=LedChar[Second%10]; if(Second>=10)LedBuff[1]= LedChar[(Second/10)%10]; //Second沒到達10之前不更新LedBuff[1]的初始值 if(Second>=100)LedBuff[2]= LedChar[(Second/100)%10];//Second沒到達100之前不更新LedBuff[2]的初始值 if(Second==0){ LedBuff[1]=0xFF;LedBuff[2]=0XFF; } //Second到達255之后再加1就溢出變?yōu)?了,這時候要再次熄滅這兩個數(shù)碼管 for(x=0;x<32765;x++)//循環(huán)持續(xù)一定的時間 { P0=0xFF;//端口狀態(tài)全部熄滅數(shù)碼管里的LED達到刷新作用 switch(i) { case 0: ADDR2 = 0;ADDR1 = 0;ADDR0 = 0;P0=LedBuff[0];i++;break; case 1: ADDR2 = 0;ADDR1 = 0;ADDR0 = 1;P0=LedBuff[1];i++;break; case 2: ADDR2 = 0;ADDR1 = 1;ADDR0 = 0;P0=LedBuff[2];i=0;break; } } Second++;//持續(xù)一定的時間之后變量自加1 } }
筆者在修改for循環(huán)的x值時,軟件調(diào)試發(fā)現(xiàn)無法使Second準確地間隔1秒后自加,這里大家不用太糾結(jié)Second能否均勻的1秒后自加1,而是學會了本節(jié)想表達的知識點,后面我們也不會用到for循環(huán)來實現(xiàn)讓三八譯碼器間隔導通不同的三極管了,到時學會定時器知識內(nèi)容即可完美實現(xiàn)這方面的功能,筆者也是考慮到大家剛?cè)腴T需要多點基礎(chǔ)的例程代碼來熟悉單片機編程,所以才不會跨度太大地教大家新知識。
C語言網(wǎng)提供由在職研發(fā)工程師或ACM藍橋杯競賽優(yōu)秀選手錄制的視頻教程,并配有習題和答疑,點擊了解:
一點編程也不會寫的:零基礎(chǔ)C語言學練課程
解決困擾你多年的C語言疑難雜癥特性的C語言進階課程
從零到寫出一個爬蟲的Python編程課程
只會語法寫不出代碼?手把手帶你寫100個編程真題的編程百練課程
信息學奧賽或C++選手的 必學C++課程
藍橋杯ACM、信息學奧賽的必學課程:算法競賽課入門課程
手把手講解近五年真題的藍橋杯輔導課程