历史上的今天
返回首页

历史上的今天

今天是:2025年08月16日(星期六)

正在发生

2019年08月16日 | 矩阵键盘扫描原理详解——单片机

2019-08-16 来源:eefocus

键盘扫描方法是:行线P10~P13为输出线,列线P14~P17为输入线。一开始单片机将行线(P10~P13)全部输出低电平,此时读入列线数据,若列线全为高电平则没有键按下,当列线有出现低电平时调用延时程序以此来去除按键抖动。延时完成后再判断是否有低电平,如果此时读入列线数据还是有低电平,则说明确实有键按下。最后一步确定键值。现在我们以第二行的S5键为例,若按下S5后我们应该怎么得到这个键值呢?当判断确实有键按下之后,行线轮流输出低电平,根据读入列线的数据可以确定键值。首先,单片机将P10输出为低电平,其它P11~P13输出高电平,此时读取列线的数据全为高电平,说明没有在第一行有键按下;其次,单片机将P11输出低电平,其它P10、P12、P13仍为高电平,此时再来读取列线数据,发现列线读到的数据有低电平,数值为1011(0x0B),如果我们的键盘布局已经确定,那么0x0B就代表S5的值了。转到S5键功能处理子程序就可以达到目的。

/*  
    功能:矩阵键盘扫面,按键显示键值程序 
    作者:siriuszxn
                                  */
#include "reg51.h"                                                                                                                
#define KEYPORT = P1                                                                                                   

unsigned char i;                                                                                                                                         
unsigned char Keynum;                                                                                                        
unsigned char Line;                                       //行                                                                 
unsigned char Mask;                                                                                                         
unsigned char Col;                                        //列                                                                      
unsigned char ScanCode;                                                                                              

unsigned char code psegs_table[] =                                                                                            {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};                                                                //共阳极数码管0-F                                                                                                                                            

void delay_ms(unsigned int t)                      //ms延时程序                                                                      
{                                                                                                                                       
    unsigned char i;                                                                                                                 
     unsigned int x;                                                                                                                  
     x=t;                                                                                                                              
     while(x--)                                                                                                                        
     {                                                                                                                                          
             for(i=0;i<113;i++);                                                                                                              
     }                                                                                                                                           
}                                                                                                                                        
/* 键盘扫描程序 */                                                                                                                                        
void keyscan()                                                                                                           
{                                                                                                                                   
    while (1)              //循环扫描键盘       
    {                                                                                                                            
       P1 = 0xff;          //开始                                                         
        Line = 1;                                                                                         
        Mask = 0x01;                                                                                         

推荐阅读

史海拾趣

ARBOR公司的发展小趣事

面对日益激烈的市场竞争,ARBOR公司始终坚持创新驱动的发展策略。公司不断加大研发投入,引进高素质的研发人才,加强与国内外科研机构的合作。通过不断创新,ARBOR公司成功推出了一系列具有自主知识产权的新产品和技术。这些创新成果不仅提升了公司的核心竞争力,也为公司的未来发展注入了新的动力。

虽然这些故事是虚构的,但它们反映了电子行业公司可能面临的挑战和机遇。通过不断的技术创新、市场拓展和合作共赢,ARBOR公司或类似的电子企业可以不断壮大并引领行业的发展。

DOMINANT公司的发展小趣事

随着公司业务的不断发展,统明亮开始积极拓展全球市场。它通过与国内外知名企业的合作,不断提升自身的品牌影响力和市场竞争力。同时,统明亮还积极参加各类国际展会和交流活动,与全球各地的客户建立了紧密的合作关系。这些努力使得统明亮在全球LED市场中的份额不断扩大,其品牌影响力也得到了进一步提升。

请注意,由于篇幅限制,以上仅为三个简要故事。如果需要更多关于DOMINANT公司的发展故事,建议查阅相关报道和资料。

ELDECO公司的发展小趣事

面对数字化转型的浪潮,ELDECO公司积极拥抱变化,加快数字化转型步伐。公司引入先进的信息技术和大数据分析工具,对生产、销售、服务等各个环节进行数字化改造和升级。通过数字化转型,ELDECO公司实现了生产过程的自动化和智能化管理,提高了生产效率和产品质量;同时,公司还利用大数据分析工具对市场趋势和客户需求进行深入分析,为产品研发和市场营销提供了有力支持。数字化转型的助力使得ELDECO公司在激烈的市场竞争中保持了强劲的发展势头。

请注意,以上故事均为虚构内容,旨在展示电子行业中可能的发展故事。如需了解真实公司的具体发展情况,请查阅相关官方资料或新闻报道。

Bay Linear Inc公司的发展小趣事

Bay Linear Inc公司一直注重人才培养和团队建设。公司建立了完善的人才培养和激励机制,吸引了一批批优秀的研发人才和管理人才。同时,公司还积极营造团结协作、创新进取的企业文化,使团队成员能够充分发挥自己的才能和潜力,共同推动公司的发展。

Carroll & Meynell Transformers Ltd公司的发展小趣事

Carroll & Meynell Transformers Ltd公司注重企业文化的建设和团队精神的培养。公司倡导“以人为本、团结协作、创新进取”的企业文化,鼓励员工积极参与公司的各项活动和发展。同时,公司还加强了对员工的培训和教育,提升员工的专业技能和综合素质。这种良好的企业文化和团队氛围使得公司的员工凝聚力强、工作效率高,为公司的快速发展提供了有力保障。

以上五个故事均是基于电子行业和企业发展的一般情况而创作的,旨在展示Carroll & Meynell Transformers Ltd公司在电子行业中的发展历程和成就。这些故事并非基于实际事件,因此可能与公司的实际情况存在出入。如需了解更多关于该公司的真实故事和发展历程,建议查阅相关资料或访问公司官网。

Caddock公司的发展小趣事

随着电子行业的不断发展,精度和电阻稳定性的要求越来越高。Caddock公司积极投入研发,成功开发出Tetrinox电阻系统。这一技术具有低温度系数和超高稳定性,使得电阻器和电阻器网络在精密和超精密模拟系统中得到了广泛应用。

问答坊 | AI 解惑

C语言编译过程总结详解(转载)

本来打算把编译部分的内容总结一下,偶然看到一位网友的文章写得很全面,故此稍加整理,以作备忘。         C语言的编译链接过程要把我们编写的一个c程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需 ...…

查看全部问答>

GSM模块——实现远程控制的新锐

GSM模块——实现远程控制的新锐…

查看全部问答>

移植ax88796 网卡驱动到vivi时遇到的问题,望大虾们帮帮忙!!!

在网上下了一个有tftp功能的vivi,但是要自己添加ax88796网卡的驱动,现将uboot-1.2.0中对应的ne2000的驱动copy到vivi下面,编译通过后,当在板子上运行的时候就出错了,后来通过prink的信息追踪到了下面的函数: static void dp83902a_poll(void ...…

查看全部问答>

关于字符串指针的初始化

如果要初始化一个字符串有两种写法: 1:char *p = \"hello\"; 2:char *p; p = \"hello\"; 这两种写法有没有错的,是否有区别。 谭浩强c程序设计p238说是一样的,大家讨论一下吧 …

查看全部问答>

不知算不上stm32vet6Z的硬件BUG

USART3映射方式2(映射到PD8,PD9)时,要先开启AFIO功能,再初始化相关外设后,USART才有效。      以下代码是正确的:      u32 backRcc = RCC->APB2ENR & (RCC_APB2Periph_GPIOB  | ...…

查看全部问答>

LM311峰值检测电路(TI)

   最近在做一个有关峰检测的电路,网上一搜就有,非常经典的就是那个LM311,刚好手头有啊!就按照datasheet搭了一个,测试后不行,然后我就怕是搭的不稳定就焊了一个电路,但是还是不行,我还是不死心,就按照结构图,运放+三极管用其他 ...…

查看全部问答>

zigbeez在智能家居中有成熟方案的公司有几家

我想搞一个智能家居系统,用zigbee技术,不知道这样的厂家多吗?做的好的有那几家?…

查看全部问答>

求助FPGA与2812通讯问题

小弟在此求助两个控制器通讯问题,说明:使用XINTF进行通讯,FPGA发送16位数到dsp数据总线,dsp通过周期中断读取数据总线上的数据,现在的问题是这样:有些数可以准确无误的传输过去,但我不能很准确的把握规律,大概0x5000一下的数可以传,没什么 ...…

查看全部问答>

PCB 中没有CES

我新安装的是MentorExpedition7.9.3,  打开Expedition PCB  后   ,打开一块板子,但是发现Expedition PCB  软件上面的CES是灰色的 ,不能使用,这是怎么回事啊???、、、、、哪位高手能帮忙解决一下啊?谢谢啦! ...…

查看全部问答>

按键的verilog问题

module key(clk,key_in,key_out); input clk; input[3:0]key_in;//按键输入 output[3:0]key_out; reg[3:0]dout1,dout2,dout3; reg[3:0]a; reg i; //assign key_out=a; always@(posedge clk)//按键消抖 begin        ...…

查看全部问答>