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();   //按键地址函数
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章