中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

基于C語言如何實現的流水跑馬燈

發布時間:2020-10-16 15:20:40 來源:億速云 閱讀:326 作者:小新 欄目:編程語言

這篇文章給大家分享的是有關基于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語言如何實現的流水跑馬燈就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

安义县| 孟津县| 元谋县| 图木舒克市| 东阿县| 凤凰县| 张家港市| 河间市| 葵青区| 万安县| 麻阳| 静安区| 叙永县| 富平县| 宿迁市| 临湘市| 桑日县| 台江县| 乐平市| 定远县| 晋江市| 咸丰县| 田阳县| 水城县| 墨竹工卡县| 南阳市| 成武县| 谷城县| 南开区| 鄂托克旗| 杭锦旗| 芷江| 连平县| 阜宁县| 左云县| 留坝县| 瑞昌市| 水城县| 三河市| 通山县| 攀枝花市|