疑问----单片机矩阵键盘行列反转扫描法

学到矩阵键盘这一块对网上别人写的C代码有些疑问,希望有能看到的大牛帮助解答。

矩阵键盘和独立键盘原理图:

原理:对于图右侧的矩阵键盘,把P3口的低四位(P3.0 ~ P3.3)和高四位(P3.4 ~ P3.7)分别置1,只要有按键被按下,那么与之对应的P3口某一位将由高电平被拉低,两次分别测得了行值和列值即确定了哪一个按键被按下了。

比如:先把低四位赋高电平即 P3 = 0000_1111 假如 S15 被按下了,那么 P3.2 就被拉成低电平即 P3 = 0000_1011 ,此时再把高四位赋高电平即 P3 = 1111_0000 ,那么 P3.5 就被拉成低电平即 P3 = 1101_0000 。最后,把两次测得的 P3 值相加 0000_1011 + 1101_0000 = 1101_1011(行列值为第三行第二列)

(1)网上最常见的写法:

 1 P3 = 0x0f;      //0000 1111
 2 if ((P3 & 0x0f) != 0x0f)       //按键检测
 3 {
 4     delay(3);       //软件消抖
 5     if ((P3 & 0x0f) != 0x0f)         //按键检测
 6     {
 7         row_value = P3 & 0x0f;      //扫描行值
 8         P3 = row_value | 0xf0;
 9         colume_value = P3 & 0xf0;       //扫描列值
10        // while ((P3 & 0xf0) != 0xf0);        //松手检测
11         return (row_value + colume_value);
12     }
13 }

(2):

 P3 = 0x0f;      //0000 1111
if ((P3 & 0x0f) != 0x0f)      //按键检测
{
    delay(3);       //软件消抖
    if ((P3 & 0x0f) != 0x0f)      //按键检测
    {
        row_value = P3 & 0x0f;      //扫描行值
        P3 = 0xf0;
        colume_value = P3 & 0xf0;       //扫描列值
        //while ((P3 & 0xf0) != 0xf0);        //松手检测
        return (row_value + colume_value);
    }
}

(3):

P3 = 0x0f;      //0000 1111
if ((P3 & 0x0f) != 0x0f)         //按键检测
{
    delay(3);       //软件消抖
    if ((P3 & 0x0f) != 0x0f)        //按键检测
    {
        row_value = P3;     //扫描行值
        P3 = 0xf0;
        colume_value = P3 ;     //扫描列值
        //while ((P3 & 0xf0) != 0xf0);        //松手检测
        return (row_value + colume_value);
    }
}

(4)这个符合我所说的原理和例子:

P3 = 0x0f;      //0000 1111
if (P3 != 0x0f)          //按键检测
{
    delay(3);       //软件消抖
    if (P3 != 0x0f)        //按键检测
    {
        value = P3;     //扫描行值
        P3 = 0xf0;
        value |= P3 ;       //扫描列值
        //while (P3 != 0xf0);     //松手检测
        return (value);
    }
}

我已经用开发板实测了,上面这四个都对的。

我的疑问:我不明白为什么常见写法要写 &0x0f 、 &0xf0 或者 |0xf0 这样写有什么特别的作用没有?感觉写与不写原理上都对,那何必要写?(特别是写法 1 和写法 4 看起来差别蛮大的呀)                     ------------------2017-06-04    22:05:02

如有错误还请指出,如有侵权还请告知,如需转载请注明出处!

本人博客:http://www.cnblogs.com/yllinux/

时间: 2024-08-19 08:32:21

疑问----单片机矩阵键盘行列反转扫描法的相关文章

单片机入门-矩阵键盘控制数码管显示

任务简述:通过按下4X4矩阵键盘实现数码管对应显示数字 实现方式:通过行列分接法,可以节省使用单片机的I/O口,扫描矩阵键盘是否有按下,判断P2端口得到的值. protues 硬件系统 单片机晶振复位电路: 锁存器.上拉电阻: 4x4矩阵键盘: 代码实现: void key44scan(void)//键盘扫描函数 { uint t; P2=0xfe; t=P2; t=t&0xf0; if(t!=0xf0) { delay(); t=P2; switch(t) { case 0xee:keynum

51单片机实现矩阵键盘行扫描

-------------------------------------------- 分类: 按结构原理分: 触点式开关按键 无触点开关按键 接入方式 独立式按键 矩阵式键盘 -------------------------------------------- 矩阵式键盘识别方法(行扫描法) 检测列线的状态: 列线Y4~Y7置高电平,行线Y0~Y3置低电平.只要有一列的电平为低,则表示键盘该列有一个或多个按键被按下.若所有列线全为高电平,则键盘中无按键按下. 判断闭合按键所在的位置: 行

AVR单片机教程——矩阵键盘

本文隶属于AVR单片机教程系列. ? 开发板上有4个按键,我们可以把每一个按键连接到一个单片机引脚上,来实现按键状态的检测.但是常见的键盘有104键,是每一个键分别连接到一个引脚上的吗?我没有考证过,但我们确实有节省引脚的方法. 矩阵键盘 这是一个4*4的矩阵键盘,共有16个按键只需要8个引脚就可以驱动.我们先来看看它的原理. 每个按键有两个引脚,当按键按下时接通.每一行的一个引脚接在一起,分别连接到左边4个端口,称为"行引脚":每一列的另一个引脚接在一起,分别连接到右边的4个端口,称

51单片机第四弹---矩阵键盘

原理图: 原理: 和独立键盘相似 /******************************************************************************* * 实 验 名 : 矩阵键盘实验 * 使用的IO : 数码管使用P0 矩阵键盘使用P3 * 实验效果 : 显示独立键盘的按键值 * 注 意 : *******************************************************************************/

十天学会单片机Day2键盘检测(独立键盘、矩阵键盘)

1.键盘的分类 编码键盘:键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或键值的称为编码键盘,如计算机键盘 非编码键盘:靠软件编程来识别的称为非编码键盘.独立键盘.矩阵键盘 2.按键消抖              如图,理想波形与实现波形之间是有区别的.实际波形在按下和释放的瞬间都有抖动现象,抖动事件的长短与按键的机械特性有关,一般为5~10ms.通常我们手动按下键然后立即释放,这个动作中稳定闭合时间超过20ms.因此检测键盘是否按下时,需加上去抖动操作. 一般有两种消抖方式: 硬件消

51单片机的数码管和矩阵键盘

使用4*4的矩阵键盘和一个数码管 在4*4的矩阵键盘上编码0-F的字符,和一个数码管显示每个键盘上输入的字符. //4*4键盘检测程序,按下键后相应的代码显示在数码管上 #include<reg51.h> typedef unsigned char UINT8; UINT8 i=100; UINT8 j,k,temp,key; void delay(unsigned char i) { for(j=i;j>0;j--) for(k=125;k>0;k--); } UINT8 cod

单片机第8课:矩阵键盘扫描

JP3接P0,VCC接+5V,矩阵键盘的左边八个引脚接在P1上面.想要的结果是按第0个按键,数码管显示0,以此类推.注意,这里的数码管是共阳极的. #include<reg51.h> #define uint unsigned int #define uchar unsigned char uchar code table[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0x88, 0x83, 0xc6, 0xa

51、52单片机使用矩阵键盘

为了学习矩阵键盘,先做个小小的实验目标 : 按下矩阵键盘后 ,数码管显示按下的是第几键. 我的矩阵键盘是4X4的,操作原理是先检测按下的键是哪行.再确定是哪列.这样就能识别是按的哪个键了. 首先看电路图,确定键盘是连CPU的哪个针.我的开发板上是连接的P1,具体是P10~P17,八个针对应逻辑的8位. (此处省略,直接贴代码) #include<reg52.h>void delay(int n);void juzhen(void); char duanxuan[16]={0x3f,0x06,0

「雕爷学编程」Arduino动手做(26)——4X4矩阵键盘模块

37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手试试做实验,不管成功与否,都会记录下来---小小的进步或是搞不定的问题,希望能够抛砖引玉. [Arduino]108种传感器模块系列实验(资料+代码+图形+仿真) 实验二十六:4X4矩阵键盘模块(轻触式按键) 矩阵键盘 是单片机外部设备中所使用的排布类似于矩阵的键盘组.矩阵式结构的键盘显