首页>>科技 >>内容

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

发布时间:2024-01-05 09:52:03编辑:温柔的背包来源:

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

很多朋友对矩阵键盘的按键识别方法,矩阵键盘扫描程序不是很了解,每日小编刚好整理了这方面的知识,今天就来带大家一探究竟。

矩阵键盘的按键识别方法简单日记网推荐矩阵键盘的按键识别方法。在学习矩阵键盘的时候,我们经常要学习矩阵键盘的按键识别方法。矩阵键盘的按键识别方法有哪些?边肖带你去了解。方法1:线扫描法

1、判断键盘中是否有按键将所有行线p1.4-p1.7设置为低电平,当然还有p1.0-p1.3为高电平(可能这些引脚在芯片内部已经被拉高了),然后检查列线的状态。只要一列的级别低,就说明键盘中按了一个键,关闭键在低级别线与四行线交叉的四个键中。如果所有列线都是高电平,则键盘上没有按键。

2、判断关闭键的位置确认一个键被按下后,就可以进入确定具体关闭键的过程。方法是依次将行线设置为低电平,即当一行线设置为低电平时,其他行设置为高电平。在行线的位置被确定为低之后,逐行检测每个列线的电平状态。如果列为低电平,则列线和行线相交处设置为低电平的键是闭合键。

方法二:首先从p1口的高四位输出低电平,从低四位输出高电平,从p1口的低四位读取键盘状态。然后从p1口的低四位输出低电平,从高四位输出高电平,从p1口的高四位读取键盘状态。将两次读取结果结合起来就可以得到当前钥匙的特征码。矩阵键盘扫描程序使用芯片STM8S003使用的端口:PD2~PD6和PA1~PA3,其中PD3~PD6为输出,PA1~PA3/PD2为输入(默认上拉)程序如下:# include 《iostm8s103f3.h》 volatile unsigned Charcf[4];//key trigger flag(代表4列,每列在同一行有相同的//值但不同的列标签来区分不同列的键)volatile unsigned charcont[4];无符号字符KeyVal//键值//unsigned charkeyout [4]={0xef,0xdf,0xbf,0x7f };//4X4根据输出控制。

//unsigned char keyut[4]={0x7f,0xbf,0xdf,0x ef }; unsigned char KeyOut[4]={0x3f,0x5f,0x6f,0x 77 }; //two port combination 4x4 port output control unsigned char PortCom//two port combination port unsigned characters cIn0, cIn1, cIn2, CIN3/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

* *入口参数:unsigned int ms输入近似延迟值* *输出:none * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *(x=ms;x》0;x-)for(y=1000;y》0;y-);}/* * *说明:新的4X4键扫描程序可以在1ms-10ms中断使用(非常稳定,不需要写防抖程序)* *备注:弹出键时keyVal=0,单键按keyVal有16个值,自己的程序可以针对不同的值。

**进行不同程序操作基瓦尔单键值分别为**0x01,0x02,0x04,0x08,**0x11,0x12,0x14,0x18,**0x21,0x22,0x24,0x28,**0x31,0x32,0x34,0x38,*/void Key _ Head(){ unsigned char read data[4];静态无符号字符我;CIN 0=0;CIN 1=0;CIN 2=0;CIN 3=0;if(I》=4)I=0;//port com=keyut[I]|0x0f;//忽略低四位//输出扫描PD _ ODR=keyut[I];

//输入检测cIn0=PA_IDR_bit。IDR1cIn1=PA_IDR_bit。IDR2cIn2=PA_IDR_bit。IDR3cIn3=PD_IDR_bit。IDR2PortCom=(CIN 3"3"|(CIN 2"2))|(CIN 1"1"| CIN 0;read data[I]=(portcom|0xf0)^0xff;//ignore ren sie die OBE ren 4 bits und neh men sie die inverse cf[I]=read data[I](read data[I]^ cont[I]);cont[I]=read data[I];//输出键值开关(CF[I])//column { case0x 08:KeyVal=((I"4)8);打破;

Case0x04: keyval=((I"4"4); Break; case0x 02:key val=((I《4》2); Break; case0x 01:key val=((I《4》1); Break; Default value: KeyVal=0; Break; } delay (30); * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */void ALL _ LED _ Init(){//le D1 Init//PD _ DDR _ bit。DDR2=1;//将端口PD-》2的输入输出方向寄存器设置为输出方向//PD_CR1_bit。C12=1;//设置PD2为推挽输出//PD_CR2_bit。c22=1;//将PD2的最大输出速度设置为10 MHz//LED2INITPC _ DDR _ bit。DDR 7=1;//将端口PC-》7的输入输出方向寄存器设置为输出方向PC_CR1_bit。c17=1;//设置PC7为推挽输出。

PC_CR2_bit。c27=1;//设置PC7的最大输出速度为10 MHz//LED 3 init PC _ DDR _ bit。DDR 6=1;//将端口PC-》6的输入输出方向寄存器设置为输出方向PC_CR1_bit。C16=1;//将PC6设置为推挽输出PC_CR2_bit。c26=1;//设置PC6最大输出速度为10 MHz//LED 4 init PC _ DDR _ bit。DDR 3=1;//将端口PC-》3的输入输出方向寄存器设置为输出方向PC_CR1_bit。c13=1;//将PC3设置为推挽输出PC_CR2_bit。c23=1;//将PC3的最大输出速度设置为10MHZ}

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * key 3输入键* *输入参数:无* *输出:无* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *//GPA-”引脚3设置为输入模式PA_CR1_bit。 c11=1;//GPA-"引脚3,带上拉电阻输入PA_CR2_bit。C21=0;//GPA-"pin3禁止外部中断。

//PA2_InitPA_DDR_bit。DDR2=0;//GPA-"pin3设置为输入模式PA_CR1_bit。C12=1;//GPA-"引脚3,带上拉电阻输入PA_CR2_bit。c22=0;//GPA-"pin3禁止外部中断//PA3_InitPA_DDR_bit。DDR 3=0;//GPA-"pin3设置为输入模式PA_CR1_bit。c13=1;//GPA-"引脚3,带上拉电阻输入PA_CR2_bit。c23=0;//GPA-"pin3禁止外部中断//PD2_InitPD_DDR_bit。DDR2=0;//GPD-"引脚3设置为输入模式PD_CR1_bit。C12=1;//GPD-"引脚3,带上拉电阻输入。

PD_CR2_bit。c22=0;//GPD-"pin3禁止外部中断//PD3_InitPD_DDR_bit。DDR 3=1;//GPD-"引脚3设置为输入模式PD_CR1_bit。c13=1;//GPD-"Pin3频段上拉电阻输入PD_CR2_bit。c23=1;//GPD-"pin3禁止外部中断//PD4_InitPD_DDR_bit。DDR 4=1;//GPD-"引脚3设置为输入模式PD_CR1_bit。C14=1;//GPD-"Pin3频段上拉电阻输入PD_CR2_bit。C24=1;//GPD-"pin3禁止外部中断//PD5_InitPD_DDR_bit。DDR 5=1;//GPC-"pin5设置为输入模式。

CR1比特。c15=1;//GPC-"引脚5,带上拉电阻输入PD_CR2_bit。c25=1;//GPC-"pin5禁止外部中断//PD6_InitPD_DDR_bit。DDR 6=1;//GPC-"引脚5设置为输入模式PD_CR1_bit。C16=1;//GPC-"引脚5,带上拉电阻输入PD_CR2_bit。c26=1;//GPC-"引脚5禁止外部中断} int main(void){ clk _ ckdivir=0x 00;//内部时钟除以1 ALL _ LED _ Init();//调用LED1初始化函数ALLKeyInit();//调用按钮初始化函数while(1){ Key _ Head();开关(按键值){

案例0x 01:{ PC _ ODR ^=0x 80;//异或否定LED2使其轻断;}案例0x 02:{ PC _ ODR ^=0x 40;//exclusive OR否定LED3使其轻断;}案例0x 04:{ PC _ ODR ^=0x 08;//异或否定LED4使其轻断;}案例0x 08:{ PC _ ODR ^=0x 80;//异或求反LED2使其开、关PC _ ODR ^=0x 40;//exclusive OR否定LED3使其轻断;}案例0x 11:{ PC _ ODR ^=0x 80;//异或否定LED2使其轻断;}案例0x 12:{ PC _ ODR ^=0x 40;//exclusive OR否定LED3使其轻断;}案例0x14:{

PC _ ODR ^=0x 08;//异或否定LED4使其轻断;}案例0x 18:{ PC _ ODR ^=0x 80;//异或求反LED2使其开、关PC _ ODR ^=0x 40;//exclusive OR否定LED3使其轻断;}案例0x 21:{ PC _ ODR ^=0x 80;//异或否定LED2使其轻断;}案例0x 22:{ PC _ ODR ^=0x 40;//exclusive OR否定LED3使其轻断;}案例0x 24:{ PC _ ODR ^=0x 08;//异或否定LED4使其轻断;}案例0x 28:{ PC _ ODR ^=0x 80;//异或求反LED2使其开、关PC _ ODR ^=0x 40;//exclusive-OR对LED3求反以打开和关闭它。

打破;}案例0x 31:{ PC _ ODR ^=0x 80;//异或否定LED2使其轻断;}案例0x 32:{ PC _ ODR ^=0x 40;//exclusive OR否定LED3使其轻断;}案例0x 34:{ PC _ ODR ^=0x 08;//异或否定LED4使其轻断;}案例0x 38:{ PC _ ODR ^=0x 80;//异或求反LED2使其开、关PC _ ODR ^=0x 40;//exclusive OR否定LED3使其轻断;}默认值:{ KeyVal=0;打破;}}}}

以上知识分享希望能够帮助到大家!