精华内容
下载资源
问答
  • 矩阵按键行列反转扫描法

    千次阅读 2019-10-29 18:49:48
    51单片机 | 矩阵键盘行扫描 ———————————————————————————————————————————— 分类: 按结构原理分: ...矩阵式键盘识别方法(行扫描法) 检测列线的状态...

    51单片机 | 矩阵键盘行扫描

    ————————————————————————————————————————————

    分类:

    • 按结构原理分:

      • 触点式开关按键
      • 无触点开关按键
    • 接入方式

      • 独立式按键
      • 矩阵式键盘

    ————————————————————————————————————————————

    矩阵式键盘识别方法(行扫描法)

    • 检测列线的状态:

      列线Y4~Y7置高电平,行线Y0~Y3置低电平。只要有一列的电平为低,则表示键盘该列有一个或多个按键被按下。若所有列线全为高电平,则键盘中无按键按下。

    • 判断闭合按键所在的位置:

      行线置高电平,列线置低电平。检测行线的状态。

    • 举例:当按下第一行第一列的按键时

      • 行扫描,行线为低电平,列线为高电平,得到 1110 0000
      • 列扫描,行线为高电平,列线为低电平,得到 0000 1110
      • 将得到的结果进行或运算,得到 1110 1110,对应第一行第一列,十六进制为0xEE
    • 按键表

    bin

    hex

    1

    1

    1110 1110

    0xEE

    1

    2

    1101 1110

    0xDE

    1

    3

    1011 1110

    0xBE

    1

    4

    0111 1110

    0x7E

    2

    1

    1110 1101

    0xED

    2

    2

    1101 1101

    0xDD

    2

    3

    1011 1101

    0xBD

    2

    4

    0111 1101

    0x7D

    3

    1

    1110 1011

    0xEB

    3

    2

    1101 1011

    0xDB

    3

    3

    1011 1011

    0xBB

    3

    4

    0111 1011

    0x7B

    4

    1

    1110 0111

    0xE7

    4

    2

    1101 0111

    0xD7

    4

    3

    1011 0111

    0xB7

    4

    4

    0111 0111

    0x77

    ————————————————————————————————————————————

    矩阵式键盘应用实例

    实现结果:

    通过4*4矩阵键盘对应数码管显示0~F

     

    设计思路:

    • 当检测到按键被按下时,将此时行扫描的结果存入临时变量,再进行列扫描,得到的结果和临时变量进行或运算。
    • 通过数组存放按键和数码管编码,行列扫描得到结果后遍历数组,找到对应的编码位置并显示数码管编码

    实现代码:

     

    复制代码

     1 #include <reg52.h>
     2 typedef unsigned char uchar;
     3 typedef unsigned int uint;
     4 uchar code KEY_TABLE[] =
     5 {
     6     0xEE, 0xDE, 0xBE, 0x7E,
     7     0xED, 0xDD, 0xBD, 0x7D,
     8     0xEB, 0xDB, 0xBB, 0x7B,
     9     0xE7, 0xD7, 0xB7, 0x77
    10 };
    11 uchar code TABLE[] =
    12 {
    13     0x3F, 0x06, 0x5B, 0x4F,
    14     0x66, 0x6D, 0x7D, 0x07,
    15     0x7F, 0x6F, 0x77, 0x7C,
    16     0x39, 0x5E, 0x79, 0x71,
    17 };
    18 void Delay(uchar m)
    19 {
    20     --m;
    21 }
    22 void main()
    23 {
    24     uchar temp, key, i;
    25     while(1)
    26     {
    27         P3 = 0xF0;
    28         if (P3 != 0xF0)
    29         {
    30             Delay(2000);
    31             if (P3 != 0xF0)
    32             {
    33                 temp = P3;
    34                 P3 = 0x0F;
    35                 key = temp | P3;
    36                 for (i = 0; i < 16; ++i)
    37                     if (key == KEY_TABLE[i])
    38                         break;
    39                 P2 = TABLE[i];
    40             }
    41         }
    42     }
    43 }

    复制代码

    展开全文
  • ———————————————————————————————————————————— 分类: 按结构原理分: ...——————————————...矩阵式键盘识别方法(行扫描法) 检测列...

    ————————————————————————————————————————————

    分类:

    • 按结构原理分:
      • 触点式开关按键
      • 无触点开关按键
    • 接入方式
      • 独立式按键
      • 矩阵式键盘

    ————————————————————————————————————————————

    矩阵式键盘识别方法(行扫描法)

    • 检测列线的状态:

      列线Y4~Y7置高电平,行线Y0~Y3置低电平。只要有一列的电平为低,则表示键盘该列有一个或多个按键被按下。若所有列线全为高电平,则键盘中无按键按下。

    • 判断闭合按键所在的位置:

      行线置高电平,列线置低电平。检测行线的状态。

    • 举例:当按下第一行第一列的按键时
      • 行扫描,行线为低电平,列线为高电平,得到 1110 0000
      • 列扫描,行线为高电平,列线为低电平,得到 0000 1110
      • 将得到的结果进行或运算,得到 1110 1110,对应第一行第一列,十六进制为0xEE
    • 按键表

    bin

    hex

    1

    1

    1110 1110

    0xEE

    1

    2

    1101 1110

    0xDE

    1

    3

    1011 1110

    0xBE

    1

    4

    0111 1110

    0x7E

    2

    1

    1110 1101

    0xED

    2

    2

    1101 1101

    0xDD

    2

    3

    1011 1101

    0xBD

    2

    4

    0111 1101

    0x7D

    3

    1

    1110 1011

    0xEB

    3

    2

    1101 1011

    0xDB

    3

    3

    1011 1011

    0xBB

    3

    4

    0111 1011

    0x7B

    4

    1

    1110 0111

    0xE7

    4

    2

    1101 0111

    0xD7

    4

    3

    1011 0111

    0xB7

    4

    4

    0111 0111

    0x77

    ————————————————————————————————————————————

    矩阵式键盘应用实例

    实现结果:

    通过4*4矩阵键盘对应数码管显示0~F

     

    设计思路:

    • 当检测到按键被按下时,将此时行扫描的结果存入临时变量,再进行列扫描,得到的结果和临时变量进行或运算。
    • 通过数组存放按键和数码管编码,行列扫描得到结果后遍历数组,找到对应的编码位置并显示数码管编码

    实现代码:

     

     1 #include <reg52.h>
     2 typedef unsigned char uchar;
     3 typedef unsigned int uint;
     4 uchar code KEY_TABLE[] =
     5 {
     6     0xEE, 0xDE, 0xBE, 0x7E,
     7     0xED, 0xDD, 0xBD, 0x7D,
     8     0xEB, 0xDB, 0xBB, 0x7B,
     9     0xE7, 0xD7, 0xB7, 0x77
    10 };
    11 uchar code TABLE[] =
    12 {
    13     0x3F, 0x06, 0x5B, 0x4F,
    14     0x66, 0x6D, 0x7D, 0x07,
    15     0x7F, 0x6F, 0x77, 0x7C,
    16     0x39, 0x5E, 0x79, 0x71,
    17 };
    18 void Delay(uchar m)
    19 {
    20     --m;
    21 }
    22 void main()
    23 {
    24     uchar temp, key, i;
    25     while(1)
    26     {
    27         P3 = 0xF0;
    28         if (P3 != 0xF0)
    29         {
    30             Delay(2000);
    31             if (P3 != 0xF0)
    32             {
    33                 temp = P3;
    34                 P3 = 0x0F;
    35                 key = temp | P3;
    36                 for (i = 0; i < 16; ++i)
    37                     if (key == KEY_TABLE[i])
    38                         break;
    39                 P2 = TABLE[i];
    40             }
    41         }
    42     }
    43 }

     

     

     

       

       

    转载于:https://www.cnblogs.com/hughdong/p/6879891.html

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

    学到矩阵键盘这一块对网上别人写的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/

     

    转载于:https://www.cnblogs.com/yllinux/p/6942233.html

    展开全文
  • 原理简单来说就是:四个引脚推挽输出低电平(置0), 四个列引脚上拉输入,如果有按键按下,会连通行与列,导致某个列引脚电压被拉低,故输出寄存器不再是0X0F,而是0X0E,0X0D,0X0B,0X07,这样就判断出了那一列被...

    线反转法接线图如下。其原理简单来说就是:

    四个行引脚推挽输出低电平(置0), 四个列引脚上拉输入,

    如果有按键按下,会连通行与列,导致某个列引脚电压被拉低,故输出寄存器不再是0X0F,而是0X0E,0X0D,0X0B,0X07,

    这样就判断出了那一列被按下。

    此时反转输入输出,用同样的方法监测那一行被按下。

    最后返回键值。

    92230b095984419c648ea87dd4c0ba2c.png

    c600ba76c7ce96d289dd515bc0eff91e.png

    ba6e672d9e4de678f14b99c9e71d3a45.png
    //------------------------------header------------------------------------------
    #include "iostm8s208mb.h"
    //------------------------------common datatype---------------------------------
    typedef unsigned char uint8_t;
    typedef unsigned short uint16_t;
    typedef unsigned long uint32_t;
    #define u8 uint8_t
    #define u16 uint16_t
    #define u32 uint32_t
    //------------------------------macros------------------------------------------
    #define LCDRS       PF_ODR_ODR0
    #define LCDRW       PF_ODR_ODR3
    #define LCDEN       PF_ODR_ODR4
    #define LCDDATA     PB_ODR
    #define KeyPortIn   PC_IDR
    #define KeyPortOut  PC_ODR
    //------------------------------function declare--------------------------------
    void GPIO_init(void);
    void delay(u16 count);
    void LCD_init(void);
    void LCD_write(u8 data,u8 cmd_flag);
    void LCD_display(void);
    void LCD_lr_DIS(u8 line,u8 row,u8 z);
    u8 KEY_scan(void);
    //------------------------------------------------------------------------------
    u8 line1[]="==4*4 Keyboard==";
    u8 line2[]="[Keynum]:       ";
    u8 table3[]={'0','1','2','3','4','5','6','7','8','9'};
    //------------------------------main--------------------------------------------
    void main( void )
    {
        GPIO_init();
        LCD_init();
        LCD_display();
        u8 keydown;
        while (1)
        {
            keydown=KEY_scan();
            if(keydown!=0XFF)
            {
                LCD_lr_DIS(2,12,table3[keydown/10]);
                LCD_lr_DIS(2,13,table3[keydown%10]);
                delay(300);
            }
            LCD_lr_DIS(2,12,'N');
            LCD_lr_DIS(2,13,'o');
        }
    }
    //------------------------------functions---------------------------------------
    void GPIO_init(void)
    {
        PF_DDR=0XFF;
        PF_CR1=0XFF;
        PF_CR2=0X00;
        PF_ODR=0X00;
    
        PB_DDR=0XFF;
        PB_CR1=0XFF;
        PB_CR2=0X00;
        PB_ODR=0X00;
    
        PC_DDR=0XF0;
        PC_CR1=0XFF;
        PC_CR2=0X0F;
    }
    void delay(u16 count)
    {
        u8 i,j;
        while (count--)
        {
            for(i=0;i<50;i++)
                for(j=0;j<50;j++);
        }
    }
    void LCD_init(void)
    {
        LCD_write(0X38,0);
        LCD_write(0X0E,0);
        LCD_write(0X06,0);
        LCD_write(0X01,0);
    }
    void LCD_write(u8 data,u8 cmd_flag)
    {
        LCDRS=cmd_flag;
        LCDRW=0;
        LCDEN=1;
        delay(1);
        LCDDATA=data;
        LCDEN=0;
        delay(1);
    }
    void LCD_display(void)
    {
        LCD_write(0X80,0);
        for (u8 i = 0; i < 16; i++)
        {
            LCD_write(line1[i],1);
        }
        LCD_write(0XC0,0);
        for (u8 i = 0; i < 16; i++)
        {
            LCD_write(line2[i],1);
        }    
    }
    void LCD_lr_DIS(u8 line,u8 row,u8 z)
    {
        switch (line)
        {
        case 1:
            LCD_write(0X80+row,0);
            LCD_write(z,1);
            break;
        case 2:
            LCD_write(0XC0+row,0);
            LCD_write(z,1);
            break;
        default:
            break;
        }    
    }
    u8 KEY_scan(void)
    {
        PC_DDR=0XF0;
        PC_CR1=0XFF;
        PC_CR2=0X00;
        KeyPortOut=0X0F;
        u8 keypress=0XFF;
        if(KeyPortIn != 0X0F)
        {
            delay(10);
            switch (KeyPortIn)
            {
                case 0X0E:keypress=0;break;
                case 0X0D:keypress=1;break;
                case 0X0B:keypress=2;break;
                case 0X07:keypress=3;break;
                default:keypress=0XFF;break;
            };
            PC_DDR=0X0F;
            PC_CR1=0XFF;
            PC_CR2=0X00;
            KeyPortOut=0XF0;
            if(KeyPortIn!=0XF0)
            {
                delay(10);
                switch (KeyPortIn)
                {
                    case 0XE0:keypress +=0;break;
                    case 0XD0:keypress +=4;break;
                    case 0XB0:keypress +=8;break;
                    case 0X70:keypress +=12;break;
                    default:keypress=0XFF;break;
                };
                while(KeyPortIn!=0XF0);//按键松手检测
            }
        }
        return keypress;
    }
    展开全文
  • C51矩阵键盘扫描

    千次阅读 2020-02-16 17:58:34
    矩阵式键盘识别方法(行扫描法) 检测列线的状态: 列线Y4-Y7置高电平,行线Y0-Y3置低电平。只要有一列的电平为低,则表示键盘该列有一个或多个按键被按下。若所有列线全为高电平,则键盘中无按键按下。 判断闭合...
  • 矩阵键盘扫描方法

    2021-05-08 18:57:53
    一、行列扫描法 (单片机为例) 单片机行列式键盘扫描原理如下: 1、线P10~P13为输出线,列线P14~P17为输入线。一开始单片机将线(P10~P13)全部输出低电平,此时读入列线数据,若列线全为高电平则没有键按下...
  • 按键扫描(一)

    2021-01-06 17:33:59
    矩阵式键盘识别方法(行扫描法) 检测列线的状态: 列线Y4~Y7置高电平,行线Y0~Y3置低电平。只要有一列的电平为低,则表示键盘该列有一个或多个按键被按下。若所有列线全为高电平,则键盘中无按键按下。 ...
  • 由于要写工具较多,SO,我会分两部分写……0×02 端口扫描脚本编写端口扫描原理:端口扫描,顾名思义,就是逐个对一段端口或指定的端口进行扫描。通过扫描结果可以知道一台计算机上都提供了哪些服务,然后就可以...
  • 基于STM32 4x4键盘扫描 小白接触ARM快两周了,开发板上4个按键已经不能满足学习需要。...浏览过多篇文章后决定尝试翻转来进行矩阵键盘扫描,丢出键盘原理图: 四四列共八个IO口,矩阵键盘扫描难点
  • (1)单片机系统键盘原理行列式键盘的接法比独立式键盘的接复杂,编程实现上也会比较复杂。但是,在占用相同的I/O端口的情况下,行列式键盘的接会比独立式接允许的按键数量多,其原理图如图1所示。 图1 4×...
  • 五子棋连珠原理

    千次阅读 2018-06-19 20:41:33
    ,该图是五子棋的棋盘,五子棋的棋盘是 x为(0,14),y为(0,14)既 x, y各为15以该图的中心棋子为例,我们知道要五子连珠,无非就是四种可能 ,如图所示红线,绿线,蓝线,黑线,连成5子这就有了四种扫描棋子的...
  •  行列式键盘的工作方式是先用列线发送扫描字,然后读取线的状态,查看是否有按键按下。键盘部分提供一种扫描的工作方式,可以和具有64个按键的矩阵键盘相连接,能对键盘不断扫描、自动消抖、自动识别按下的键
  • 提出一种步进扫描投影光刻机承片台不平度检测新技术。在晶圆与承片台存在不同偏移量时,利用线性差分传感器在线测量晶圆上不同点的局部高度;通过建立临时边界条件,以递推消除晶圆面形影响,并逐行计算出承片台的相对...
  • 嵌入式硬件系统中通过简单的输入设备可以获取有用的信息,进行参数设置以及执行相关任务。...矩阵键盘就是采用行列矩阵形式构成键盘,利用行扫描法或反转法读取按键的特征值来决定按键的结果。 嵌入式考试用
  • 程序设计内容 8X8点阵LED工作原理说明 :8X8点阵共需要64个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一列置1电平,某一置0电平,则相应的二极管就亮;因此要实现一根柱形的亮...
  • 线反转接线图如下。其原理简单来说就是: 四个引脚推挽输出低电平(置0), 四个列引脚上拉输入, 如果有按键按下,会连通行与列,导致某个列引脚电压被拉低,故输出寄存器不再是0X0F,而是0X0E,0X0D,0X0B,0X...
  • (1)单片机系统键盘原理行列式键盘的接法比独立式键盘的接复杂,编程实现上也会比较复杂。但是,在占用相同的I/O端口的情况下,行列式键盘的接...行列式键盘的工作方式是先用列线发送扫描字,然后读取线的状态,...
  • 版本: 扫描版 出版社: 人民邮电出版社书号: 9787115191601发行时间: 2009年 地区: 大陆 语言: 简体中文 简介: 内容简介: 通过《CorelDRAW服装设计实用教程(第二版)(1DVD)》学习,读者能够对各类服装进行数字化...
  • 编译原理老师要求写一个java的...2.一行一行扫描,行里逐字扫描,把界符和运算符当做分割符,遇到就先停下开始判断。若是以 英文字母、$、下划线开头,则可能是变量和关键字,在判断是关键字还是变量。若是数字开...
  • 编译原理老师要求写一个java的...2.一行一行扫描,行里逐字扫描,把界符和运算符当做分割符,遇到就先停下开始判断。若是以 英文字母、$、下划线开头,则可能是变量和关键字,在判断是关键字还是变量。若是数字开...
  • 编译原理老师要求写一个java的...2.一行一行扫描,行里逐字扫描,把界符和运算符当做分割符,遇到就先停下开始判断。若是以 英文字母、$、下划线开头,则可能是变量和关键字,在判断是关键字还是变量。若是数字开...
  • 5.1.5 采集器陷阱及“抽税” 5.1.6 PageRank在搜索引擎中的使用 5.1.7 习题 5.2 PageRank的快速计算 5.2.1 转移矩阵的表示 5.2.2 基于Map-Reduce的PageRank迭代计算 5.2.3 结果向量合并时的组合器使用 ...
  • 5.1.5 采集器陷阱及“抽税” 5.1.6 PageRank在搜索引擎中的使用 5.1.7 习题 5.2 PageRank的快速计算 5.2.1 转移矩阵的表示 5.2.2 基于Map-Reduce的PageRank迭代计算 5.2.3 结果向量合并时的组合器使用 ...
  • 8.2.3 SAX引擎读取XML文件的原理 241 8.2.4 将XML文件转换成Java对象 242 8.2.5 文件压缩(Jar、Zip) 245 8.3 SQLite数据库 249 8.3.1 SQLite数据库管理工具 249 8.3.2 SQLiteOpenHelper类与自动升级...
  • Python OpenCV 车牌定位(纵向定位车牌)

    千次阅读 2019-06-10 23:46:56
    查阅了资料,车牌定位方法有数学形态学法,行扫描法,神经网络法,颜色信息法,小波变换法。尝试了数学形态法,但是定位效果不好,效果不稳定,可能是处理图片不够好的问题。于是就尝试了行扫描法,通过车牌区域的...
  • 前面提到了独立按键,可见,独立按键是由矩阵键盘分离而来的。... 具体的扫描方式为: 先把P3^0~P3^7高四位和第四位赋不一样的电平值,当确定有键按下时,检测按下的是哪一或哪一列(原本高电平...
  • 前面提到了独立按键,可见,独立按键是由矩阵键盘分离而来的。... 具体的扫描方式为: 先把P3^0~P3^7高四位和第四位赋不一样的电平值,当确定有键按下时,检测按下的是哪一或哪一列(原本高电平...
  • 行扫描算法;扫描线算法 ;带扫描算法 ;4复数积分算法 ;5边界代数算法 ;边界代数法原理扩展;弧段名称 ;栅格数据向矢量数据转换 ;栅格数据向矢量数据转换 ;基于图像处理的矢量化算法 ;1;经典算法 ;跟踪 ;3;基于窗口匹配...

空空如也

空空如也

1 2 3 4 5
收藏数 99
精华内容 39
关键字:

行扫描法原理