基于51單片機學習闆。用S1鍵作為控制跑馬燈的方向按鍵,S5鍵作為控制跑馬燈方向的加速度按鍵,S9鍵作為控制跑馬燈方向的減速度按鍵,S13鍵作為控制跑馬燈方向的啟動或者暫停按鍵。
51單片機數位管顯示跑馬燈程式源代碼講解
基于51單片機學習闆。用S1鍵作為控制跑馬燈的方向按鍵,S5鍵作為控制跑馬燈方向的加速度按鍵,S9鍵作為控制跑馬燈方向的減速度按鍵,S13鍵作為控制跑馬燈方向的啟動或者暫停按鍵。記得把輸出線P0.4一直輸出低電平,模拟獨立按鍵的觸發地GND。
(2)實作功能:
跑馬燈運作:第1個至第8個LED燈一直不亮。在第9個至第16個LED燈,依次逐個亮燈并且每次隻能亮一個燈。每按一次獨立按鍵S13鍵,原來運作的跑馬燈會暫停,原來暫停的跑馬燈會運作。用S1來改變方向。用S5和S9來改變速度,每按一次按鍵的遞增或者遞減以10為機關。
數位管顯示:本程式隻有1個視窗,這個視窗分成3個局部顯示。8,7,6位數位管顯示運作狀态,啟動時顯示“on”,停止時顯示“oFF”。5位數位管顯示數位管方向,正向顯示“n”,反向顯示“U”。4,3,2,1位數位管顯示速度。數值越大速度越慢,最慢的速度是550,最快的速度是50。
(3)源代碼講解如下:
#include "REG52.H"
#define const_voice_short 40 //蜂鳴器短叫的持續時間
#define const_key_time1 20 //按鍵去抖動延時的時間
#define const_key_time2 20 //按鍵去抖動延時的時間
#define const_key_time3 20 //按鍵去抖動延時的時間
#define const_key_time4 20 //按鍵去抖動延時的時間
void initial_myself();
void initial_peripheral();
void delay_short(unsigned int uiDelayShort);
void delay_long(unsigned int uiDelaylong);
//驅動數位管的74HC595
void dig_hc595_drive(unsigned char ucDigStatusTemp16_09,unsigned char ucDigStatusTemp08_01);
void display_drive(); //顯示數位管字模的驅動函數
void display_service(); //顯示的視窗菜單服務程式
//驅動LED的74HC595
void hc595_drive(unsigned char ucLedStatusTemp16_09,unsigned char ucLedStatusTemp08_01);
void led_flicker_09_16(); //第9個至第16個LED的跑馬燈程式,逐個亮并且每次隻能亮一個.
void led_update(); //LED更新函數
void T0_time(); //定時中斷函數
void key_service(); //按鍵服務的應用程式
void key_scan();//按鍵掃描函數 放在定時中斷裡
sbit beep_dr=P2^7; //蜂鳴器的驅動IO口
sbit key_sr1=P0^0; //對應學習闆的S1鍵
sbit key_sr2=P0^1; //對應學習闆的S5鍵
sbit key_sr3=P0^2; //對應學習闆的S9鍵
sbit key_sr4=P0^3; //對應學習闆的S13鍵
sbit key_gnd_dr=P0^4; //模拟獨立按鍵的地GND,是以必須一直輸出低電平
sbit led_dr=P3^5;
sbit dig_hc595_sh_dr=P2^0; //數位管的74HC595程式
sbit dig_hc595_st_dr=P2^1;
sbit dig_hc595_ds_dr=P2^2;
sbit hc595_sh_dr=P2^3; //LED燈的74HC595程式
sbit hc595_st_dr=P2^4;
sbit hc595_ds_dr=P2^5;
unsigned char ucKeySec=0; //被觸發的按鍵編号
unsigned int uiKeyTimeCnt1=0; //按鍵去抖動延時計數器
unsigned char ucKeyLock1=0; //按鍵觸發後自鎖的變量标志
unsigned int uiKeyTimeCnt2=0; //按鍵去抖動延時計數器
unsigned char ucKeyLock2=0; //按鍵觸發後自鎖的變量标志
unsigned int uiKeyTimeCnt3=0; //按鍵去抖動延時計數器
unsigned char ucKeyLock3=0; //按鍵觸發後自鎖的變量标志
unsigned int uiKeyTimeCnt4=0; //按鍵去抖動延時計數器
unsigned char ucKeyLock4=0; //按鍵觸發後自鎖的變量标志
unsigned int uiVoiceCnt=0; //蜂鳴器鳴叫的持續時間計數器
unsigned char ucLed_dr1=0; //代表16個燈的亮滅狀态,0代表滅,1代表亮
unsigned char ucLed_dr2=0;
unsigned char ucLed_dr3=0;
unsigned char ucLed_dr4=0;
unsigned char ucLed_dr5=0;
unsigned char ucLed_dr6=0;
unsigned char ucLed_dr7=0;
unsigned char ucLed_dr8=0;
unsigned char ucLed_dr9=0;
unsigned char ucLed_dr10=0;
unsigned char ucLed_dr11=0;
unsigned char ucLed_dr12=0;
unsigned char ucLed_dr13=0;
unsigned char ucLed_dr14=0;
unsigned char ucLed_dr15=0;
unsigned char ucLed_dr16=0;
unsigned char ucLed_update=0; //重新整理變量。每次更改LED燈的狀态都要更新一次。
unsigned char ucLedStep_09_16=0; //第9個至第16個LED跑馬燈的步驟變量
unsigned int uiTimeCnt_09_16=0; //第9個至第16個LED跑馬燈的統計定時中斷次數的延時計數器
unsigned char ucLedStatus16_09=0; //代表底層74HC595輸出狀态的中間變量
unsigned char ucLedStatus08_01=0; //代表底層74HC595輸出狀态的中間變量
unsigned char ucLedDirFlag=0; //方向變量,把按鍵與跑馬燈關聯起來的核心變量,0代表正方向,1代表反方向
unsigned int uiSetTimeLevel_09_16=300; //速度變量,此數值越大速度越慢,此數值越小速度越快。
unsigned char ucLedStartFlag=1; //啟動和暫停的變量,0代表暫停,1代表啟動
unsigned char ucDigShow8; //第8位數位管要顯示的内容
unsigned char ucDigShow7; //第7位數位管要顯示的内容
unsigned char ucDigShow6; //第6位數位管要顯示的内容
unsigned char ucDigShow5; //第5位數位管要顯示的内容
unsigned char ucDigShow4; //第4位數位管要顯示的内容
unsigned char ucDigShow3; //第3位數位管要顯示的内容
unsigned char ucDigShow2; //第2位數位管要顯示的内容
unsigned char ucDigShow1; //第1位數位管要顯示的内容
unsigned char ucDigDot8; //數位管8的小數點是否顯示的标志
unsigned char ucDigDot7; //數位管7的小數點是否顯示的标志
unsigned char ucDigDot6; //數位管6的小數點是否顯示的标志
unsigned char ucDigDot5; //數位管5的小數點是否顯示的标志
unsigned char ucDigDot4; //數位管4的小數點是否顯示的标志
unsigned char ucDigDot3; //數位管3的小數點是否顯示的标志
unsigned char ucDigDot2; //數位管2的小數點是否顯示的标志
unsigned char ucDigDot1; //數位管1的小數點是否顯示的标志
unsigned char ucDigShowTemp=0; //臨時中間變量
unsigned char ucDisplayDriveStep=1; //動态掃描數位管的步驟變量
unsigned char ucWd1Part1Update=1; //視窗1的局部1更新顯示變量
unsigned char ucWd1Part2Update=1; //視窗1的局部2更新顯示變量
unsigned char ucWd1Part3Update=1; //視窗1的局部3更新顯示變量
//根據原理圖得出的共陰數位管字模表
code unsigned char dig_table[]=
{
0x3f, //0 序号0
0x06, //1 序号1
0x5b, //2 序号2
0x4f, //3 序号3
0x66, //4 序号4
0x6d, //5 序号5
0x7d, //6 序号6
0x07, //7 序号7
0x7f, //8 序号8
0x6
上唯樣商城找電子元件