当前位置:首页 > 单片机 > 单片机
[导读]一个4*4的键盘矩阵,可以采用逐行扫描或全扫描的方式实现按键的读取。行列扫描若行线和列线加驱动后空载时为高电平,逐行扫描的方法为逐行使行线的每位为低,再判断列线的返回信号,如果没有键按下,返回的信号全为高

一个4*4的键盘矩阵,可以采用逐行扫描或全扫描的方式实现按键的读取。

行列扫描

若行线和列线加驱动后空载时为高电平,逐行扫描的方法为逐行使行线的每位为低,再判断列线的返回信号,如果没有键按下,返回的信号全为高;如果返回的信号中有列线为低,那么肯定是有按键按下,根据列线和行线的交点可以判断按键的具体位置。

可以设置一个数组,存放从1到F对应的16个代码,比如将P2_0与P2_7的交点处定为0,那么数组第0个元素则为0X7E(二进制0111 1110),当正确求出P2对应的数值时与数组对照便可求得按键的值。

uchar keyboard[16]={0x7e,0x7d,0x7b,0x77,0xbe,0xbd,0xbb,0xb7,0xde,

0xdd,0xdb,0xd7,0xee,0xed,0xeb,0xe7},这个数组就是对应键盘扫描值的0~F。

注意:这个数组依照确定键值的位置不同而不同。

全扫描

全扫描的方法为先列线全为低,判断行线,如果行线有为低的,则可以判断有键按下,此时还不能判断某列的具体的键和列,还需反过来将列线全为高,再判断具体的列,根据行列号即确定具体的按键。



#include#include"key.h"//键盘扫描码//键值01234567constunsignedcharkeyboard[16]={0x7e,0x7d,0x7b,0x77,0xbe,0xbd,0xbb,0xb7,//键值89abcdef0xde,0xdd,0xdb,0xd7,0xee,0xed,0xeb,0xe7};constunsignedcharSelect_bit[4]={0x01,0x02,0x04,0x08};//行列扫描所需变量unsignedcharKeyValue=0xFF;//键盘扫描值/******************************************************名称:delay_10ms功能:防抖动延时10ms参数:unsignedinti*******************************************************/voiddelay_10ms(unsignedinti){unsignedintj;for(;i>0;i--)for(j=2250;j>0;j--);}/******************************************************名称:key_value功能:获得键盘扫描值参数:unsignedcharscancode(行列锁确定的扫描值)*******************************************************/voidkey_value(unsignedcharscancode){unsignedcharpoint;for(point=0x00;point<0x10;point++){if(scancode==keyboard[point]){KeyValue=point;}}}/******************************************************名称:Key_AllScan功能:键盘全扫描参数:无*******************************************************/unsignedcharKey_AllScan(void){unsignedcharTemp_key,Temp_10ms;P2=0x0F;//全扫描线全为低,判断行线Temp_key=P2;if(Temp_key<0x0F)//判断按键按下{delay_10ms(1);//延时防抖动Temp_10ms=P2;if(Temp_10ms==Temp_key){Temp_key^=0xF0;//列线全为高在判断具体的列P2=Temp_key;Temp_key=P2;key_value(Temp_key);//获得键盘扫描值}}returnKeyValue;}/******************************************************名称:Key_RankScan功能:键盘行列扫描参数:无*******************************************************/unsignedcharKey_RankScan(void){unsignedcharTemp_key,Temp,Temp_10ms,point;for(point=0x00;point<0x04;point++)//逐行设置低电平{Temp=0xFF;Temp^=Select_bit[point];//判断是否有按键按下P2=Temp;Temp_key=P2;if(Temp!=Temp_key){delay_10ms(1);//延时放抖动Temp_10ms=P2;if(Temp_10ms==Temp_key){key_value(Temp_key);break;}}}returnKeyValue;}


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭