`
yunchow
  • 浏览: 319127 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

单片机 键盘编程

阅读更多
   花了几天时间整了下单片机的键盘.我用的单片机板子是用的P2的8个IO端口对16个键达到控制的目的.
    那怎样来使用8个端口控制16个键呢?其实很简单,先必须要掌握她的原理图,

附件中作者上传了一张,仅供参考.原理图看了之后,我们就可以正式开始编写程序了.
    先将KEY0置低电平,其余的置高电平,当我们按下第一列的按键时,P2的高四位肯定会有所变化,而我们就是用的这种变化达到分辨不同按键的目的.同理,我们可以将KEY1置低电平,再去检测P2的高四位,也得出了第二列按的哪个键.依次类推,我们即可检测单片机的16个按键了.
    下面有一个单片机键盘的完整示例程序,本程序已在89C52单片机上成功运行,产生的效果是,按下单片机上不同的键时,数码管将显示不同的值与之对应.
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int

sbit sda = P1^0;
sbit clk = P1^1;
sbit dig1 = P1^2;
sbit dig2 = P1^3;
sbit dig3 = P1^4;
sbit dig4 = P1^5;
uchar code table[]={0x7e,0x0c,0xb6,0x9e,
					0xcc,0xda,0xfa,0x0e,
					0xfe,0xde,0xef,0xf9,
					0x72,0xb8,0xf2,0xe2};
uchar key = 255;
uchar diskey = 255;
void init();
void delay(uchar);
void write(uchar);
void display(uchar);
uchar scankey();

void main()
{
	init();
	while(1)
	{
		diskey = scankey();	
		display(diskey);
	    //scankey();
		delay(10);
	}
}
/** 键盘扫描 **/
uchar scankey()
{
	uchar temp;
	/* 检查第一列是否有按键按下 */
	P2 = 0xfe;
	temp = P2;
	temp = temp&0xf0;
 	if(temp!=0xf0)
	{
		delay(5);
		if(temp!=0xf0)
		{
	  	 	switch (temp)
			{
				case 0xe0 : key = 0;
							break;
				case 0xd0 : key = 1;
							break;
				case 0xb0 : key = 2;
					   		break;
				case 0x70 : key = 3;
							break;
			}
		}
		//display(key);//显示按的键	
	}

	/* 检查第二列是否有按键按下 */
	P2 = 0xfd;
	temp = P2;
	temp = temp&0xf0;
 	if(temp!=0xf0)
	{
		delay(5);
		if(temp!=0xf0)
		{
	  	 	switch (temp)
			{
				case 0xe0 : key = 4;
							break;
				case 0xd0 : key = 5;
							break;
				case 0xb0 : key = 6;
					   		break;
				case 0x70 : key = 7;
							break;
			}
		}
		//display(key);//显示按的键	
	}
	/* 检查第三列是否有按键按下 */
	P2 = 0xfb;
	temp = P2;
	temp = temp&0xf0;
 	if(temp!=0xf0)
	{
		delay(5);
		if(temp!=0xf0)
		{
	  	 	switch (temp)
			{
				case 0xe0 : key = 8;
							break;
				case 0xd0 : key = 9;
							break;
				case 0xb0 : key = 10;
					   		break;
				case 0x70 : key = 11;
							break;
			}
		}
		//display(key);//显示按的键
	}
	/* 检查第四列是否有按键按下 */
	P2 = 0xf7;
	temp = P2;
	temp = temp&0xf0;
 	if(temp!=0xf0)
	{
		delay(5);
		if(temp!=0xf0)
		{
	  	 	switch (temp)
			{
				case 0xe0 : key = 12;
							break;
				case 0xd0 : key = 13;
							break;
				case 0xb0 : key = 14;
					   		break;
				case 0x70 : key = 15;
							break;
			}
		}
		//display(key);//显示按的键	
	}
	return key;
}
/** 显示一个3位的整数 **/
void display(uchar num)
{
	uchar bai,shi,ge;
	bai = num/100;
	shi = num%100/10;
	ge = num%10;
	/* 显示个位 */
	dig4 = 0;
	write(table[ge]);
	delay(10);
	dig4 = 1;
	/* 显示十位 */
	dig3 = 0;
	write(table[shi]);
	delay(10);
	dig3 = 1;
	/* 显示百位 */
	if(bai!=0)
	{
		dig2 = 0;
		write(table[bai]);
		delay(10);
[img]/upload/attachment/89564/a2582c87-2c23-3974-bf9c-f935ad8c6c92.bmp[/img]
[img]/upload/attachment/89564/a2582c87-2c23-3974-bf9c-f935ad8c6c92.bmp[/img]


		dig2 = 1;
	}
}
/** 程序初始化函数 **/
void init()
{
	P2 = 0xfe;
	//dig1 = 1;
	//dig2 = 1;
	//dig3 = 1;
	//dig4 = 0;
}
/** 向数据码管写入一个字节数据 **/
void write(uchar u)
{
    uchar i;
	for(i=0;i<8;i++)
	{
		clk = 1;
		sda = u&0x80;
		clk = 0;
		u = u<<1;	
	}
}
/** 延迟函数 **/
void delay(uchar t)
{
	uchar x,y;
	for(x=t;x>0;x--)
		for(y=101;y>0;y--);
}
  • 大小: 53.9 KB
1
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics