您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關基于C語言如何實現的流水跑馬燈的內容。小編覺得挺實用的,因此分享給大家做個參考。一起跟隨小編過來看看吧。
1.題目:
跑馬燈
(1)基本要求
采用8254精確定時,LED的點亮規律為LED8-LED1,每一個LED的點亮時間間隔由邏輯電平開關K1、K2與K3選擇。K1的時間間隔為0.5S,K2的時間間隔為1.0S,K3的時間間隔為1.5S。當主機鍵盤按下任意鍵時停止演示。
(2)設計提示
采用8255的A口接LED燈,B口接邏輯電平開關K1、K2與K3。在8254的中斷服務程序中完成對燈的控制,主程序檢測開關的變化,改變點亮LED燈的時間間隔。
(3)進一步設計要求
LED的點亮規律變為LED8-LED1-LED8
2.分析:
基本原理設計
步驟一:8255采用B口工作在方式0,進行輸入,獲取開關(注:為了便于進行課設操作,我們采用了K2,K1,K0以此來取代K3,K2,K1,實現的要求完全一致)K2K1K0的值,這里會有三個值,分別是二進制編碼的100,010,001,即十進制的4,2,1,分別對應LED燈點亮的時間間隔1.5s,1.0s,0.5s。
步驟二:8254采用工作方式三,產生一個固定頻率的方波,去不斷觸發中斷服務程序。在主程序中,獲取8255的B口輸入值,根據輸入值給8254的計數器1寫入對應的初始值,在OUT1端就能得到一個固定頻率的方波信號,這里我們連接了一個K7所對應的燈,以此來進行驗證方波的產生以及通過燈閃爍的頻率可以大致判斷方波的頻率,來對應時間間隔1.5s,1.0s,0.5s。
步驟三:8254產生的方波信號輸出,連接到中斷接口IR10,用來利用方波信號的頻率按照一定的時間間隔來出發中斷服務程序。
步驟四:中斷服務程序按照8254的方波頻率,在一定的時間間隔內被加載執行。在中斷服務程序中實現對8255的A口輸出的改變,來控制LED7-LED0的閃爍變化,即實現跑馬燈。
3.代碼實現:
//****************************************************************************************************************** /* 實驗接線: 8254: 片選信號CS接Y0;GATE0、GATE1級聯接+5V;CLK0接1MHz;CLK1接OUT0; OUT1接k5(進行8254的方波顯示); 8255: 片選信號CS接Y1;A口作為輸出用排線接LED燈;PB0、PB1、PB2作為輸入分別接K0、K1、K2; 中斷: IR10接OUT1(中斷控制程序控制LED燈的閃爍變化); */ //****************************************************************************************************************** //8255模塊的設置 void init(void);//初始化 void ISR(void); int i=0,j=0; const unsigned short Port8255Base = 0x288; const unsigned char ControlWord8255 = 0x82; void init8255(void);// 8255初始化 //****************************************************************************************************************** //關于8254模塊的設置 //通道0: 控制字00110110 -> 36H,即0x36,CLK0=1MHz,OUT0=0.01s,初值=F(clk)*T(out) 初始值:COUNT0=10000 //通道1: 控制字01110110 -> 76H,即0x76,CLK1=OUT0,初值=T1(out)/T1(clk) //當OUT1=0.5s,k3=0,k2=0,k0=1,1 初始值:COUNT1=50 //當OUT1=1.0s,k3=0,k2=1,k0=0,2 初始值:COUNT1=100 //當OUT1=1.5s,k3=1,k2=0,k0=0,4 初始值:COUNT1=150 void init8254(void);// 8254初始化 const unsigned short Port8254Base = 0x280, //計數器1端口地址為p8254Base+1,端口地址為p8254Base+3. counter0=10000; const unsigned char ControlWord8254ch0 = 0x36, ControlWord8254ch2 = 0x76; unsigned short counter1=100;//計數器初值 byte pData; unsigned char pdata=0x80; bool flag=true; //****************************************************************************************************************** //主函數 void main() { init(); init8254();// 8254初始化 init8255();//8255初始化 printf("\n start...\n"); while (!_kbhit()) { PortReadByte(Port8255Base + 1, &pData); //寫入計數器1的初始值 if(pData==1){ //k0為1的情況,k2k1k0=001,即時間間隔為0.5秒 counter1=50; PortWriteByte(Port8254Base+1 , counter1%256); // 寫計數器1計數初值低8位 PortWriteByte(Port8254Base+1 , counter1/256); // 寫計數器1計數初值高8位 printf("=switch state:%x LED燈點亮間隔0.5秒=\n",pData); } if(pData==2){ //k1為1的情況,k2k1k0=010,即時間間隔為1.0秒 counter1=100; PortWriteByte(Port8254Base+1 , counter1%256); // 寫計數器1計數初值低8位 PortWriteByte(Port8254Base+1 , counter1/256); // 寫計數器1計數初值高8位 printf("=switch state:%x LED燈點亮間隔1.0秒=\n",pData); } if(pData==4){ //k2為1的情況,k2k1k0=100,即時間間隔為1.5秒 counter1=150; PortWriteByte(Port8254Base+1 , counter1%256); // 寫計數器1計數初值低8位 PortWriteByte(Port8254Base+1 , counter1/256); // 寫計數器1計數初值高8位 printf("=switch state:%x LED燈點亮間隔1.5秒=\n",pData); } sleep(3000);// delay 1s EnableIntr(); // 開中斷,功能等效于匯編語言指令sti RegisterLocalISREx(ISR,10); // 加載中斷服務程 printf("Wait for the switch state change...\n\n"); } _getch(); printf("\n Press any key over...\n"); //DisableIntr(); // 開中斷,功能等效于匯編語言指令cli Cleanup(); } //中斷服務程序,實現跑馬燈的流水 void ISR(void) { if(flag) { _asm { ror pdata,1 //循環右移指令 } } else { _asm { rol pdata,1 //循環左移指令 } } j++; if(j==7) { flag = false; } if(j==14){ flag = true; j=0; } PortWriteByte(Port8255Base,pdata); } //機箱的初始化 void init(void) { if(!Startup()) // 加載實驗平臺I/O驅動程序 { printf("\n\n ERROR: Open Device Error!請打開實驗箱電源\n"); _getch(); exit(0); // return to Windows } } //8254初始化 void init8254(void) { PortWriteByte(Port8254Base + 3, ControlWord8254ch0); // 寫計數器0控制字 PortWriteByte(Port8254Base + 3, ControlWord8254ch2); // 寫計數器1控制字 PortWriteByte(Port8254Base , counter0%256); // 寫計數器0計數初值低8位 PortWriteByte(Port8254Base , counter0/256); // 寫計數器0計數初值高8位 } //8255初始化 void init8255(void) { PortWriteByte(Port8255Base + 3, ControlWord8255); // 寫8255控制字 PortWriteByte(Port8255Base,pdata); }
感謝各位的閱讀!關于基于C語言如何實現的流水跑馬燈就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。