历史上的今天
今天是: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;
上一篇:单片机读入4*4矩阵键盘
史海拾趣
|
本来打算把编译部分的内容总结一下,偶然看到一位网友的文章写得很全面,故此稍加整理,以作备忘。 C语言的编译链接过程要把我们编写的一个c程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需 ...… 查看全部问答> |
|
移植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说是一样的,大家讨论一下吧 … 查看全部问答> |
|
USART3映射方式2(映射到PD8,PD9)时,要先开启AFIO功能,再初始化相关外设后,USART才有效。 以下代码是正确的: u32 backRcc = RCC->APB2ENR & (RCC_APB2Periph_GPIOB | ...… 查看全部问答> |
|
最近在做一个有关峰检测的电路,网上一搜就有,非常经典的就是那个LM311,刚好手头有啊!就按照datasheet搭了一个,测试后不行,然后我就怕是搭的不稳定就焊了一个电路,但是还是不行,我还是不死心,就按照结构图,运放+三极管用其他 ...… 查看全部问答> |
|
小弟在此求助两个控制器通讯问题,说明:使用XINTF进行通讯,FPGA发送16位数到dsp数据总线,dsp通过周期中断读取数据总线上的数据,现在的问题是这样:有些数可以准确无误的传输过去,但我不能很准确的把握规律,大概0x5000一下的数可以传,没什么 ...… 查看全部问答> |
|
我新安装的是MentorExpedition7.9.3, 打开Expedition PCB 后 ,打开一块板子,但是发现Expedition PCB 软件上面的CES是灰色的 ,不能使用,这是怎么回事啊???、、、、、哪位高手能帮忙解决一下啊?谢谢啦! ...… 查看全部问答> |
|
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 ...… 查看全部问答> |




