stm控制乘矩阵键盘程序带松手检测精编WORD版
STM矩阵键盘程序

/--------------------------------------------------------------------------------------矩阵键盘驱动文件:keyboard.c编写人:LiuHui描述:扫描4x4矩阵键盘输入,并返回键值适用范围:驱动采用ST3.5库编写,适用于STM32F10x系列单片机所用引脚:PA0-PA7编写时间:2014年5月20日--------------------------------------------------------------------------------------/include"stm32f10x.h"include"keyboard.h"include"dealy.h"/--------------------------------矩阵键盘初始化----------------------------------------功能:初始化stm32单片机GPIO//PA0-PA7参数传递:输入:无返回值:无--------------------------------------------------------------------------------------/voidKeyBoard_Initvoid{GPIO_InitTypeDefGPIO_InitStructure;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitGPIOA,&GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;GPIO_InitGPIOA,&GPIO_InitStructure;GPIO_SetBitsGPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;GPIO_ResetBitsGPIOA,GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;}/------------------------------矩阵键盘扫描--------------------------------------------功能:扫描矩阵键盘,并返回键值参数:输入:无返回:有键按下返回该键值无键按下时则返回0--------------------------------------------------------------------------------------/u8Read_KeyValuevoid{u8KeyValue=0;ifGPIO_ReadInputDataGPIOA&0xff=0x0f{Delay_ms10;ifGPIO_ReadInputDataGPIOA&0xff=0x0f{GPIO_SetBitsGPIOA,GPIO_Pin_0;GPIO_ResetBitsGPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3; switchGPIO_ReadInputDataGPIOA&0xff{case0x11:KeyValue=1;break;case0x21:KeyValue=5;break;case0x41:KeyValue=9;break;case0x81:KeyValue=13;break;}GPIO_SetBitsGPIOA,GPIO_Pin_1;GPIO_ResetBitsGPIOA,GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_3; switchGPIO_ReadInputDataGPIOA&0xff{case0x12:KeyValue=2;break;case0x22:KeyValue=6;break;case0x42:KeyValue=10;break;case0x82:KeyValue=14;break;}GPIO_SetBitsGPIOA,GPIO_Pin_2;GPIO_ResetBitsGPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_3;switchGPIO_ReadInputDataGPIOA&0xff{case0x14:KeyValue=3;break;case0x24:KeyValue=7;break;case0x44:KeyValue=11;break;case0x84:KeyValue=15;break;}GPIO_SetBitsGPIOA,GPIO_Pin_3;GPIO_ResetBitsGPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2; switchGPIO_ReadInputDataGPIOA&0xff{case0x18:KeyValue=4;break;case0x28:KeyValue=8;break;case0x48:KeyValue=12;break;case0x88:KeyValue=16;break;}GPIO_SetBitsGPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3; GPIO_ResetBitsGPIOA,GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;whileGPIO_ReadInputDataGPIOA&0xff=0x0f;returnKeyValue;}}return0;}/--------------------------------THEEND--------------------------------------------//--------------------------------------------------------------------------------------矩阵键盘驱动文件:keyboard.h编写人:LiuHui描述:扫描4x4矩阵键盘输入,并返回键值适用范围:驱动为ST3.5库编写,适用于STM32F10x系列单片机所用引脚:PA0-PA7编写时间:2013 年11 月22日版本:1.0--------------------------------------------------------------------------------------/ifndef__KEYBOARD_Hdefine__KEYBOARD_HvoidKeyBoard_Initvoid;u8Read_KeyValuevoid;endif/----------------------------------THEEND------------------------------------------include"stm32f10x.h"voidKeyBoard_Initvoid{GPIO_InitTypeDefGPIO_InitStructure;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_2MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitGPIOA,&GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_2MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;GPIO_InitGPIOB,&GPIO_InitStructure;GPIO_SetBitsGPIOB,GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6; GPIO_ResetBitsGPIOB,GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10; }//3êˉPA,PBvoidDelay_msinttime{inti=0;whiletime--{i=12000;whilei--;}}u8Read_KeyValuevoid{u8KeyValue=1;ifGPIO_ReadInputDataGPIOB&0xff=0x0f{Delay_ms10;ifGPIO_ReadInputDataGPIOB&0xff=0x0f{GPIO_SetBitsGPIOB,GPIO_Pin_3;GPIO_ResetBitsGPIOB,GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6; switchGPIO_ReadInputDataGPIOB&0xff{case0x11:KeyValue=7;break;case0x21:KeyValue=4;break;case0x41:KeyValue=1;break;case0x81:KeyValue=0;break;}GPIO_SetBitsGPIOB,GPIO_Pin_4;GPIO_ResetBitsGPIOB,GPIO_Pin_3|GPIO_Pin_5|GPIO_Pin_6; switchGPIO_ReadInputDataGPIOB&0xff{case0x12:KeyValue=8;break;case0x22:KeyValue=5;break;case0x42:KeyValue=2;break;case0x82:KeyValue=0;break;}GPIO_SetBitsGPIOB,GPIO_Pin_5;GPIO_ResetBitsGPIOB,GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_6;switchGPIO_ReadInputDataGPIOB&0xff{case0x14:KeyValue=9;break;case0x24:KeyValue=6;break;case0x44:KeyValue=3;break;case0x84:KeyValue=0;break;}GPIO_SetBitsGPIOB,GPIO_Pin_6;GPIO_ResetBitsGPIOB,GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;switchGPIO_ReadInputDataGPIOB&0xff{case0x18:KeyValue=0;break;case0x28:KeyValue=0;break;case0x48:KeyValue=0;break;case0x88:KeyValue=0;break;}GPIO_SetBitsGPIOB,GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6; GPIO_ResetBitsGPIOB,GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10; //whileGPIO_ReadInputDataGPIOB&0xff=0x0f;returnKeyValue;}}return0;}uint16_ttable={0xEB,0x28,0xB3,0xBA,0x78,0xDA,0xDB,0xA8,0xFB,0xFA}; intmain{RCC_APB2PeriphClockCmdRCC_APB2Periph_GPIOA,ENABLE;RCC_APB2PeriphClockCmdRCC_APB2Periph_GPIOB,ENABLE;KeyBoard_Init;intkeyvalue=Read_KeyValue;GPIO_WriteGPIOA,tablekeyvalue;/while1{inti;fori=0;i<10;i++{GPIO_WriteGPIOA,tablei;Delay_ms500;}}//u8keyvalue;forinti=0;;i++{KeyBoard_Init;keyvalue=Read_KeyValue;GPIO_WriteGPIOA,tablekeyvalue;Delay_ms500;}/}include"stm32f10x.h"voidKeyBoard_Initvoid{GPIO_InitTypeDefGPIO_InitStructure;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_2MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitGPIOA,&GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6| GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_2MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;GPIO_InitGPIOB,&GPIO_InitStructure;GPIO_SetBitsGPIOB,GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6;GPIO_ResetBitsGPIOB,GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10;}voidDelay_msinttime{inti=0;whiletime--{i=12000;whilei--;}}u8Read_KeyValuevoid{ifGPIO_ReadInputDataGPIOB&0xff=0x73//在这个程序下为什么无论是GPIO_ReadInputDataGPIOB&0xff=0x73还是GPIO_ReadInputDataGPIOB&0xff==0x73都能往下运行,而在屏蔽Delay_ms10后则只能运行一种,是因为这个Delay_ms10对if里的判断有影响吗{Delay_ms10;GPIO_WriteGPIOA,0x33;}return0;}intmain{RCC_APB2PeriphClockCmdRCC_APB2Periph_GPIOA,ENABLE;RCC_APB2PeriphClockCmdRCC_APB2Periph_GPIOB,ENABLE;KeyBoard_Init;Read_KeyValue;}。
stm32控制4乘4矩阵键盘程序带松手检测

stm32控制4乘4矩阵键盘程序带松手检测#include "stm32f10x.h"#include "delay.h"/*本文件的函数,主要实现矩阵键盘的功能。
矩阵键盘使用PA0到PA7引脚,其中,PA0到PA3固定为推挽输出,PA4到PA7固定为下拉输入。
即,无键按下时,对应PA4到PA7为0,有键按下时,PA4到PA7中,对应的引脚为高。
此程序有一点要注意:要用到的IO口,必须是PX0-PX7,,不能是其他连续的数字。
如果非要改。
如:已经没有连续的0-7的IO口,需要在几个地方修改,请注意~~此程序带有松手检测。
*/void InitKey(void) //初始化矩阵键盘要使用的GPIO口。
{GPIO_InitTypeDef GPIOStru;GPIOStru.GPIO_Mode = GPIO_Mode_Out_PP; //定义PA0到PA3为推挽输出。
GPIOStru.GPIO_Speed = GPIO_Speed_50MHz;GPIOStru.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_Init(GPIOA,&GPIOStru);GPIOStru.GPIO_Mode = GPIO_Mode_IPD; //定义PA4到PA7为下拉输入。
GPIOStru.GPIO_Speed = GPIO_Speed_50MHz;GPIOStru.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;//因为上面定义引脚为输出时,已经打开整个GPIOA的时钟了,所以此处不再需要函数RCC_APB2PeriphClockCmd()来打开时钟了。
矩阵键盘程序设计范文精简处理

矩阵键盘程序设计矩阵键盘程序设计概述矩阵键盘是一种常见的输入设备,常用于电子产品和计算机系统中。
它由多个按键组成,采用矩阵排列的方式连接到计算机系统中。
在本篇文章中,我们将讨论矩阵键盘的程序设计。
程序设计步骤步骤一:硬件连接,我们需要将矩阵键盘与计算机系统进行连接。
通常情况下,矩阵键盘的每一行和每一列都通过引脚与计算机系统中的GPIO(通用输入输出)引脚相连接。
步骤二:引脚控制接下来,我们需要使用程序控制GPIO引脚的输入输出状态。
对于矩阵键盘而言,我们通常会将一行的引脚设置为输出,将一列的引脚设置为输入,然后将输出引脚设置为高电平,输入引脚设置为上拉或下拉电阻。
步骤三:按键扫描在第二步的基础上,我们可以进行按键的扫描操作。
具体方法是,先将某一行的引脚设置为低电平,然后读取每一列的引脚状态。
如果某一列引脚为低电平,则表示该按键被按下。
步骤四:按键处理一旦我们检测到某个按键被按下,就可以执行相应的按键处理操作。
这可能包括记录按键信息、执行某些特定的功能或触发一些事件。
步骤五:循环扫描,我们需要将以上步骤放入一个循环中进行不断的扫描。
这样可以实现对整个矩阵键盘的实时检测和响应。
示例代码下面是一个简单的矩阵键盘程序设计的示例代码,使用C语言编写:cinclude <stdio.h>include <wiringPi.h>define ROWS 4define COLS 4int rows[ROWS] = { 2, 3, 4, 5 };int cols[COLS] = { 6, 7, 8, 9 };char keyMap[ROWS][COLS] = {{'1', '2', '3', 'A'},{'4', '5', '6', 'B'},{'7', '8', '9', 'C'},{'', '0', '', 'D'}};void init() {wiringPiSetup();for (int i = 0; i < ROWS; i++) {pinMode(rows[i], OUTPUT);digitalWrite(rows[i], HIGH);}for (int i = 0; i < COLS; i++) {pinMode(cols[i], INPUT);pullUpDnControl(cols[i], PUD_UP);}}char getKey() {while (1) {for (int i = 0; i < ROWS; i++) {digitalWrite(rows[i], LOW);for (int j = 0; j < COLS; j++) {if (digitalRead(cols[j]) == LOW) { return keyMap[i][j];}}digitalWrite(rows[i], HIGH);}}}int mn() {init();while (1) {char key = getKey(); printf(\。
(完整word版)4×4矩阵键盘原理及其在单片机中的简单应用(基Proteus仿真)

4×4矩阵键盘原理及其在单片机中的简单应用基于Proteus仿真1、4×4矩阵键盘的工作原理如下图所示,4×4矩阵键盘由4条行线和4条列线组成,行线接P3。
0-P3。
3,列线接P3.4-P3。
7,按键位于每条行线和列线的交叉点上.按键的识别可采用行扫描法和线反转法,这里采用简单的线反转法,只需三步。
第一步,执行程序使X0~X3均为低电平,此时读取各列线Y0~Y3的状态即可知道是否有键按下。
当无键按下时,各行线与各列线相互断开,各列线仍保持为高电平;当有键按下时,则相应的行线与列线通过该按键相连,该列线就变为低电平,此时读取Y0Y1Y2Y3的状态,得到列码.第二步,执行程序使Y0~Y3均为低电平,当有键按下时,X0~X3中有一条行线为低电平,其余行线为高电平,读取X0X1X2X3的状态,得到行码。
第三步,将第一步得到的列码和第二步得到的行码拼合成被按键的位置码,即Y0Y1Y2Y3X0X1X2X3(因为行线和列线各有一条为低电平,其余为高电平,所以位置码低四位和高四位分别只有一位低电平,其余为高电平)。
也就是说,当某个键按下时,该键两端所对应的行线和列线为低电平,其余行线和列线为高电平。
比如,当0键按下时,行线X0和列线Y0为低电平,其余行列线为高电平,于是可以得到0键的位置码Y0Y1Y2Y3X0X1X2X3为0111 0111,即0X77。
当5键按下时,行线X1和列线Y1为低电平,其余行列线为高电平,于是可得到5键的位置码Y0Y1Y2Y3X0X1X2X3为1011 1011,即0XBB.全部矩阵键盘的位置码如下:2、4×4矩阵键盘在单片机的简单应用举例(一)如下图所示,运行程序时,按下任一按键,数码管会显示它在矩阵键盘上的序号0~F,并且蜂鸣器发出声音,模拟按键的声音。
此处采用线反转法识别按键。
C程序如下:#include〈reg51。
h〉#define uchar unsigned char#define uint unsigned intsbit buzzer=P1^0;uchar code dis[]= //0~9,A~F的共阳显示代码{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0X88,0X83,0XC6,0XA1,0X86,0X8E};uchar code tab[]= //矩阵键盘按键位置码{0x77,0xb7,0xd7,0xe7,0x7b,0xbb,0xdb,0xeb,0x7d,0xbd,0xdd,0xed,0x7e,0xbe,0xde,0xee};void delay(uint x)//延时函数{uchar i;while(x-—)for(i=0;i<120;i++);}uchar scan() //矩阵键盘扫描函数,得到按键号,采用线反转法{uchar a,b,c,i;P3=0XF0;//P3口输出11110000a=P3; //读取列码delay(10);//防抖延时10msP3=0X0F;//P3口输出00001111b=P3;//读取行码c=a+b;//得到位置码for(i=0;i<16;i++)if(c==tab[i])return i;//查表得到按键序号并返回return —1; //无按键,则返回—1}void beep() //蜂鸣器发出声音,模拟按键的声音{ uchar i;for(i=0;i<100;i++){buzzer=~buzzer;delay(1);}buzzer=0;}void main(){uchar key;buzzer=0; //关闭蜂鸣器while(1){key=scan(); //得到按键号if(key!=—1)//有按键则显示,并且蜂鸣器发出声音{P0=dis[key];beep();delay(100);}}}Proteus仿真运行结果如下:3、4×4矩阵键盘在单片机的简单应用举例(二)如下图所示,运行程序时,按下的按键键值越大,点亮的LED灯越多,例如,按下1号键时,点亮一只LED 灯,按下2号键时,点亮两只LED灯,按下16号键时,点亮全部LED灯。
单片机驱动4X4矩阵式键盘输入程序(1)

单片机驱动4X4矩阵式键盘输入程序(1)单片机驱动4X4矩阵式键盘输入程序 (1)用AT89S51单片机的并行口P1接4×4矩阵键盘,以P1.0-P1.3作输入线,以P1.4-P1.7作输出线;在数码管上显示每个按键的“0-F”序号。
实现键盘输入的识别。
我将给大家提供c和汇编两个版本的4X4矩阵式键盘输入程序。
如汇编语言源程序:KEYBUF EQU 30HORG 00HSTART: MOV KEYBUF,#2WAIT:MOV P3,#0FFHCLR P3.4MOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY1LCALL DELY10MSMOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY1MOV A,P3ANL A,#0FHCJNE A,#0EH,NK1MOV KEYBUF,#0LJMP DK1NK1: CJNE A,#0DH,NK2MOV KEYBUF,#1LJMP DK1NK2: CJNE A,#0BH,NK3 MOV KEYBUF,#2LJMP DK1NK3: CJNE A,#07H,NK4 MOV KEYBUF,#3LJMP DK1NK4: NOPDK1:MOV A,KEYBUFMOV DPTR,#TABLE MOVC A,@A+DPTRMOV P0,ADK1A: MOV A,P3ANL A,#0FHXRL A,#0FHJNZ DK1ANOKEY1:MOV P3,#0FFHCLR P3.5MOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY2LCALL DELY10MSMOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY2MOV A,P3ANL A,#0FHCJNE A,#0EH,NK5MOV KEYBUF,#4LJMP DK2NK5: CJNE A,#0DH,NK6 MOV KEYBUF,#5LJMP DK2NK6: CJNE A,#0BH,NK7 MOV KEYBUF,#6LJMP DK2NK7: CJNE A,#07H,NK8 MOV KEYBUF,#7LJMP DK2NK8: NOPDK2:MOV A,KEYBUFMOV DPTR,#TABLE MOVC A,@A+DPTRMOV P0,ADK2A: MOV A,P3ANL A,#0FHXRL A,#0FHJNZ DK2ANOKEY2:MOV P3,#0FFHCLR P3.6MOV A,P3ANL A,#0FHXRL A,#0FHLCALL DELY10MSMOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY3MOV A,P3ANL A,#0FHCJNE A,#0EH,NK9MOV KEYBUF,#8LJMP DK3NK9: CJNE A,#0DH,NK10 MOV KEYBUF,#9LJMP DK3NK10: CJNE A,#0BH,NK11 MOV KEYBUF,#10LJMP DK3NK11: CJNE A,#07H,NK12 MOV KEYBUF,#11LJMP DK3NK12: NOPDK3:MOV A,KEYBUFMOV DPTR,#TABLEMOVC A,@A+DPTRMOV P0,ADK3A: MOV A,P3ANL A,#0FHXRL A,#0FHJNZ DK3AMOV P3,#0FFHCLR P3.7MOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY4LCALL DELY10MSMOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY4MOV A,P3ANL A,#0FHCJNE A,#0EH,NK13MOV KEYBUF,#12LJMP DK4NK13: CJNE A,#0DH,NK14 MOV KEYBUF,#13LJMP DK4NK14: CJNE A,#0BH,NK15 MOV KEYBUF,#14LJMP DK4NK15: CJNE A,#07H,NK16 MOV KEYBUF,#15LJMP DK4NK16: NOPDK4:MOV A,KEYBUFMOV DPTR,#TABLEMOVC A,@A+DPTRMOV P0,ADK4A: MOV A,P3ANL A,#0FHXRL A,#0FHJNZ DK4ANOKEY4:LJMP WAITDELY10MS:MOV R6,#10D1: MOV R7,#248DJNZ R7,$DJNZ R6,D1RETTABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H DB 7FH,6FH,77H,7CH,39H,5EH,79H,71HEND。
单片机 矩阵键盘实验 实验报告

实验五矩阵键盘实验一、实验内容1、编写程序,做到在键盘上每按一个数字键(0-F)用发光二极管将该代码显示出来。
按其它键退出。
2、加法设计计算器,实验板上有12个按键,编写程序,实现一位整数加法运算功能。
可定义“A”键为“+”键,“B”键为“=”键。
二、实验目的1、学习独立式按键的查询识别方法。
2、非编码矩阵键盘的行反转法识别方法。
三、实验说明1、MCS51系列单片机的P0~P3口作为输入端口使用时必须先向端口写入“1”。
2、用查询方式检测按键时,要加入延时(通常采用软件延时10~20mS)以消除抖动。
3、识别键的闭合,通常采用行扫描法和行反转法。
行扫描法是使键盘上某一行线为低电平,而其余行接高电平,然后读取列值,如读列值中某位为低电平,表明有键按下,否则扫描下一行,直到扫完所有行。
行反转法识别闭合键时,要将行线接一并行口,先让它工作在输出方式,将列线也接到一个并行口,先让它工作于输入方式,程序使CPU通过输出端口在各行线上全部送低电平,然后读入列线值,如此时有某键被按下,则必定会使某一列线值为0。
然后,程序对两个并行端口进行方式设置,使行线工作于输入方式,列线工作于输出方式,并将刚才读得的列线值从列线所接的并行端口输出,再读取行线上输入值,那么,在闭合键所在行线上的值必定为0。
这样,当一个键被接下时,必定可以读得一对唯一的行线值和列线值。
由于51单片机的并口能够动态地改变输入输出方式,因此,矩阵键盘采用行反转法识别最为简便。
行反转法识别按键的过程是:首先,将4个行线作为输出,将其全部置0,4个列线作为输入,将其全部置1,也就是向P1口写入0xF0;假如此时没有人按键,从P1口读出的值应仍为0xF0;假如此时1、4、7、0四个键中有一个键被按下,则P1.6被拉低,从P1口读出的值为0xB0;为了确定是这四个键中哪一个被按下,可将刚才从P1口读出的数的低四位置1后再写入P1口,即将0xBF写入P1口,使P1.6为低,其余均为高,若此时被按下的键是“4”,则P1.1被拉低,从P1口读出的值为0xBE;这样,当只有一个键被按下时,每一个键只有唯一的反转码,事先为12个键的反转码建一个表,通过查表就可知道是哪个键被按下了。
《STM32单片机仿真开发实例》教学课件 3.5 矩阵式键盘

⑵ 字节操作法
与位操作法编程思路完全不同,字节操作法将矩阵式键盘控制行列的8个GPIO引脚 PB0~PB7作为一个字节,通过与流水灯类似的移位算法来实现行线的循环置高电平, 通过“位与”运算符来判定按键是否按下。这里GPIO驱动库选择LL库,与HAL相反, LL库只有对GPIO端口读写的API函数,而没有对某一个GPIO引脚读写的API函数。
3.5 矩阵式键盘
能力目标: 理解矩阵式键盘的电路组成及工作原理,掌握矩阵式键盘程序的编制
方法。 任务要求:
如下图所示是一个4×4的矩阵式键盘仿真电路,要求编程实现当按下 任意一个按钮时,数码管立即显示当前按下按钮对应的键值。
3.5.1 矩阵式键盘的电路组成
● “独立式按钮”,适合于按钮较少的应用场合;
3.5.3 任务程序的编写
即便是行扫描法这一种算法,实际程序的编制方法也不止一种,这里为读者介绍两 种具体的程序实现方法
⑴ 位操作法
位操作法来源于早期MCS-51单片机基于汇编语言的矩阵式键盘程序的实现方法,这 里GPIO的驱动库选择HAL库。由于HAL库中只有对某一个GPIO引脚进行读写的API函数 ,而没有对整个GPIO端口进行读写的API函数,因此在编制矩阵式键盘行扫描程序的 时候很容易,但是在编制数码管驱动程序的时候就很不方便了,下面程序中人为定义 了一个端口输出函数,结合查表法用于驱动数码管。
Y1
BTN E
Y2
BTN F
Y3
3.5.2 矩阵式键盘的行扫描法
行扫描法检测步骤如下: ① 初始化,所有行线均输出高电平; ② 仅行线X0输出低电平,检测按键0~按键3,若其中某个按键被按下,则相应的列 线将检测到低电平; ③ 仅行线X1输出低电平,检测按键4~按键7,若其中某个按键被按下,则相应的列 线将检测到低电平; ④ 仅行线X2输出低电平,检测按键8~按键B,若其中某个按键被按下,则相应的 列线将检测到低电平; ⑤ 仅行线X3输出低电平,检测按键C~按键F,若其中某个按键被按下,则相应的 列线将检测到低电平; ⑥ 回到步骤②,继续循环检测。
51单片机_矩阵按键检测

}
returnk;//返回扫描到的键值
}
void main()
{
int num=0, tmp;
while(1)
{
tmp = MatrixKeyscan();//扫描键盘判断是否有按键按下
if(tmp != -1) num = tmp;//当有按键按下时,将键值赋给num(无键按下时扫描键盘返回值-1)
《51系列单片机_矩阵按键检测》
此程序使用单片机89SC52
//1、此程序实现矩阵按键的检测功能,按下按键时,数码管显示按键的相应键值
#include<reg52.h>
voiddelay_ms(int n)//延时函数,延时n毫秒
{
inti, j;
for(i=0; i<n; i++)
for(j=0; j<110; j++);
}
voiddisplay(int num)//控制数码管按位输出显示数值num
{
charBitSet[8] =
{
0x7f, 0xbf, 0xdf, 0xef,
0xf7, 0xfb, 0xfd, 0xfe
};//用于设置(低电平位选)数码管的位选信号,从低到高对应8个数码管
charNumberCode[16] =
for(i=0; i<4; i++)
{
P1 = line[i];//将行扫描值逐个送至P1端口
tmp = P1;//再读取P1口的值
if(tmp != line[i])//若读取的数值不等于送入的行扫描值,表示有按键被按下
{
delay_ms(10);//延时,重新读取判断,确认有键按下
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
s t m控制乘矩阵键盘程序带松手检测精编
W O R D版
IBM system office room 【A0816H-A0912AAAHH-GX8Q8-GNTHHJ8】
/*本文件的函数,主要实现矩阵键盘的功能。
矩阵键盘使用PA0到PA7引脚,其中,PA0到PA3固定为推挽输出,PA4到PA7固定为
下拉输入。
即,无键按下时,对应PA4到PA7为0,有键按下时,PA4到PA7中,对应的引脚为高。
此程序有一点要注意:要用到的IO口,必须是PX0-PX7,,不能是其他连续的数字。
如果非要改。
如:已经没有连续的0-7的IO口,需要在几个地方修改,请注意!!
此程序带有松手检测。
*/
void InitKey(void) //初始化矩阵键盘要使用的GPIO口。
{
GPIO_InitTypeDef GPIOStru;
GPIOStru.GPIO_Mode = GPIO_Mode_Out_PP; //定义PA0到PA3为推挽输出。
GPIOStru.GPIO_Speed = GPIO_Speed_50MHz;
GPIOStru.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_Init(GPIOA,&GPIOStru);
GPIOStru.GPIO_Mode = GPIO_Mode_IPD; //定义PA4到PA7为下拉输入。
GPIOStru.GPIO_Speed = GPIO_Speed_50MHz;
GPIOStru.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
//因为上面定义引脚为输出时,已经打开整个GPIOA的时钟了,所以此处不再需要函数RCC_APB2PeriphClockCmd()来打开时钟了。
GPIO_Init(GPIOA,&GPIOStru);
}
int key(void) //实现矩阵键盘。
返回值为,各按键的键值,此键值由用户自己定义。
{
int KeyVal=0; //keyVal为最后返回的键值。
u16 WriteVal=0; //WriteVal为要写给PA口的数据。
GPIO_Write(GPIOA,(GPIOA->ODR & 0xfff0 | 0xf)); //先让PA0到PA3全部输出高。
if((GPIOA->IDR & 0x00f0)==0x0000) //如果,PA4到PA7全为0,则,没有键按下。
此时,返回值为-1.
return -1;
else
{
delay_ms(5); //延时5ms去抖动。
if((GPIOA->IDR & 0x00f0)==0x0000) //如果,延时5ms后,PA4到PA7又全为0,则,刚才引脚的电位变化是抖动产生的.
return -1;
}
GPIO_Write(GPIOA,(GPIOA->ODR & 0xfff0 | 0x1)); //让PA3到PA0输出二进制的0001.
switch(GPIOA->IDR & 0x00f0) //对PA4到PA7的值进行判断,以输出不同的键值。
{
case 0x0010: KeyVal=15; break;
case 0x0020: KeyVal=11; break;
case 0x0040: KeyVal=7; break;
case 0x0080: KeyVal=3; break;
}
GPIO_Write(GPIOA,(GPIOA->ODR & 0xfff0 | 0x2)); //让PA3到PA0输出二进制的0010.
switch(GPIOA->IDR & 0x00f0) //对PA4到PA7的值进行判断,以输出不同的键值。
{
case 0x0010: KeyVal=14; break;
case 0x0020: KeyVal=10; break;
case 0x0040: KeyVal=6; break;
case 0x0080: KeyVal=2; break;
}
GPIO_Write(GPIOA,(GPIOA->ODR & 0xfff0 | 0x4)); //让PA3到PA0输出二进制的0100.
switch(GPIOA->IDR & 0x00f0) //对PA4到PA7的值进行判断,以输出不同的键值。
{
case 0x0010: KeyVal=13; break;
case 0x0020: KeyVal=9; break;
case 0x0040: KeyVal=5; break;
case 0x0080: KeyVal=1; break;
}
GPIO_Write(GPIOA,(GPIOA->ODR & 0xfff0 | 0x8)); //让PA3到PA0输出二进制的1000.
switch(GPIOA->IDR & 0x00f0) //对PA4到PA7的值进行判断,以输出不同的键值。
{
case 0x0010: KeyVal=12; break;
case 0x0020: KeyVal=8; break;
case 0x0040: KeyVal=4; break;
case 0x0080: KeyVal=0; break;
}
return KeyVal;
}。