矩阵键盘

矩阵键盘的检测

心不动则不痛 提交于 2020-02-19 10:14:27
由于矩阵键盘中每一个按键的两个接线口都是接在IO口上的,所以我们就必须在软件里面控制单片机在每个独立按键的两端加上不同的电平。 从上面的原理图中可以看出 P1 口的高四位控制 行,低四位控制列;所以我们就可以写 P1 = 0X0F 或者写 P1 = 0XF0,这样就实现了在每一个独立按键两端加上不同的电平。 代码编写流程和独立按键一样,第一步要先检测到按键按下,根据上面的原理图,矩阵键盘检测按键是否按下只要给 P1 口赋值 0X0F,然后检测 P1 口的值是否还是 0X0F即可。 之后就要消除抖动,消除抖动的方法还是一样,延时一段时间即可: MatrixKeyValue=0xf0; if(MatrixKeyValue != 0xf0)  //检测是否有按键按下 {   delay(10);   if(MatrixKeyValue != 0xf0)   {   } } 判断到底是哪个按键按下的思路有两种: 1、逐行扫描 逐行扫描就是说先扫描第一行中的哪个按键按下了,如果没有再扫描第二行,看一下是不是第二行里的某个按键按下了,如果还没有找到按下的那个按键,那么就继续扫描第三行、第四行,知道找出哪个按键被按下了。这个代码实现比较简单,而且这种扫描方法不怎么常用,效率不高,所以这里我就不写了。 2、行列扫描 行列扫描就是说先扫描所有的行,确定是哪一行的按键被按下了,之后再扫描所有的列

关于按键、矩阵键盘的相关知识

a 夏天 提交于 2019-12-22 06:31:28
1 普通按键 第一种接线方法(带电源) 当不触碰按键时,单片机的I/O口通过电阻接至正电源,此时线路无电流通过,I/O口为高电平。 当触碰按键时,正电源通过电阻接至地,此时有电流通过,电压全部压在电阻上,电阻下端电压为0,即I/O口为低电平。 1 if(!K) 2 { 3 delay(50); 4 if(!K) 5 { 6 run(); 7 } 8 } 第二种接线方法(无电源) 当不触碰按键时,单片机的I/O口悬空,但不为0(也有可能不为1),即非低电平状态。 当触碰按键时,单片机的I/O口与地接通,此时I/O口为低电平。 1 if(!K) 2 { 3 delay(50); 4 if(!K) 5 { 6 run(); 7 } 8 } 2 矩阵键盘 第一种接线方法(带电源) 先进行键盘列扫描,如P2循环输出{0xef,0xdf,0xbf,0x7f},利用(P2 & 0x0f)判断有无按键压下,然后确定键值。 1 char key_scan[]={0xef,0xdf,0xbf,0x7f}; 2 char key_buf[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77}; 3 char getKey() 4 { 5 char i=0,j=0; 6 for(i=0;i<4

矩阵键盘的单个出发---代码简单,但是代码量较大,下一例将给出压缩后的代码

你。 提交于 2019-12-06 13:56:35
/***12个按键,每一个按键都会让蜂鸣器发出“嘀”的一声***/ #include "REG52.H" #define const_voice_short 40 #define const_key_time 20 void initial_myself(); void initial_peripheral(); void delay_long(unsigned int uiDelaylong); void T0_time(); void key_service(); void key_scan(); sbit key_sr1=P0^1; //第一行输入 sbit key_sr2=P0^2; //第二行输入 sbit key_sr3=P0^3; //第三行输入 sbit key_dr1=P0^4; //第一列输出 sbit key_dr2=P0^5; //第二列输出 sbit key_dr3=P0^6; //第三列输出 sbit key_dr4=P0^7; //第四列输出 sbit beep_dr=P1^5; unsigned char ucKeyStep=1; //按键扫描步骤变量 unsigned char ucKeySec=0; //被触发的按键编号 unsigned int uiKeyTimeCnt=0; //按键去抖动延时计数器 unsigned char

单片机普通行列矩阵键盘驱动

若如初见. 提交于 2019-12-01 07:08:45
// 普通按键,行4*(列3+地1) // 1.ROW行线设置为输入上拉(下降沿中断),COL列线输出低+地; // 2.ROW行线产生中断,则说明有按键按下,启动定时器20ms做去抖动处理; // 3.定时器中检测对应的ROW行线输入电平,如果仍为低则认为有效按下,否则认为抖动; // 4.COL列线设置为输入上拉,ROW行线输出低; // 5.检测COL列线是否被拉低,如果有任意列线为低,则确定按下按键为对应的列; // 6.如果三个列线都没有被拉低,则确定按下按键为地列线; 来源: https://www.cnblogs.com/utank/p/11666589.html

进阶项目(11) 矩阵键盘程序设计讲解

一世执手 提交于 2019-11-29 15:39:06
写在前面的话 在使用按键的时候,如果按键不多的话,我们可以直接让按键与FPGA相连接,但是如果按键比较多的时候,如果还继续使用直接让按键与FPGA相连接的话,会大量增加FPGA端口的消耗,为了减少FPGA端口的消耗,我们可以把按键设计成矩阵的形式。接下来,梦翼师兄将和大家一起学习扫描键盘的电路原理以及驱动方式。 项目需求 设计 4*4 矩阵键盘 按键 扫描模块 , 正确解析按键值 。 矩阵键盘的原理 由上图可以知道,矩阵键盘的行row(行)与col(列)的交点,都是通过一个按键相连接。传统的一个按键一个端口的方法,若要实现16个按键,则需要16个端口,而现在这个矩阵键盘的设计,16个按键,仅仅需要8个端口,如果使用16个端口来做矩阵键盘的话,可以识别64个按键,端口的利用率远远比传统的设计高好多,所以如果需要的按键少的话,可以选择传统的按键设计,如果需要的按键比较多的话,可以采用这种矩阵键盘的设计。而我们现在就以扫描法为例来介绍矩阵键盘的工作原理。 首先col(列)是FPGA给矩阵键盘输出的扫描信号,而row(行)是矩阵键盘反馈给FPGA的输入信号,用于检测哪一个按键被按下,示意图如下: 如上图所示,FPGA给出扫描信号COL[3:0],COL = 4’b0111,等下一个时钟周期COL = 4’b1011,再等下一个时钟周期COL = 4’b1101,再等下一个时钟周期COL =

07-小蜜蜂单片机矩阵键盘

对着背影说爱祢 提交于 2019-11-26 06:29:59
做题之前要先理解一下按键的内部结构。 矩阵键盘中有两个I/O端口,一个作为输入,一个作为输出。 当按键按下时,两个端口相连导通(我是这样认为的),当作为输入的I/O端口输入高电平时,输出就是高电平,反之就是低电平。 矩阵键盘扫描原理 # include "reg52.h" unsigned char code SMG_duanma [ 18 ] = //code 是表格形式 { 0xc0 , 0xf9 , 0xa4 , 0xb0 , 0x99 , 0x92 , 0x82 , 0xf8 , 0x80 , 0x90 , 0x88 , 0x80 , 0xc6 , 0xc0 , 0x86 , 0x8e , 0xbf , 0x7f } ; sfr P4 = 0xC0 ; sbit R1 = P3 ^ 0 ; sbit R2 = P3 ^ 1 ; sbit R3 = P3 ^ 2 ; sbit R4 = P3 ^ 3 ; sbit C4 = P3 ^ 4 ; sbit C3 = P3 ^ 5 ; sbit C2 = P4 ^ 2 ; sbit C1 = P4 ^ 4 ; void SelectHC573 ( unsigned char channel ) //锁存器选通 { switch ( channel ) { case 4 : P2 = ( P2 & 0x1f ) | 0x80 ;