0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

矩阵键盘的按键识别方法_矩阵键盘扫描程序

姚小熊27 来源:网络整理 作者:网络整理 2020-04-20 09:39 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

矩阵键盘的按键识别方法

矩阵键盘的按键识别方法来自简单日记网精选推荐。在学习有关矩阵键盘的时候,往往要学会矩阵键盘的按键识别方法,那么矩阵键盘的按键识别方法有哪些呢?小编带着你来了解。

方法一:行扫描法

1、判断键盘中有无键按下 将全部行线p1.4-p1.7置低电平,当然p1.0-p1.3为高电平(或许芯片内部已经将这些引脚它上拉),然后检测列线的状态。只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按键之中。若所有列线均为高电平,则键盘中无键按下。

2、判断闭合键所在的位置 在确认有键按下后,即可进入确定具体闭合键的过程。其方法是:依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。

方法二:先从p1口的高四位输出低电平,低四位输出高电平,从p1口的低四位读取键盘状态。再从p1口的低四位输出低电平,高四位输出高电平,从p1口的高四位读取键盘状态。将两次读取结果组合起来就可以得到当前按键的特征编码。

矩阵键盘扫描程序

使用芯片STM8S003

所用端口:PD2~PD6, PA1~PA3

其中,PD3~PD6为输出,PA1~PA3 / PD2为输入(默认上拉)

/*

PortCom BIT7 BIT6 BIT5 BIT4 BIT3 BIT2 BIT1 BIT0

PD6 PD5 PD4 PD3 PD2 PA3 PA2 PA1

*/

程序如下:

/* 添加包含芯片的头文件 */

#include《iostm8s103f3.h》

volatile unsigned char CF[4]; //按键触发标志(表示4列,每一列同一行的

//值是一样的但列标不一样来区分不同列的键)

volatile unsigned char Cont[4];

unsigned char KeyVal; //键值

//unsigned char KeyOut[4] = {0xef,0xdf,0xbf,0x7f}; //4X4按输出端控制

//unsigned char KeyOut[4] = {0x7f,0xbf,0xdf,0xef};

unsigned char KeyOut[4] = {0x3f,0x5f,0x6f,0x77}; //两个端口组合4x4端口输出控制

unsigned char PortCom; //两个端口组合的端口

unsigned char cIn0,cIn1,cIn2,cIn3;

/*******************************************************************************

**函数名称:void delay(unsigned int ms) Name: void delay(unsigned int ms)

**功能描述:大概延时

**入口参数:unsigned int ms 输入大概延时数值

**输出:无

*******************************************************************************/

void delay(unsigned int ms)

{

unsigned int x , y;

for(x = ms; x 》 0; x--)

for(y = 1000 ; y 》 0 ; y--);

}

/*

**描述:新型4X4按键扫描程序 放在1ms-10ms中断内使用(十分稳定不需要再写消抖程序)

**备注:按键弹起时 keyVal = 0 单键按下 keyVal 有16个值,你自己程序可以针对不同值

**进行不同程序操作 keyVal单键值分别为

**0x01,0x02,0x04,0x08,

**0x11,0x12,0x14,0x18,

**0x21,0x22,0x24,0x28,

**0x31,0x32,0x34,0x38,

*/

void Key_Head()

{

unsigned char ReadData[4];

static unsigned char i;

/*

PortCom BIT7 BIT6 BIT5 BIT4 BIT3 BIT2 BIT1 BIT0

PD6 PD5 PD4 PD3 PD2 PA3 PA2 PA1

*/

cIn0 = 0;

cIn1 = 0;

cIn2 = 0;

cIn3 = 0;

if(++i》=4)i=0;

// PortCom = KeyOut[i]|0x0f; //忽略低4位

//输出扫描

PD_ODR = KeyOut[i];

//输入侦测

cIn0 = PA_IDR_bit.IDR1;

cIn1 = PA_IDR_bit.IDR2;

cIn2 = PA_IDR_bit.IDR3;

cIn3 = PD_IDR_bit.IDR2;

PortCom = (cIn3《《3) | (cIn2《《2) | (cIn1《《1) | cIn0;

ReadData[i] = (PortCom|0xf0)^0xff; //忽略高4位 取反

CF[i] = ReadData[i] & (ReadData[i] ^ Cont[i]);

Cont[i] = ReadData[i];

//输出键值

switch(CF[i])//第i列

{

case 0x08: KeyVal = ((i《《4)+8);break;

case 0x04: KeyVal = ((i《《4)+4);break;

case 0x02: KeyVal = ((i《《4)+2);break;

case 0x01: KeyVal = ((i《《4)+1);break;

default:KeyVal = 0;break;

}

delay(30);

}

/*******************************************************************************

**函数名称:void ALL_LED_Init() Name: void ALL_LED_Init()

**功能描述:初始化LED灯的IO口设为输出

**入口参数:无

**输出:无

*******************************************************************************/

void ALL_LED_Init()

{

//LED1 Init

// PD_DDR_bit.DDR2 = 1; //设置端口PD-》2的输入输出方向寄存器为输出方向

// PD_CR1_bit.C12 = 1; //设置PD2为推挽输出

// PD_CR2_bit.C22 = 1; //设置PD2的输出最大速度为10MHZ

//LED2 Init

PC_DDR_bit.DDR7 = 1; //设置端口PC-》7的输入输出方向寄存器为输出方向

PC_CR1_bit.C17 = 1; //设置PC7为推挽输出

PC_CR2_bit.C27 = 1; //设置PC7的输出最大速度为10MHZ

//LED3 Init

PC_DDR_bit.DDR6 = 1; //设置端口PC-》6的输入输出方向寄存器为输出方向

PC_CR1_bit.C16 = 1; //设置PC6为推挽输出

PC_CR2_bit.C26 = 1; //设置PC6的输出最大速度为10MHZ

//LED4 Init

PC_DDR_bit.DDR3 = 1; //设置端口PC-》3的输入输出方向寄存器为输出方向

PC_CR1_bit.C13 = 1; //设置PC3为推挽输出

PC_CR2_bit.C23 = 1; //设置PC3的输出最大速度为10MHZ

}

/*******************************************************************************

**函数名称:ALLKeyInit()

**功能描述:配置Key1 , Key2 , Key3输入按键

**入口参数:无

**输出:无

*******************************************************************************/

void ALLKeyInit()

{

//PA1_Init

PA_DDR_bit.DDR1 = 0; //GPA-》PIN3 设置为输入模式

PA_CR1_bit.C11 = 1; //GPA-》PIN3 带上拉电阻输入

PA_CR2_bit.C21 = 0; //GPA-》PIN3 禁止外部中断

//PA2_Init

PA_DDR_bit.DDR2 = 0; //GPA-》PIN3 设置为输入模式

PA_CR1_bit.C12 = 1; //GPA-》PIN3 带上拉电阻输入

PA_CR2_bit.C22 = 0; //GPA-》PIN3 禁止外部中断

//PA3_Init

PA_DDR_bit.DDR3 = 0; //GPA-》PIN3 设置为输入模式

PA_CR1_bit.C13 = 1; //GPA-》PIN3 带上拉电阻输入

PA_CR2_bit.C23 = 0; //GPA-》PIN3 禁止外部中断

//PD2_Init

PD_DDR_bit.DDR2 = 0; //GPD-》PIN3 设置为输入模式

PD_CR1_bit.C12 = 1; //GPD-》PIN3 带上拉电阻输入

PD_CR2_bit.C22 = 0; //GPD-》PIN3 禁止外部中断

//PD3_Init

PD_DDR_bit.DDR3 = 1; //GPD-》PIN3 设置为输入模式

PD_CR1_bit.C13 = 1; //GPD-》PIN3 带上拉电阻输入

PD_CR2_bit.C23 = 1; //GPD-》PIN3 禁止外部中断

//PD4_Init

PD_DDR_bit.DDR4 = 1; //GPD-》PIN3 设置为输入模式

PD_CR1_bit.C14 = 1; //GPD-》PIN3 带上拉电阻输入

PD_CR2_bit.C24 = 1; //GPD-》PIN3 禁止外部中断

//PD5_Init

PD_DDR_bit.DDR5 = 1; //GPC-》PIN5 设置为输入模式

PD_CR1_bit.C15 = 1; //GPC-》PIN5 带上拉电阻输入

PD_CR2_bit.C25 = 1; //GPC-》PIN5 禁止外部中断

//PD6_Init

PD_DDR_bit.DDR6 = 1; //GPC-》PIN5 设置为输入模式

PD_CR1_bit.C16 = 1; //GPC-》PIN5 带上拉电阻输入

PD_CR2_bit.C26 = 1; //GPC-》PIN5 禁止外部中断

}

int main(void)

{

CLK_CKDIVR = 0x00; //内部时钟为1分频

ALL_LED_Init(); //调用LED1初始化函数

ALLKeyInit(); //调用按钮初始化函数

while(1)

{

Key_Head();

switch(KeyVal)

{

case 0x01:

{

PC_ODR ^= 0x80; //异或取反LED2使其亮灭

break;

}

case 0x02:

{

PC_ODR ^= 0x40; //异或取反LED3使其亮灭

break;

}

case 0x04:

{

PC_ODR ^= 0x08; //异或取反LED4使其亮灭

break;

}

case 0x08:

{

PC_ODR ^= 0x80; //异或取反LED2使其亮灭

PC_ODR ^= 0x40; //异或取反LED3使其亮灭

break;

}

case 0x11:

{

PC_ODR ^= 0x80; //异或取反LED2使其亮灭

break;

}

case 0x12:

{

PC_ODR ^= 0x40; //异或取反LED3使其亮灭

break;

}

case 0x14:

{

PC_ODR ^= 0x08; //异或取反LED4使其亮灭

break;

}

case 0x18:

{

PC_ODR ^= 0x80; //异或取反LED2使其亮灭

PC_ODR ^= 0x40; //异或取反LED3使其亮灭

break;

}

case 0x21:

{

PC_ODR ^= 0x80; //异或取反LED2使其亮灭

break;

}

case 0x22:

{

PC_ODR ^= 0x40; //异或取反LED3使其亮灭

break;

}

case 0x24:

{

PC_ODR ^= 0x08; //异或取反LED4使其亮灭

break;

}

case 0x28:

{

PC_ODR ^= 0x80; //异或取反LED2使其亮灭

PC_ODR ^= 0x40; //异或取反LED3使其亮灭

break;

}

case 0x31:

{

PC_ODR ^= 0x80; //异或取反LED2使其亮灭

break;

}

case 0x32:

{

PC_ODR ^= 0x40; //异或取反LED3使其亮灭

break;

}

case 0x34:

{

PC_ODR ^= 0x08; //异或取反LED4使其亮灭

break;

}

case 0x38:

{

PC_ODR ^= 0x80; //异或取反LED2使其亮灭

PC_ODR ^= 0x40; //异或取反LED3使其亮灭

break;

}

default:

{

KeyVal = 0;

break;

}

}

}

}

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 矩阵键盘
    +关注

    关注

    7

    文章

    207

    浏览量

    32656
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    FZH217 带键盘扫描接口的大笔段 LED 驱动控制专用电路 原厂技术支持

    至8位×24段,可根据需求配置。键盘扫描功能o 内置16×2bit键扫描矩阵,支持按键检测,内置5kΩ下拉电阻。辉度调节o 提供8级占空比可
    发表于 12-03 11:01

    FZH216 带键盘扫描接口的大笔段 LED 驱动控制专用电路

    o 16×2bit 矩阵扫描,支持按键中断返回(KEYINT 引脚)。o 内置下拉电阻(5kΩ)和上拉电阻(10kΩ)。通信接口o 串行接口(CLK、STB、DIO),支持数据读写和指令配置。关键
    发表于 12-02 11:57

    FZH186 一种带键盘扫描接口的LED(发光二极管显示器)驱动控制专用电路

    的封装形式。核心特性工艺技术:功率CMOS工艺,低功耗设计。显示模式:固定支持 10段×7位 LED显示。键盘扫描:10×2矩阵扫描(10条SEG/KS线复用,2条K输入线)。亮度调
    发表于 11-28 15:57

    FZH183 带键盘扫描接口的LED(发光二极管显示器)驱动控制专用电路--方中禾科技

    形式:SOP32封装。核心特性工艺技术:采用功率CMOS工艺。显示模式:支持14段×8位显示模式。键盘扫描:支持8×2矩阵键盘扫描。辉度调节
    发表于 11-28 09:31

    FZH182 带键盘扫描接口的LED(发光二极管显示器)驱动控制专用电路

    等产品的高段位显示屏驱动。核心特性· 工艺技术:采用功率CMOS工艺。· 显示模式:支持16段×8位显示模式。· 键盘扫描:支持8×4矩阵键盘扫描
    发表于 11-27 14:58

    FZH100 带键盘扫描接口的 LED(发光二极管显示器)驱动控制专用 IC 原厂技术支持

    是一种带键盘扫描接口的 LED(发光二极管显示器)驱动控制专用 IC,内部集成有 MCU 数字接口、数据锁存器、LED 驱动、键盘扫描等电路。本产品质量可靠、稳定性好、抗干扰能力强。
    发表于 11-18 09:26

    原厂 FZH1697 带键盘扫描接口的LCD驱动控制专用电路

    :SOP32 FZH1697 是方中禾科技旗舰级显示控制芯片,通过 矩阵按键扫描 + PWM背光 + 通用输入口 的三重集成,大幅简化影音设备前面板设计。
    发表于 11-07 09:43

    键盘常见问题的解决方法

    用户点击输入框时,软键盘默认弹出。但在特定场景下,需要对软键盘的弹出和收起进行控制,如点击空白区域收起软键盘,进入页面时输入框主动获焦。开发者还需根据软键盘状态和高度调整页面布局。
    的头像 发表于 09-04 09:11 531次阅读

    FAQ_MA35_Family如何设置矩阵键盘

    FAQ_MA35_Family如何设置矩阵键盘
    发表于 09-02 06:57

    键盘薄膜高弹UV胶则是一种特殊改性的UV固化胶,用于薄膜键盘按键弹性体的部分或高弹性密封

    薄膜键盘是一种常见的键盘类型,它使用薄膜作为按键的触发器。而键盘薄膜高弹UV胶则是一种特殊改性的UV固化胶,用于薄膜键盘
    的头像 发表于 08-26 10:03 684次阅读
    <b class='flag-5'>键盘</b>薄膜高弹UV胶则是一种特殊改性的UV固化胶,用于薄膜<b class='flag-5'>键盘</b><b class='flag-5'>按键</b>弹性体的部分或高弹性密封

    HarmonyOS应用自定义键盘解决方案

    自定义键盘是一种替换系统默认键盘的解决方案,可实现键盘个性化交互。允许用户结合业务需求与操作习惯,对按键布局进行可视化重构、设置多功能组合键位,使输入更加便捷和舒适。在安全防护层面,自
    的头像 发表于 06-05 14:19 1564次阅读

    ADP5588移动I/O扩展器和QWERTY键盘控制器技术手册

    ADP5588是一款I/O端口扩展器和键盘矩阵,适用于需要大型键盘矩阵和扩展I/O线路的QWERTY型电话。I/O扩展器IC可以在移动平台中解决主处理器GPIO数量有限的问题。
    的头像 发表于 05-22 11:37 676次阅读
    ADP5588移动I/O扩展器和QWERTY<b class='flag-5'>键盘</b>控制器技术手册

    ADP5587移动I/O扩展器和QWERTY键盘控制器技术手册

    ADP5587 是一款 I/O 端口扩展器和键盘矩阵,适用于需要大型键盘矩阵和扩展 I/O 线路的 QWERTY 型电话。I/O 扩展器 IC 可以在移动平台中解决主处理器 GPIO
    的头像 发表于 05-22 11:08 758次阅读
    ADP5587移动I/O扩展器和QWERTY<b class='flag-5'>键盘</b>控制器技术手册

    低功耗Air724UG模组软件指南:KEYPAD示例~

    一、简介   在电路设计中,通常需要较多的外部输入,如果每个按键都单独去占用一个 IO 接口,就会非常浪费资源,为了减少 I/O 口的占用,通常将按键排列成矩阵形式,即矩阵
    的头像 发表于 02-07 14:25 494次阅读
    低功耗Air724UG模组软件指南:KEYPAD示例~

    AN-660:XY矩阵键盘与MicroConverter的接口

    电子发烧友网站提供《AN-660:XY矩阵键盘与MicroConverter的接口.pdf》资料免费下载
    发表于 01-13 16:02 0次下载
    AN-660:XY<b class='flag-5'>矩阵</b><b class='flag-5'>键盘</b>与MicroConverter的接口