分享

单片机4*4矩阵键盘-Changing's Blog

 杭州文轩 2014-11-27

单片机4*4矩阵键盘

作者:Changing发表时间:分类:电子相关2 Comments

晚上帮同学写了段代码  用单片机P1口扩展成4*4的键盘  按下按键点亮P0口的LED 
矩阵键盘的扩展不算复杂 主要是检测代码部分比较复杂 
IO扩展原理
矩阵键盘.png
    矩阵键盘又称行列键盘,它是用四条I/O线作为行线,四条I/O线作为列线组成的键盘。
在行线和列线的每个交叉点上设置一个按键。这样键盘上按键的个数就为4*4个。
这种行列式键盘结构能有效地提高单片机系统中I/O口的利用率。
检测原理
    当无按键闭合时,行线与列线之间开路。当有键闭合时,与闭合键相连的两条I/O口线之间短路。
    判断有无按键按下的方法:
  1. 粗扫描。行线输出低电平,列线输出高电平。读取Px口,若数据不等于 0x0F则有按键按下。
  2. 细扫描。行线逐行输出低电平,其他IO口输出高电平。读取Px口,若数据不等于输出的数值则有按键按下。并可以确定行数。同理列线逐行输出低电平,可以检测出列数。
  3. 根据行数和列数转换按键码 

代码如下:
#include <reg51.h>
#define  uchar  unsigned char  

#define  LED_ON(X)  P0 = ~(1<<(X))      //LED低电平点亮

uchar KeyScan(void);

void main(void)
{
	uchar key;

	while(1){
		key = KeyScan();

		if(key > 0)
		{
			key = key -1;
			LED_ON(key); 
		} 
	}
}

uchar KeyScan(void)						
{

	uchar i,val,row,col,key;

	P1 = 0xF0;			//行线置0,列线置1

	if( P1 != 0x0F0 )	//按键按下
	{
		for(i=0;i<4;i++)   //行扫描	
		{
			val = 0xFF&(~(1<<i));	 //每行轮流置1
			P1 = val;					
			if(P1 != val) 
			{
				row = i;	//确定行数
				break;		//终止循环
			}
		}

		for(i=0;i<4;i++)   //列扫描	
		{
			val = 0xFF&(~(0x10<<i));
			P1 = val;					
			if(P1 != val) 
			{
				col = i+1;	//确定列数
				break;		//终止循环
			}
		}
		key = row*4+col;
		return key;
	}else{
		return 0;
	}  
}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多