历史上的今天
返回首页

历史上的今天

今天是:2025年02月04日(星期二)

2021年02月04日 | 51单片机键盘扫描程序解析

2021-02-04 来源:eefocus

/****************************************键盘_不采用定时器_不延时特点:按键在松手后有效,灵敏度高,消耗资源少,运行效率高独立键盘为:K01=P2^4;K02=P2^5;K03=P2^6;K04=P2^7;矩阵键盘为:行(上到下)_P2.3_P2.2_P2.


/****************************************



键盘_不采用定时器_不延时


特点:


按键在松手后有效,灵敏度高,消耗资源少,运行效率高


独立键盘为:K01=P2^4;K02=P2^5;K03=P2^6;K04=P2^7;


矩阵键盘为:行(上到下)_P2.3_P2.2_P2.1_P2.0


列(左到右)_P2.7_P2.6_P2.5_P2.4


提供的操作函数:


//独立键盘。无按键动作时其返回值num_key=0,否则返回按键号num_key


extern unsigned char keyboard_self();


//矩阵键盘。无按键动作时其返回值num_key=0,否则返回按键号num_key****检测高四位


extern unsigned char keyboard_matrix();


****************************************/



先看独立键盘(和矩阵键盘的算法一样)


-----------------------------------------------------------------------


#include


#include


//独立键盘。无按键动作时其返回值num_key=0,否则返回按键号num_key


extern unsigned char keyboard_self()


{


unsigned char num_key=0;//按键号


unsigned char temp=0;//用于读取P2线上按键值


static unsigned char temp_code=0;//保存按键值


staTIc unsigned char num_check=0;//低电平有效次数


staTIc unsigned char key_flag=0;//按键有效标识


temp=P2&0xF0;//读取P2线数据


if(temp!=0xF0)//低电平判断


{


num_check++;


if(num_check==10)//连续10次(10ms)低电平有效,则认为按键有效


{


key_flag=1;//使能按键有效标识


temp_code=temp;//保存按键值


}


}


else//松手时判断


{


num_check=0;


if(key_flag==1)//按键有效


{


key_flag=0;


switch(temp_code)//读取按键号


{


case 0xE0: num_key=1;


break;


case 0xD0: num_key=2;


break;


case 0xB0: num_key=3;


break;


case 0x70: num_key=4;


break;


}


}


}


return(num_key);


}


现在是矩阵键盘的


-----------------------------------------------------------------------


#include


#include


//矩阵键盘。无按键动作时其返回值num_key=0,否则返回按键号num_key****检测高四位


extern unsigned char keyboard_matrix()


{


unsigned char num_key=0;//按键号


unsigned char temp=0;//读取P2口线数据


staTIc unsigned char temp_code=0;//用于保存按键值


staTIc unsigned char temp_circle=0xFE;//保存P2线上的循环扫描值


static unsigned char num_check=0;//低电平计数


static unsigned char key_flag=0;//按键有效标识


P2=temp_circle;//0xFX


temp=P2;//读取P2口线数据


if(temp!=temp_circle)//有按键动作


{


num_check++;//低电平计数|逢低电平加1


if(num_check==10)//连续10次(10ms)低电平有效


{


key_flag=1;//按键有效标识置1


temp_code=temp;//保存按键值


}


}


else//松手OR无按键动作,此时应该改变扫描线


{


num_check=0;


if(key_flag==1)//按键有效判断


{


key_flag=0;


switch(temp_code)//读取按键号


{


//P2^0线


case 0xEE: num_key=1;


break;


case 0xDE: num_key=2;


break;


case 0xBE: num_key=3;


break;


case 0x7E: num_key=4;


break;


//P2^1线


case 0xED: num_key=5;


break;


case 0xDD: num_key=6;


break;


case 0xBD: num_key=7;


break;


case 0x7D: num_key=8;


break;


//P2^2线


case 0xEB: num_key=9;


break;


case 0xDB: num_key=10;


break;


case 0xBB: num_key=11;


break;


case 0x7B: num_key=12;


break;


//P2^3线


case 0xE7: num_key=13;


break;


case 0xD7: num_key=14;


break;


case 0xB7: num_key=15;


break;


case 0x77: num_key=16;


break;


}


}


temp_circle=_crol_(temp_circle,1);//改变扫描线


if(temp_circle==0xEF)


{


temp_circle=0xFE;


}


}


return(num_key);//返回按键号


}


/*************************************************************************


未按键时,扫描线一直变化。


长按键时,扫描线不变化,使得该行按键变成了独立按键,这样的扫描效率极高。


如当按下P2.0线上的某个键时,程序将扫描到这个键,而后扫描线不变化,


当键盘程序连续10次进入时检测到10次按键有效,直到松手后扫描线才变化


*************************************************************************/


推荐阅读

史海拾趣

格莱尔(GLE)公司的发展小趣事

在稳步发展国内市场的同时,格莱尔也积极拓展海外市场。公司凭借优质的产品和服务,成功吸引了众多国际客户的关注与合作。格莱尔的产品广泛应用于液晶显示屏、笔记本计算机、手机、数码相机等多个领域,与众多知名企业建立了长期稳定的合作关系。此外,格莱尔还注重品牌建设,通过参加国际展会、发布新品等方式提升品牌知名度和影响力。

ENERGIZER公司的发展小趣事

ENERGIZER在电池技术的研发上一直处于行业领先地位。1957年,公司成功研制出首粒碱性电池,这一创新性的产品迅速占领了市场,成为了当时最受欢迎的电池产品之一。随后,ENERGIZER又相继推出了纽扣电池、测电带电池等一系列创新产品,不断满足消费者对电池的多样化需求。这些创新性的产品的研发和推广,进一步巩固了ENERGIZER在全球电池市场的领先地位。

Codeco Corporation Of Vermont公司的发展小趣事

随着公司的发展,Codeco逐渐意识到技术创新的重要性。他们投入大量资源研发新技术,不断提升产品的性能和用户体验。在一次关键的研发项目中,Codeco的团队突破了某项技术难题,推出了一款引领行业潮流的新产品。这一创新不仅为公司带来了可观的收益,也进一步巩固了Codeco在电子行业的地位。

Fedco_Batteries公司的发展小趣事

随着公司业务的不断拓展,Fedco_Batteries始终将产品质量放在首位。公司引进了先进的生产设备和检测设备,建立了严格的质量管理体系。每一块电池在出厂前都要经过多道严格的质量检测,确保产品的稳定性和可靠性。这种对品质的坚持,让Fedco_Batteries的电池在市场上赢得了良好的口碑,越来越多的客户选择了他们的产品。

欧密格光电(Amicc)公司的发展小趣事

面对日新月异的市场需求和技术变革,Fedco_Batteries始终保持创新的步伐。公司加大了研发投入,不断推出新型电池产品,满足客户的多样化需求。同时,公司还积极探索新的应用领域,将电池技术应用于更多领域,如新能源汽车、智能家居等。这种创新驱动的发展战略,让Fedco_Batteries在行业中始终保持领先地位。

Bay Linear Inc公司的发展小趣事

近年来,随着电子行业的快速发展和市场竞争的加剧,Bay Linear Inc公司面临着前所未有的挑战。为了应对行业变革,公司进行了一系列战略调整,包括优化产品结构、加强研发投入、拓展新兴市场等。这些举措有效地提升了公司的竞争力,使公司在激烈的市场竞争中保持了稳健的发展态势。

问答坊 | AI 解惑

基于FPGA和DSP的高速瞬态信号检测系统

引 言 目前国内急需一种能够对电火工品的发火过程进行实时无损耗监测的方法和手段,并根据监测结果对火工品的可靠性进行准确的判决和认证,解决科研和生产过程中的具体问题。本系统采用感应式线圈作为非接触式启爆电流的启爆装置,并采用高速A/D ...…

查看全部问答>

cycloneIII开发入门

由于我们应用板还在设计,开发板上的外围资源不是很多,主要是些存储器,所以暂时还不能开展FPGA的HDL和NIOS的开发,就给大家介绍一些基本的知识吧。 首先是QUARTUS II的安装:如果有安装软件,直接点NEXT就可以了,然后是注册,我现在装的的是开 ...…

查看全部问答>

请教一下大家关于继电器输出

什么是继电器输出,其是否可以作为单片机的输入,如果可以需要加转接电路吗?谢谢…

查看全部问答>

有重庆的想做兼职的吗?

有重庆的想做兼职的吗?QQ512440957…

查看全部问答>

请问谁了解 龙旗科技的 手机软件研发待遇如何 谢谢

最近收到龙旗的面试通知,对这个公司不太了解,请教各位.知道的告诉下,工作环境和待遇问题.做3G手机软件研发…

查看全部问答>

51串口通信问题!

真不知道哪里出问题了。。。。。。。 大侠帮忙看看: 我的程序:              MOV TMOD,#20H        ;置定时器T1工作于方式2定时           ...…

查看全部问答>

说说锂电池保护电路综述

锂离子电池保护电路包括过度充电保护、过电流/短路保护和过放电保护,要求过充电保护高精密度、保护IC功耗低、高耐压以及零伏可充电等特性。本文详细介绍了这三种保护电路的原理、新功能和特性要求。近年来,PDA、数字相机、手机、可携式音讯 ...…

查看全部问答>

AT89C51ED2 有没有替换型号呀

请各位高手帮忙,AT89C51ED2市场价格上涨了近50%,此芯片有没有不同厂家的替代型号呀!…

查看全部问答>

问几个关于ColdFire的问题

最近用ColdFire V2(MCF52259)做项目,遇上些问题,咨询下老鸟。 1.因为RAM空间限制,我想把程序中一块比较大的查表数据移到内部Flash中,即在线调试时也可以访问Flash取数据,能否通过修改LCF文件做到?我用的是龙丘的某款在线调试工具。 2.我看到 ...…

查看全部问答>

【转】硬件失效原因之:PCB焊接

有数据显示,78%的硬件失效原因是由于不良的PCB焊接加工造成的。深表赞同        遇到硬件失效的情况,工程师愿意花费大量时间和精力在样板调试和分析中,耽误了项目进度。如果找不出不良原因,他们也会习惯性的认为问题出 ...…

查看全部问答>