51單片機實驗 2017年11月27日


2017年11月29日

矩陣按鍵程序

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit we = P2^7;
sbit du = P2^6;
uchar code leddata[]={ 
 
                0x3F,  //"0"
                0x06,  //"1"
                0x5B,  //"2"
                0x4F,  //"3"
                0x66,  //"4"
                0x6D,  //"5"
                0x7D,  //"6"
                0x07,  //"7"
                0x7F,  //"8"
                0x6F,  //"9"
                0x77,  //"A"
                0x7C,  //"B"
                0x39,  //"C"
                0x5E,  //"D"
                0x79,  //"E"
                0x71,  //"F"
                0x76,  //"H"
                0x38,  //"L"
                0x37,  //"n"
                0x3E,  //"u"
                0x73,  //"P"
                0x5C,  //"o"
                0x40,  //"-"
                0x00,  //熄滅
                0x00  //自定義
                         };
void delay(uint z)
{
	uint x,y;
	for(x = z;x > 0;x --)
		for(y = 112;y > 0;y --);
}
//嵌套延時函數
uchar KeyScan()		  //按鍵判斷函數
{
	uchar cord_l,cord_h;               //聲明列和行函數名
	P3 = 0xf0; 			   //將0xf0賦給P3口,將行置高電平列置低電平
	//if((P3 & 0xf0) != 0xf0)
	if(P3 != 0xf0)           	   //當行和列不再是初始的時候代表有按鍵被按下
	{
		delay(5);                          //軟件消抖延時
		//if((P3 & 0xf0) != 0xf0)
		if(P3 != 0xf0)		            //確定有按鍵按下
		{
			cord_l = P3 & 0xf0;	  //按位與運算,將結果賦給cord_l函數
			P3 = cord_l | 0x0f;	  //按位或運算,將運算結果賦給P3口
			                           //掃描矩陣鍵盤的每一列將其結果賦給cord_l函數
			cord_h = P3 & 0x0f;		// 按位與,將P3口的行與0x0f中不同的二進制數置爲低電平
			while((P3 & 0x0f) != 0x0f);	//不斷的判斷按鍵是否按下
			return(cord_l + cord_h);        //列和行的按鍵地址
		}
	}
}


void KeyPro()                    //按鍵地址函數
{
	switch(KeyScan())       //按鍵地址選擇語句塊
	{
	                       //當按鍵地址等於以下之一時則選擇將後面leddata數組中的數字送入數碼管
	//第一行
		case 0xee:P0 = leddata[0]; 	break; //第一列
		case 0xde:P0 = leddata[1]; 	break; //第二列
		case 0xbe:P0 = leddata[2]; 	break; //第三列
		case 0x7e:P0 = leddata[3]; 	break; //第四列
   //第二行
		case 0xed:P0 = leddata[4]; 	break; //第一列
		case 0xdd:P0 = leddata[5];  	break; //第二列
		case 0xbd:P0 = leddata[6];	break; //第三列
		case 0x7d:P0 = leddata[7];	break; //第四列
	//第三行
		case 0xeb:P0 = leddata[8];	break; //第一列
		case 0xdb:P0 = leddata[9];  	break; //第二列
		case 0xbb:P0 = leddata[10];	break; //第三列
		case 0x7b:P0 = leddata[11];	break; //第四列
	//第四行
		case 0xe7:P0 = leddata[12];	break; //第一列
		case 0xd7:P0 = leddata[13]; 	break; //第二列
		case 0xb7:P0 = leddata[14]; 	break; //第三列
		case 0x77:P0 = leddata[15]; 	break; //第四列
		}
}


void main()	 //主函數開始
{
	we = 1;	 //打開位選
	P0 = 0;	 //打開所有8組數碼管
	we = 0;	 //打開位選


	du = 1;	            //打開段選
	P0 = leddata[22];    //向P0口段選送一個初始顯示數但此地不可爲空
	while(1)            //循環執行按鍵地址程序
	{
		KeyPro();   //按鍵地址函數
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章