矩阵按键程序

在我的盘子上是按下是0,不按是1

矩阵按键扫描原理:
先是把列置0,行是输入上拉,扫描行得到行的键值;再是把行置0,列是输入上拉,扫描列得到列的键值;最后把行列的键值相加得到最后的总的键值。
行扫描返回的键值为:0xe0,0xd0,0xb0,0x70
列扫描返回的键值为:0x0e,0x0d,0x0b,0x07
总的键值为:0xee,0xed,0xeb,0xe7,0xde,0xdd,0xdb,0xd7,0xbe,0xbd,0xbb,0xb7,0x7e,0x7d,0x7b,0x77。正好十六个键值

我用数码管来验证矩阵键盘函数的正确性,依次按下按键数码管显示0-F数字也可以用led来验证

我是用的D0-3控制列,D4-7控制行
A8-11控制数码管位,A0-7控制数码管段

这个工程总共有五个文件分别如下

main.c

#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"int main(void)
{   RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);  //系统时钟设置PLL作为系统时钟delay_init();          //延时初始化 NUM_KEY_Matrix_Init();              //初始化矩阵键盘与数码管连接的硬件接口KEY_Matrix_Scan();                //4*4键盘检验扫描函数}

key.c

#include "stm32f10x.h"
#include "key.h"
#include "sys.h"
#include "delay.h"#define row 0xf0   //行扫描码
#define column 0x0f //列扫描码//矩阵键盘
unsigned char key_value;
unsigned char num[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
u32 temp1=0,temp2=0;
unsigned char key_value_r;  //行扫描键值
unsigned char key_value_c;  //列扫描键值//矩阵按键初始化函数
void KEY_Matrix_Init(void) //IO初始化
{ Matrix_enable;
}
//行扫描配置
void juzhen_Init1(){GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin  = Matrix_COLUMN_GPIO;  //GPIOD低八位端口的d0-d3为推挽输出端,d4-d7为输入上拉GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //推挽输出GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;  //最高输出速率50MHzGPIO_Init(Matrix_PIO, &GPIO_InitStructure);  //IO口初始化GPIO_InitStructure.GPIO_Pin  = Matrix_ROW_GPIO;GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;  //最高输出速率50MHzGPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;  //输入上拉GPIO_Init(Matrix_PIO, &GPIO_InitStructure);  //IO口初始化//初始化管脚电平GPIO_ResetBits(Matrix_PIO,Matrix_COLUMN_GPIO);   //置0GPIO_SetBits(Matrix_PIO, Matrix_ROW_GPIO);  //置1
}
//列扫描配置
void juzhen_Init2(){GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin  = Matrix_COLUMN_GPIO;  //GPIOD低八位端口的d4-d7为推挽输出端,d0-d3为输入上拉GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;  //最高输出速率50MHzGPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;  //输入上拉GPIO_Init(Matrix_PIO, &GPIO_InitStructure);  //IO口初始化GPIO_InitStructure.GPIO_Pin  = Matrix_ROW_GPIO;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //推挽输出GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;  //最高输出速率50MHz GPIO_Init(Matrix_PIO, &GPIO_InitStructure);  //IO口初始化//初始化管脚电平GPIO_SetBits(Matrix_PIO,Matrix_COLUMN_GPIO);   //置1GPIO_ResetBits(Matrix_PIO,Matrix_ROW_GPIO);  //置0}
//按键处理函数
unsigned char row_scan(void)   //行扫描函数
{//行扫描配置juzhen_Init1();delay_ms(20);temp1 = (GPIO_ReadInputData(Matrix_PIO)&row);   if (temp1!=0xf0)  {delay_ms(20);key_value_r=temp1;    //读行扫描的键值//GPIOD->ODR= 0xff;           //扫描后恢复无按键按下状态}else{key_value_r=0;}return key_value_r;    //返回行扫描键值
}
unsigned char column_scan(void)  //列扫描函数
{//列扫描配置juzhen_Init2();delay_ms(20);temp2 = (GPIO_ReadInputData(Matrix_PIO)&column);   if (temp2!=0x0f)  {delay_ms(20);key_value_c=temp2;    //读列扫描的键值//GPIOD->ODR = 0xff;           //扫描后恢复无按键按下状态}else{key_value_c=0;}return key_value_c;    //返回列扫描键值
}void KEY_Matrix_Scan(void)  //4*4键盘检验扫描函数
{    u16 a,b;          //键值变量KEY_Matrix_Init();             //初始化与按键连接的硬件接口
//  NUM_Init();             //初始化与LED连接的硬件接口while(1){ delay_ms(20);b=column_scan();delay_ms(20);a=row_scan();key_value=a+b;  //键值生成switch(key_value){case 0xee:GPIOA->ODR=num[0];break;case 0xed:GPIOA->ODR=num[1];break;case 0xeb:GPIOA->ODR=num[2];break;case 0xe7:GPIOA->ODR=num[3];break;case 0xde:GPIOA->ODR=num[4];break;case 0xdd:GPIOA->ODR=num[5];break;case 0xdb:GPIOA->ODR=num[6];break;case 0xd7:GPIOA->ODR=num[7];break;case 0xbe:GPIOA->ODR=num[8];break;case 0xbd:GPIOA->ODR=num[9];break;case 0xbb:GPIOA->ODR=num[10];break;case 0xb7:GPIOA->ODR=num[11];break;case 0x7e:GPIOA->ODR=num[12];break;case 0x7d:GPIOA->ODR=num[13];break;case 0x7b:GPIOA->ODR=num[14];break;case 0x77:GPIOA->ODR=num[15];break;default: GPIOA->ODR=0xff;}}
}

key.h

 #include "sys.h"//矩阵键盘引脚配置
#define Matrix_PIO GPIOD  //矩阵按键GPIO端口设置
#define Matrix_enable RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE)  //使能GPIO时钟,给矩阵键盘时钟使能
#define Matrix_COLUMN_GPIO GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3        //GPIO的0-3引脚控制 列
#define Matrix_ROW_GPIO GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7        //GPIO的4-7引脚控制 行
void KEY_Matrix_Init(void);//IO初始化
void KEY_Matrix_Scan(void);//4*4键盘检验扫描函数
//矩阵键盘行列扫描函数
unsigned char row_scan(void);  //行扫描函数返回一个键值key_value_r
unsigned char column_scan(void);   //列扫描函数返回一个键值key_value_c
//key_value为总的键值,key_value=key_value_r+key_value_c

led.c

//数码管用于矩阵键盘输出0-F与硬件接口初始化配置
void NUM_KEY_Matrix_Init(void)
{GPIO_InitTypeDef  GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //使能GPIOA端口时钟GPIO_InitStructure.GPIO_Pin  = GPIOAA;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //推挽输出GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;  //最高输出速率50MHz  GPIO_Init(GPIOA, &GPIO_InitStructure);  //IO口初始化//初始化管脚电平GPIO_SetBits(GPIOA, GPIOAL);   //置1GPIO_ResetBits(GPIOA,GPIOAH);   //置0}

led.h

#include "sys.h"
//数码管引脚用于检验矩阵按键
#define GPIOAA GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|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_Pin_11   //GPIOA的0-11引脚
#define GPIOAL GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7   //GPIOA的0-7引脚
#define GPIOAH GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11  //GPIOA的8-11引脚
void NUM_KEY_Matrix_Init(void);//数码管用于矩阵键盘输出0-F与硬件接口初始化配置

STM32——库函数版——矩阵按键程序相关推荐

  1. STM32 4*4矩阵按键

    本文章讲述了如何用STM32编写4*4矩阵按键程序,先简单介绍一下扫描的基本方法:1.反转法 2.行列扫描.本文主要介绍行列扫描 欢迎加入嵌入式学习群:559601187 (一)代码如下 /***** ...

  2. STM32的矩阵按键程序思路

    一:开个头 之前学52的时候学过矩阵按键的程序,但是当我第一次拿到32板子写程序的时候还是有一点懵,不过还来理理思路,感觉想一想还是可以写出来的,我这次是没有自己去焊矩阵按键,而是买了一个薄膜按键,省 ...

  3. 基于GD32矩阵按键程序实现

    目录 一.简介 二.原理图 三.程序实现 一.简介 矩阵键盘,也称矩阵按键,是为了节约单片机IO口占用所引入的一种外设. 二.矩阵按键的原理图 三.程序实现 GPIO初始化引脚代码 /*!\brief ...

  4. AD按键-矩阵按键-独立按键:

    原理:利用数组分压+AD采集: 优点:一个IO口可以做成多个按键,节省IO口(矩阵键盘在>4时优点才能体现出来):可备用作为AD基准输入. 缺点:不能做成组合按键(或者电阻要精确选择):且离IO ...

  5. c语言单片机实现按钮互锁,用单片机数码管和矩阵按键实现密码锁功能 附原理图+源程序...

    #include "digdisplay.h"                        //矩阵按键输入10(键表面为S11,程序中默认都是数值)为密码确认,矩阵按键输入11 ...

  6. STM32入门笔记(02):MPU6050、MPU9250、ICM20948及姿态解算(SPL库函数版)

    目录 MPU6050 什么是MPU6050? MPU6050的特点 MPU6050框图 MPU6050初始化 MPU6050寄存器 电源管理寄存器1(0X6B) 陀螺仪配置寄存器(0X1B) 加速度传 ...

  7. 4x4矩阵键盘工作原理及扫描程序_单片机人机交互矩阵按键

    按键是一种常开型按钮开关,与单片机的常见接法如图所示.按键未按下时两个触点断开,单片机I/O口输入高电平:当按键闭合时,I/O口输入低电平. 一.按键讲解 当I/O口为P0口时,由于没有内部上拉电阻, ...

  8. STM32入门笔记(02):定时器之定时器中断、输入捕获和PWM输出(SPL库函数版)

    目录 定时器 8个定时器 定时器功能 定时器中断 常用通用定时器的寄存器 定时器中断实验目的: 定时器库函数及步骤 实验程序讲解 PWM 简介 STM32 PWM工作过程 PWM模式1 与 PWM模式 ...

  9. STM32F103 矩阵键盘4*4 16*16等任意矩阵 按键扫描程序

    基于STM32的按键扫描测试程序(学习记录): 目录: 源码: 4x4按键原理: 按键扫描逻辑: Tips: 粘贴代码时,粘贴在源文件存放的位置中(如:HARDWARE中的.c和.h文件),用C++编 ...

  10. 矩阵键盘程序_独立按键与矩阵按键

    一.独立按键原理 按键在闭合和断开时,触点会存在抖动现象 硬件消抖电路 独立按键控制程 二.独立按键控制程序 #include "reg52.h" typedef unsigned ...

最新文章

  1. 如何将yolo的标注(annotations).txt 坐标转换成tensorflow-yolov3(YunYang1994)的.txt 标注坐标?
  2. Groovy轻松入门——通过与Java的比较,迅速掌握Groovy (更新于2008.10.18)
  3. matlab 曲面拟合_利用python进行曲面拟合并进行3D显示
  4. Opencv实现多幅图片拼接在一起
  5. 近期在做或要做的实验
  6. SSM整合(二)(mybatis逆向工程)
  7. IDEA取消双击shift出现的搜索框
  8. Visual Foxpro 6.0教程
  9. Android对话框控件读写,Android 对话框控件
  10. 商业模拟游戏:柠檬汁杰克项目
  11. ANSYS预紧力螺栓连接结构(一HyperMesh添加接触单元)
  12. 第五章 组合逻辑电路设计
  13. 当年明月《明朝那些事儿》读书笔记
  14. 一行代码实现IOS 3DES加密解密
  15. Origin色卡(oth、pal格式)
  16. error: cannot use promoted field in struct literal of type [duplicate]
  17. ANDROID 11 文件系统挂载
  18. 我的Android说
  19. 慕课网跟练系列——侧边栏导航跟随案例
  20. 一个64位操作系统的实现

热门文章

  1. Android篮球计分器App
  2. 30分钟快速上手mybatis框架,内容简单易懂,绝无废话,追求速度的来
  3. matlab 找到数组中第一个不连续点_MATLAB新手入门篇1(基础)
  4. 语言模拟蒲丰问题_播音主持专业艺考模拟主持八大禁忌!
  5. abb外部轴零位校准_【ABB】ABB机器人外部轴参数(KpKvTi)调试
  6. 解决SpringBoot集成Redis出现RedisConnectionException: Unable to connect to 192.168.64.100:6379
  7. win7 ASP.NET 2.0 部署
  8. 并发相关随笔(持续更新)
  9. jetty client 与apache http client的实现、分析
  10. VMware Converter Standalone结合TrueImage 迁移HyperV虚机