1.數(shù)組運(yùn)用
實(shí)現(xiàn)上一節(jié)的功能其實(shí)還有更簡潔的方法去書寫,那就是引用數(shù)組,用數(shù)組存取燈的八種狀態(tài)值。定義含有8個元素的數(shù)組如下:
unsigned char LEDSET[8]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};每個元素輪流賦值給P0后延時即可。
#include <reg52.h> //sbit LED2 = P0^0; 本節(jié)代碼中用不到這條語句了 sbit ADDR2 = P1^2; sbit ADDR1 = P1^1; sbit ADDR0 = P1^0; sbit ENLED = P1^4; sbit ADDR3 = P1^3; 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; unsigned char LEDSET[8]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F}; ADDR3 = 1;//使能三八譯碼器 ENLED = 0;// ADDR2 = 1;//************************** ADDR1 = 1;//讓三八譯碼器的IO6輸出低電平 ADDR0 = 0;//************************** while(1) { P0=LEDSET[i]; i++; if(i>=8)i=0;//i需歸0使P0只能使用數(shù)組中的8個元素,防止使用到超出數(shù)組元素以外的值,其實(shí)就是讓i在0~7之間變化 delay_ms(100); } }
2.移位運(yùn)用
如果只是簡單地實(shí)現(xiàn)上處代碼單一的流水燈,那大可不必用數(shù)組,也不需要算出0xFE,0xFD這樣的這些值,我們運(yùn)用移位知識也可以實(shí)現(xiàn)上處功能,修改主函數(shù)如下
void main() { unsigned char i = 0; ADDR3 = 1;//使能三八譯碼器 ENLED = 0;// ADDR2 = 1;//************************** ADDR1 = 1;//讓三八譯碼器的IO6輸出低電平 ADDR0 = 0;//************************** while(1) { P0=~(0x01<<i);//第一次運(yùn)行這條語句i是等于0的,先算出括號中的值:0x01左移0位還是0x01,算出了括號中的值再去取反就得0xFE, //所以第一次運(yùn)行這條語句時就相當(dāng)于“P0=0xFE;”,第二次循環(huán)運(yùn)行時i已經(jīng)等于1,0x01左移1位就為0x02,取反得0xFD,所以第二次執(zhí)行這條語句是“P0=0xFD;” i++; if(i>=8)i=0; delay_ms(100); } }
如果讀者對左移右移和取反等C語言知識尚未掌握,建議您上網(wǎng)學(xué)習(xí)基礎(chǔ)教學(xué),又或者參考《手把手教你學(xué)51單片機(jī)》文檔4.8節(jié)。
3.數(shù)組的好處
當(dāng)我們想實(shí)現(xiàn)花式流水燈時還是需要運(yùn)用到數(shù)組的,畢竟數(shù)組可以修改LED的狀態(tài)值,例如我們想實(shí)現(xiàn)這樣的一個花式流水燈:
01111110 //對應(yīng)十六進(jìn)制=0x7E
10111101 //對應(yīng)十六進(jìn)制=0xBD
11011011 //對應(yīng)十六進(jìn)制=0xDB
11100111 //對應(yīng)十六進(jìn)制=0xE7
11011011 //對應(yīng)十六進(jìn)制=0xDB
10111101 //對應(yīng)十六進(jìn)制=0xBD
01111110
10111101
......
修改主函數(shù)
void main() { unsigned char i = 0; unsigned char LEDSET[6]={0x7E,0xBD,0xDB,0xE7,0xDB,0xBD}; ADDR3 = 1;//使能三八譯碼器 ENLED = 0;// ADDR2 = 1;//************************** ADDR1 = 1;//讓三八譯碼器的IO6輸出低電平 ADDR0 = 0;//************************** while(1) { P0=LEDSET[i]; i++; if(i>=6)i=0; //讓i在0~5之間變化 delay_ms(100); } }
其他花樣玩法大家可自行編寫數(shù)組里的狀態(tài)值,這次的花樣流水燈我們只用了6種狀態(tài)不停循環(huán),大家編新的花樣狀態(tài)超過6種時記得修改LEDSET[6]里的6和“if(i>=6)i=0;”里的6為你所設(shè)置的花樣狀態(tài)種數(shù)。
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)課程