1.回顧
大家還記得我們用數(shù)組來存取流水燈的狀態(tài)值嗎,那么數(shù)碼管也是一樣的,我們可以知道數(shù)碼管能顯示出在單片機(jī)編程中最常見的數(shù)字和字母為0~9,A,b,C,d,E,F這16種狀態(tài),那么這一講我們實(shí)現(xiàn)單個數(shù)碼管從0到F間隔一秒來循環(huán)顯示。
2.單片機(jī)內(nèi)存
首先要知道我們寫的程序是占用內(nèi)存的,這些內(nèi)存就是單片機(jī)內(nèi)部的FLASH。STC89C52RC芯片中用來存放程序代碼的FLASH內(nèi)存為8K字節(jié)(8192字節(jié))。
而初始化的數(shù)組的內(nèi)存都是存放在單片機(jī)的RAM中的,我們平時定義的變量也都是占用RAM的,因?yàn)槎x的變量數(shù)值是要改變的,所以這些變量只能存放在RAM中。
但STC89C52RC芯片中RAM的內(nèi)存很小,只有512個字節(jié),且這些內(nèi)存相當(dāng)珍貴。而讓數(shù)碼管顯示的16種狀態(tài)值我們不用改變它的值,它們只起到賦值作用而已,所以為了不占用珍貴的RAM資源,我們把這16種狀態(tài)的值(也就是16個字節(jié))存放在FLASH中,因?yàn)镕LASH的內(nèi)存比較大。
可能對計算機(jī)基礎(chǔ)知識相對薄弱的同學(xué)來說,對上面的知識點(diǎn)比較模糊,這里筆者建議閱讀一下《手把手教你學(xué)51單片機(jī)》文檔2.1節(jié),10.4節(jié)。
3.code的用法
拿我們以前講的數(shù)組存放流水燈狀態(tài)值的初始化來說
unsigned char LEDSET[8]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};
如果把這8個字節(jié)的內(nèi)存放到FLASH中,只需加多code即可
unsigned char code LEDSET[8]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};
詳細(xì)了解請看文檔的5.3.3節(jié),6.1.1節(jié),6.1.4節(jié),12.3.1節(jié)。
4.真值表
共陽數(shù)碼管的0~9,A,b,C,d,E,F 這16種狀態(tài)值如下
0:0xC0 1:0xF9 2:0xA4 3:0xB0 4:0x99 5:0x92 6:0x82 7:0xF8 8:0x80 9:0x90 A:0x88 b:0x83 C:0xC6 d:0xA1 E:0x86 F:0x8E
數(shù)組初始化:
unsigned char code LedChar[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};//數(shù)碼管狀態(tài)值初始化
5.代碼
像這種加入code關(guān)鍵字來存放在FLASH中的代碼我們寫在最開始的函數(shù)外部。
實(shí)現(xiàn)數(shù)碼管從0到F間隔一秒循環(huá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)值初始化 void delay_ms(unsigned int x) { unsigned int i,j; if(x==1000) { for(i=0;i<19601;i++)//延時1s { for(j=5;j>0;j--); } } else while(x--)for(j=115;j>0;j--); } void main() { unsigned char i=0; ADDR3 = 1;//使能三八譯碼器 ENLED = 0;// ADDR2 = 0;//************************** ADDR1 = 0;//讓三八譯碼器的IO0輸出低電平 ADDR0 = 0;//************************** while(1) { P0=LedChar[i]; delay_ms(1000);//延時1s i++; if(i>=16)i=0; //讓i在0~15之間變化 } }
C語言網(wǎng)提供由在職研發(fā)工程師或ACM藍(lán)橋杯競賽優(yōu)秀選手錄制的視頻教程,并配有習(xí)題和答疑,點(diǎn)擊了解:
一點(diǎn)編程也不會寫的:零基礎(chǔ)C語言學(xué)練課程
解決困擾你多年的C語言疑難雜癥特性的C語言進(jìn)階課程
從零到寫出一個爬蟲的Python編程課程
只會語法寫不出代碼?手把手帶你寫100個編程真題的編程百練課程
信息學(xué)奧賽或C++選手的 必學(xué)C++課程
藍(lán)橋杯ACM、信息學(xué)奧賽的必學(xué)課程:算法競賽課入門課程
手把手講解近五年真題的藍(lán)橋杯輔導(dǎo)課程