精华内容
下载资源
问答
  • stm32f103开发板。 消抖。 col列,Pin配置为PP推挽输出模式; row行,Pin配置为Input模式,启用内部上拉电阻
  • STM32矩阵键盘的实现

    2018-06-24 11:04:45
    STM32中断的方式实现矩阵按键。使用外部中断5_9,外部中断接口接PC8~PC5。
  • stm32矩阵键盘按键扫描程序亲测可用,PA0~PA7为矩阵键盘接口,PA9PA10为串口
  • STM32矩阵键盘代码

    2016-12-16 08:43:17
    该程序是STM32F103系列的矩阵键盘代码,本人使用过
  • STM32矩阵键盘测试代码以及完整工程 使用的是正点原子的精英版测试的,可通过串口发送所按下的按键的键值 工程完整,注释清楚,可以直接使用 方便移植 此次的实验GPIO口链接图: C4------------>PC0 C3-...
  • STM32矩阵键盘实现

    2015-06-25 00:23:07
    基于STM32矩阵键盘实现,可用于开发板外置键盘的使用
  • stm 32f103zet6的矩阵键盘源带吗
  • 关联文章https://blog.csdn.net/langdao04/article/details/89705210
  • 简单的基于stm32的4*4矩阵键盘设计。
  • stm32矩阵键盘

    2018-11-15 09:55:38
    stm32工程 矩阵键盘 引脚都对应上的话可以直接用 对不上的话需要修改一下
  • STM32 矩阵键盘 程序 可以实现任意不连续引脚配置的完美设置 并且显示 显示采用JLX12864G-086-PC 引脚任意配置 完美显示
  • STM32矩阵键盘

    千次阅读 2019-06-30 20:26:01
    //矩阵键盘: //行4:PF1 //行3:PF3 //行2:PF5 //行1:PF7、 //列1:PF0 //列2:PF2 //列3:PF4 //列4:PF6 void KEY_Init(void) { GPIO_InitTypeDef GPIO_InitStructure1,GPIO_InitStru...

    #include "key.h"

    static u8 key_up=1;

    //矩阵键盘:

    //行4:PF1

    //行3:PF3

    //行2:PF5

    //行1:PF7、

    //列1:PF0

    //列2:PF2

    //列3:PF4

    //列4:PF6
    void KEY_Init(void)
    {
    GPIO_InitTypeDef GPIO_InitStructure1,GPIO_InitStructure2;
     RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);           //打开时钟 
        
     GPIO_InitStructure1.GPIO_Pin = GPIO_Pin_7|GPIO_Pin_5|GPIO_Pin_3|GPIO_Pin_1;  //行
     GPIO_InitStructure1.GPIO_Mode = GPIO_Mode_IN;                                                
     GPIO_InitStructure1.GPIO_Speed = GPIO_Speed_100MHz;
     GPIO_InitStructure1.GPIO_PuPd = GPIO_PuPd_UP;
     GPIO_Init(GPIOF, &GPIO_InitStructure1); 
        
     GPIO_InitStructure2.GPIO_Pin =GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_4|GPIO_Pin_6;    //列
     GPIO_InitStructure2.GPIO_Mode =GPIO_Mode_OUT;
     GPIO_InitStructure2.GPIO_Speed = GPIO_Speed_100MHz;
     GPIO_InitStructure2.GPIO_PuPd =GPIO_PuPd_DOWN;
     GPIO_Init(GPIOF, &GPIO_InitStructure2);

    }
    u8 KEY_Scan(u8 mode)  //mode=0  ?????  mode=1  
    {     
      
      u8 keyvalue = 0;
        //static u8 key_up = 1; //按键松开标志
        if(mode) key_up = 1; //连按
        
        GPIO_ResetBits(GPIOF,GPIO_Pin_0);
        GPIO_ResetBits(GPIOF,GPIO_Pin_2);
        GPIO_ResetBits(GPIOF,GPIO_Pin_4);
        GPIO_ResetBits(GPIOF,GPIO_Pin_6);
        if(key_up && (KEYF7==0 || KEYF5==0 || KEYF3==0 || KEYF1==0))
        { 
            delay_ms(10); //消抖
            key_up=0;   
            if(KEYF7==0)  keyvalue =0;
            if(KEYF5==0)  keyvalue =4;
            if(KEYF3==0)  keyvalue =8;
            if(KEYF1==0)  keyvalue =12;

            GPIO_ResetBits(GPIOF,GPIO_Pin_0);        
            GPIO_SetBits(GPIOF,GPIO_Pin_2);
            GPIO_SetBits(GPIOF,GPIO_Pin_4);
            GPIO_SetBits(GPIOF,GPIO_Pin_6);
            if(KEYF7==0||KEYF5==0||KEYF3==0||KEYF1==0) keyvalue = keyvalue+1;

            GPIO_SetBits(GPIOF,GPIO_Pin_0);        
            GPIO_ResetBits(GPIOF,GPIO_Pin_2);
            GPIO_SetBits(GPIOF,GPIO_Pin_4);
            GPIO_SetBits(GPIOF,GPIO_Pin_6);
            if(KEYF7==0||KEYF5==0||KEYF3==0||KEYF1==0) keyvalue = keyvalue+2;

            GPIO_SetBits(GPIOF,GPIO_Pin_0);        
            GPIO_SetBits(GPIOF,GPIO_Pin_2);
            GPIO_ResetBits(GPIOF,GPIO_Pin_4);
            GPIO_SetBits(GPIOF,GPIO_Pin_6);
            if(KEYF7==0||KEYF5==0||KEYF3==0||KEYF1==0) keyvalue = keyvalue+3;

            GPIO_SetBits(GPIOF,GPIO_Pin_0);        
            GPIO_SetBits(GPIOF,GPIO_Pin_2);
            GPIO_SetBits(GPIOF,GPIO_Pin_4);
            GPIO_ResetBits(GPIOF,GPIO_Pin_6);
            if(KEYF7==0||KEYF5==0||KEYF3==0||KEYF1==0) keyvalue = keyvalue + 4;    
                return keyvalue;
        }else if((KEYF7==1 && KEYF5==1 &&KEYF3==1 && KEYF1==1)) key_up=1; 
        return 0;
    }
     

    展开全文
  • 使用的是正点原子战舰开发板,屏幕使用的是lcd触摸屏,矩阵键盘连接PA0-PA7,可以改变其他值,有个问题是第三排按键好像不能用,应该是战舰开发板的硬件问题,这里我没有修改
  • stm32F1矩阵键盘程序

    2018-12-25 11:20:17
    这是一个基于STM32F1的矩阵键盘程序,使用的HAL库,已测试成功,移植方便
  • 上一篇说完了STM32库开发的引脚输出控制,这一篇对其引脚输入控制方法进行说明,引脚设置为输入功能时能够感知引脚上的电平高低,具有模拟输入复用功能的引脚还可以结合芯片内部的A/D准确测量其电平值,后续在ADC...
  • stm32矩阵键盘扫描

    2015-08-09 10:24:21
    stm32矩阵键盘扫描程序,亲测可用,GPIOA口,原理与51单片机类似
  • stm32矩阵键盘学习笔记

    千次阅读 2021-01-23 21:49:23
    矩阵键盘矩阵键盘简介矩阵键盘扫描原理端口的配置相关函数的编写主函数与其他串口的接线与矩阵键盘的接线load与运行调试 矩阵键盘简介 什么是矩阵键盘 矩阵键盘是单片机外部设备中所使用的排布类似于矩阵的键盘组,...

    矩阵键盘简介

    1. 什么是矩阵键盘
      矩阵键盘是单片机外部设备中所使用的排布类似于矩阵的键盘组,由于电路设计时需要更多的外部输入,单独的控制一个按键需要浪费很多的IO资源,所以就有了矩阵键盘,常用的矩阵键盘有4X4和8X8,其中用的最多的是4X4。
    2. 矩阵键盘的原理
      矩阵键盘又称为行列式键盘,它是用4条I/O线作为行线,4条I/O线作为列线组成的键盘。
      在行线和列线的每一个交叉点上,设置一个按键。这样键盘中按键的个数是4×4个。
      这种行列式键盘结构能够有效地提高单片机系统中I/O口的利用率。由于单片机IO端口具有线与的功能,因此当任意一个按键按下时,行和列都有一根线被线与,通过运算就可以得出按键的坐标从而判断按键键值。

    矩阵键盘扫描原理

    在这里插入图片描述

    1. 行扫描的原理:因为如果有按键按下的话,某一个输入的引脚就会跟对应的输出引脚连接,因为输出为高电平,所以对应的输入引脚会被拉高,读取引脚的状态,判断哪个引脚被拉高就可以知道哪一行有按键按下了;总的来说是通过高四位输出高电平来对矩阵键盘进行逐行扫描,当低四位接收到的数据不全为1的时候,说明有按键按下,然后通过接收到的数据是哪一位为0来判断是哪一行按键被按下。
    2. 再通过列操作模块:
    #define KEY_CLO0_OUT_LOW  GPIO_WriteBit(GPIOB,GPIO_Pin_12,Bit_RESET)
    #define KEY_CLO1_OUT_LOW  GPIO_WriteBit(GPIOB,GPIO_Pin_13,Bit_RESET)
    #define KEY_CLO2_OUT_LOW  GPIO_WriteBit(GPIOB,GPIO_Pin_14,Bit_RESET)
    #define KEY_CLO3_OUT_LOW  GPIO_WriteBit(GPIOB,GPIO_Pin_15,Bit_RESET)
    
    #define KEY_CLO0_OUT_HIGH  GPIO_WriteBit(GPIOB,GPIO_Pin_12,Bit_SET) 
    #define KEY_CLO1_OUT_HIGH  GPIO_WriteBit(GPIOB,GPIO_Pin_13,Bit_SET)
    #define KEY_CLO2_OUT_HIGH  GPIO_WriteBit(GPIOB,GPIO_Pin_14,Bit_SET)
    #define KEY_CLO3_OUT_HIGH  GPIO_WriteBit(GPIOB,GPIO_Pin_15,Bit_SET)
    
    

    来进行列扫描。

    端口的配置

    介绍完矩阵键盘的扫描原理了我们该通过keli来实现我们想要的功能啦,首先我们要进行的就是对我们所需要的端口进行配置,如下:

    
    //端口的配置
    void key_init(){
    
    	GPIO_InitTypeDef GPIO_InitStruture;
    	
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //打开PB时钟
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); //打开PE时钟
    	
    	//定义PB12、PB13、PB14、PB15为推挽输出 
    	GPIO_InitStruture.GPIO_Mode = GPIO_Mode_Out_PP;
    	GPIO_InitStruture.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
    	GPIO_InitStruture.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_Init(GPIOB,&GPIO_InitStruture);
    	
    	//定义PD8、PD9、PD10、PD11为上拉输入 分别定义为四行
    	GPIO_InitStruture.GPIO_Mode = GPIO_Mode_IPU;
    	GPIO_InitStruture.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11;
    	GPIO_Init(GPIOD,&GPIO_InitStruture);
    }
    

    相关函数的编写

    配置完我们所需要的端口,接下来我们就应该编写相关函数啦。

    1. 行扫描函数:
    //如果为1,代表没有按键被按下,如果为0,代表有按键被按下
    char KEY_ROW_SCAN(void)
    {
        //读出行扫描状态
        Key_row[0] = GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_8)<<3;
        Key_row[0] = Key_row[0] | (GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_9)<<2);
        Key_row[0] = Key_row[0] | (GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_10)<<1);
        Key_row[0] = Key_row[0] | (GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_11));
        
    	if(Key_row[0] != 0x0f)         //不是1111,代表肯定有一个0行
        {
          delay_ms(10);                    //消抖
          if(Key_row[0] != 0x0f)
    		  //0111 1011 1101 1110
            {   
                    //printf("Key_Row_DATA = 0x%x\r\n",Key_row[0]);
                    switch(Key_row[0])
                    {
                        case 0x07:         //0111 判断为该列第1行的按键按下
                            return 1;
                        case 0x0b:         //1011 判断为该列第2行的按键按下
                            return 2;
                        case 0x0d:         //1101 判断为该列第3行的按键按下
                            return 3;
                        case 0x0e:         //1110 判断为该列第4行的按键按下
                            return 4;
                        default :
                            return 0;
                    }
            }
            else return 0;
        }
        else return 0;
    }
    
    1. 按键扫描函数:
    char KEY_SCAN(void)
    {    
        char Key_Num=0;            //1-16对应的按键数
        char key_row_num=0;        //行扫描结果记录
        
        KEY_CLO0_OUT_LOW;        
        if( (key_row_num=KEY_ROW_SCAN()) != 0 )
        { 
            while(KEY_ROW_SCAN() != 0);  //消抖
            Key_Num = 0 + key_row_num;
        }
        KEY_CLO0_OUT_HIGH;
        
        KEY_CLO1_OUT_LOW;        
        if( (key_row_num=KEY_ROW_SCAN()) != 0 )
        { 
            while(KEY_ROW_SCAN() != 0);
            Key_Num = 4 + key_row_num;
        }
        KEY_CLO1_OUT_HIGH;
        
        KEY_CLO2_OUT_LOW;    
        if( (key_row_num=KEY_ROW_SCAN()) != 0 )
        { 
            while(KEY_ROW_SCAN() != 0);
        Key_Num = 8 + key_row_num;
        }
        KEY_CLO2_OUT_HIGH;
        
        KEY_CLO3_OUT_LOW;    
        if( (key_row_num=KEY_ROW_SCAN()) != 0 )
        {
            while(KEY_ROW_SCAN() != 0);
            Key_Num = 12 + key_row_num;
        }
        KEY_CLO3_OUT_HIGH;
        
        return Key_Num;
    }
    

    主函数与其他

    1. 主函数:
    #include "stm32f10x.h"
    #include "delay.h"
    #include "led.h"
    #include "key16.h"
    #include "stdio.h"
    #include "usart.h"
    
    
    int main(void)
    {
    	vu8 key=0;
    	char key_confirm;
    	led_init();
    	delay_init();
    	key_init();
    	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    	uart_init(115200);
    	
    	while(1)
    	{
    		key_confirm = KEY_SCAN();
    		if(key_confirm>0&&key_confirm<17){
    			printf("Key_NUM = %d \r\n",key_confirm); //按下1-16个按键的操作
          printf("= = = = = = = = = = = \r\n");		
    		}	
    	}	
    
    }
    
    1. key.c:
    #include "key16.h"
    #include "delay.h"
    
    
    uint8_t Key_row[1]={0xff};   //定义一个数组,存放行扫描状态
    
    //端口的配置
    void key_init(){
    
    	GPIO_InitTypeDef GPIO_InitStruture;
    	
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //打开PB时钟
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); //打开PE时钟
    	
    	//定义PB12、PB13、PB14、PB15为推挽输出 
    	GPIO_InitStruture.GPIO_Mode = GPIO_Mode_Out_PP;
    	GPIO_InitStruture.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
    	GPIO_InitStruture.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_Init(GPIOB,&GPIO_InitStruture);
    	
    	//定义PD8、PD9、PD10、PD11为上拉输入 分别定义为四行
    	GPIO_InitStruture.GPIO_Mode = GPIO_Mode_IPU;
    	GPIO_InitStruture.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11;
    	GPIO_Init(GPIOD,&GPIO_InitStruture);
    	
    
    }
    
    /***
     *函数名:KEY_ROW_SCAN
     *功  能:按键行扫描
     *返回值:1~4,对应1~4行按键位置
     */
    //如果为1,代表没有按键被按下,如果为0,代表有按键被按下
    char KEY_ROW_SCAN(void)
    {
        //读出行扫描状态
        Key_row[0] = GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_8)<<3;
        Key_row[0] = Key_row[0] | (GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_9)<<2);
        Key_row[0] = Key_row[0] | (GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_10)<<1);
        Key_row[0] = Key_row[0] | (GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_11));
        
    	if(Key_row[0] != 0x0f)         //不是1111,代表肯定有一个0行
        {
          delay_ms(10);                    //消抖
          if(Key_row[0] != 0x0f)
    		  //0111 1011 1101 1110
            {   
                    //printf("Key_Row_DATA = 0x%x\r\n",Key_row[0]);
                    switch(Key_row[0])
                    {
                        case 0x07:         //0111 判断为该列第1行的按键按下
                            return 1;
                        case 0x0b:         //1011 判断为该列第2行的按键按下
                            return 2;
                        case 0x0d:         //1101 判断为该列第3行的按键按下
                            return 3;
                        case 0x0e:         //1110 判断为该列第4行的按键按下
                            return 4;
                        default :
                            return 0;
                    }
            }
            else return 0;
        }
        else return 0;
    }
    
    /***
     *函数名:KEY_SCAN
     *功  能:4*4按键扫描
     *返回值:0~16,对应16个按键
     */
    char KEY_SCAN(void)
    {    
        char Key_Num=0;            //1-16对应的按键数
        char key_row_num=0;        //行扫描结果记录
        
        KEY_CLO0_OUT_LOW;        
        if( (key_row_num=KEY_ROW_SCAN()) != 0 )
        { 
            while(KEY_ROW_SCAN() != 0);  //消抖
            Key_Num = 0 + key_row_num;
        }
        KEY_CLO0_OUT_HIGH;
        
        KEY_CLO1_OUT_LOW;        
        if( (key_row_num=KEY_ROW_SCAN()) != 0 )
        { 
            while(KEY_ROW_SCAN() != 0);
            Key_Num = 4 + key_row_num;
            //printf("Key_Clo_2\r\n");
        }
        KEY_CLO1_OUT_HIGH;
        
        KEY_CLO2_OUT_LOW;    
        if( (key_row_num=KEY_ROW_SCAN()) != 0 )
        { 
            while(KEY_ROW_SCAN() != 0);
        Key_Num = 8 + key_row_num;
            //printf("Key_Clo_3\r\n");
        }
        KEY_CLO2_OUT_HIGH;
        
        KEY_CLO3_OUT_LOW;    
        if( (key_row_num=KEY_ROW_SCAN()) != 0 )
        {
            while(KEY_ROW_SCAN() != 0);
            Key_Num = 12 + key_row_num;
        }
        KEY_CLO3_OUT_HIGH;
        
        return Key_Num;
    }
    
    
    1. key.h:
    #ifndef _KEY16_H
    #define _KEY16_H
    
    #include "sys.h"
    #include "stm32f10x.h"
    
    #include <string.h>
    
    
    void key_init();
    char KEY_SCAN(void);
    char KEY_ROW_SCAN(void);
    void HW_KEY_FUNCTION(void);
    
    
    #define KEY_CLO0_OUT_LOW  GPIO_WriteBit(GPIOB,GPIO_Pin_12,Bit_RESET)
    #define KEY_CLO1_OUT_LOW  GPIO_WriteBit(GPIOB,GPIO_Pin_13,Bit_RESET)
    #define KEY_CLO2_OUT_LOW  GPIO_WriteBit(GPIOB,GPIO_Pin_14,Bit_RESET)
    #define KEY_CLO3_OUT_LOW  GPIO_WriteBit(GPIOB,GPIO_Pin_15,Bit_RESET)
    
    #define KEY_CLO0_OUT_HIGH  GPIO_WriteBit(GPIOB,GPIO_Pin_12,Bit_SET) 
    #define KEY_CLO1_OUT_HIGH  GPIO_WriteBit(GPIOB,GPIO_Pin_13,Bit_SET)
    #define KEY_CLO2_OUT_HIGH  GPIO_WriteBit(GPIOB,GPIO_Pin_14,Bit_SET)
    #define KEY_CLO3_OUT_HIGH  GPIO_WriteBit(GPIOB,GPIO_Pin_15,Bit_SET)
    
    
    #endif
    
    

    串口的接线与矩阵键盘的接线

    1. 首先我们先接串口,把串口的VCC和GND分别接到主板上的3.3V和GND上(注意要把串口上的插线帽调整到3.3V,不然容易把板子烧坏,板子烧坏了那可就成大xx了),然后再把串口上的TXD和RXD分别连到主板的RXD和TXD。
    2. 然后我们来接矩阵键盘,要用到八根线,R1 ~ R4分别连到主板上的PD8 ~ PD11,C1 ~ C4分别连到主板上的PB12 ~ PB15.
      在这里插入图片描述

    load与运行调试

    好啦,所有准备工作都完成啦!!又到了我们激动人心的时刻啦!!
    运行成功图如下:
    在这里插入图片描述
    over。

    展开全文
  • 矩阵键盘 stm32 可以使用 4*4矩阵键盘驱动
  • STM32矩阵键盘 EEPROM OLED 综合代码源程序 亲写 亲测 可用....................................................................................................................................................
  • stm32矩阵键盘程序

    2016-07-25 13:43:46
    最简单的矩阵键盘程序代码,扫描只有九行代码,通俗易懂,方便移植,
  • STM32矩阵键盘 一、实现效果   同时可实现 按键消抖 松手 二、使用方法  ① 包含正点原子的sys.h  ② 制作.h .c文件 -源码见 “二”  ③ 把 key_scan 函数 放入 5ms 的定时器中断,可自实现 按键消抖  ④ 按...

    STM32矩阵键盘(HAL库)

    根据 源博客 基于 STM32F407 使用 4*4 矩阵键盘(附完整程序) 改编而来

    一、实现效果

      同时可实现 按键消抖 松手检测

    二、使用方法

     ① 包含正点原子的sys.h
     ② 制作.h .c文件 -源码见 “二”
     ③ 把 key_scan 函数 放入 5ms 的定时器中断,可自实现 按键消抖
     ④ 接线方法
    接线方法
     ⑤ 按键值keyval可这么用 :

    void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
    {
        if(htim==(&htim1))  //1ms定时
        {
            ms++;
            if (!(ms%5)) 
                key_scan();
        }
    }
    
    while (1)
    {
    	if (Key_val == 1) //**按键扫描**
    	{
    		while (Key_val == 1); //**松手检测**
    		xxxxxxxxxx //自己的逻辑代码块
    	]
    }
    

    三、源代码

    ①.c文件

    #include "matrix_key.h"
    #include "sys.h"
    #include "stm32f4xx.h"                  // Device header
    
    
    u8 Key_val = 0xff;
    
    void key_scan()
    {
    	uint16_t temp, flag = 0;
        static u8 key_state = 0;
        
        switch (key_state){
        case 0:{
        /*=========================以下代码是按键扫描程序=========================*/
    	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_RESET); // 先清空引脚状态
    	/*----------------------------Scan the 1st ROW----------------------------*/
    	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2, GPIO_PIN_SET);   // 设置PD0~2为1
    	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_3, GPIO_PIN_RESET);                       // 设置PD3为0    二进制编码为 0111
        if((GPIOD->IDR & 0xF0) != 0xF0)
        {key_state = 1;flag = 1;}
        HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_RESET);
    	/*----------------------------Scan the 2nd ROW----------------------------*/
    	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_3, GPIO_PIN_SET);   
    	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);     
        if((GPIOD->IDR & 0xF0) != 0xF0)
        {key_state = 1;flag = 1;}
        HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_RESET);
    	/*----------------------------Scan the 3rd ROW----------------------------*/
    	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_SET);   
    	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_1, GPIO_PIN_RESET); 
        if((GPIOD->IDR & 0xF0) != 0xF0)
        {key_state = 1;flag = 1;}
        HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_RESET);
    	/*----------------------------Scan the 4th ROW----------------------------*/
    	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_SET);   
    	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0, GPIO_PIN_RESET);   
        if((GPIOD->IDR & 0xF0) != 0xF0)
        {key_state = 1;flag = 1;}
        if (flag == 0)
            Key_val = 0xff;
        }break;
        
        case 1:{
    	/*=========================以下代码是按键扫描程序=========================*/
    	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_RESET); // 先清空引脚状态
    	/*----------------------------Scan the 1st ROW----------------------------*/
    	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2, GPIO_PIN_SET);   // 设置PD0~2为1
    	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_3, GPIO_PIN_RESET);                       // 设置PD3为0    二进制编码为 0111
        if((GPIOD->IDR & 0xF0) != 0xF0){      
            flag = 1;
            temp = (GPIOD->IDR & 0xF7);                                         // GPIOD->IDR寄存器为端口输入数据寄存器
            switch(temp){                                                        // 用来读取GPIO口的电平状态
                case 0xE7 : Key_val = 1;key_state = 2;break;
                case 0xD7 : Key_val = 2;key_state = 2;break;
                case 0xB7 : Key_val = 3;key_state = 2;break;
                case 0x77 : Key_val = 4;key_state = 2;break;
                default  : Key_val = 0xff;key_state = 0;break;
            }}
    	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_RESET);
    	/*----------------------------Scan the 2nd ROW----------------------------*/
    	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_3, GPIO_PIN_SET);   
    	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);                       
    	
        if((GPIOD->IDR & 0xF0) != 0xF0){
            flag = 1;
            temp = (GPIOD->IDR & 0xFB);
            switch(temp){
                case 0xEB : Key_val = 5;key_state = 2;break;
                case 0xDB : Key_val = 6;key_state = 2;break;
                case 0xBB : Key_val = 7;key_state = 2;break;
                case 0x7B : Key_val = 8;key_state = 2;break;
                default  : Key_val = 0xff;key_state = 0; break;
            }}
    	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_RESET);
    	/*----------------------------Scan the 3rd ROW----------------------------*/
    	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_SET);   
    	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_1, GPIO_PIN_RESET);                       
    	
        if((GPIOD->IDR & 0xF0) != 0xF0){
            flag = 1;
            temp = (GPIOD->IDR & 0xFD);
            switch(temp){
                case 0xED : Key_val = 9;key_state = 2;break;
                case 0xDD : Key_val = 10;key_state = 2;break;
                case 0xBD : Key_val = 11;key_state = 2;break;
                case 0x7D : Key_val = 12;key_state = 2;break;
                default   : Key_val = 0xff;key_state = 0; break;
            }}
    	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_RESET);
    	/*----------------------------Scan the 4th ROW----------------------------*/
    	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_SET);   
    	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0, GPIO_PIN_RESET);                       
        if((GPIOD->IDR & 0xF0) != 0xF0){
            flag = 1;
            temp = (GPIOD->IDR & 0xFE);
            switch(temp){
                case 0xEE : Key_val = 13;key_state = 2;break;
                case 0xDE : Key_val = 14;key_state = 2;break;
                case 0xBE : Key_val = 15;key_state = 2;break;
                case 0X7E : Key_val = 16;key_state = 2;break;
                default  : Key_val = 0xff; key_state = 0;break;
            }}
        if (!flag) Key_val = 0xff;
        }break;
        case 2:{
        /*=========================以下代码是按键扫描程序=========================*/
    	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_RESET); // 先清空引脚状态
    	/*----------------------------Scan the 1st ROW----------------------------*/
    	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2, GPIO_PIN_SET);   // 设置PD0~2为1
    	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_3, GPIO_PIN_RESET);                       // 设置PD3为0    二进制编码为 0111
        if((GPIOD->IDR & 0xF0) == 0xF0)
            key_state = 0;
        HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_RESET);
    	/*----------------------------Scan the 2nd ROW----------------------------*/
    	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_3, GPIO_PIN_SET);   
    	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);     
        if((GPIOD->IDR & 0xF0) != 0xF0)
            key_state = 0;
        HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_RESET);
    	/*----------------------------Scan the 3rd ROW----------------------------*/
    	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_SET);   
    	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_1, GPIO_PIN_RESET); 
        if((GPIOD->IDR & 0xF0) != 0xF0)
            key_state = 0;
        HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_RESET);
    	/*----------------------------Scan the 4th ROW----------------------------*/
    	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_SET);   
    	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0, GPIO_PIN_RESET);   
        if((GPIOD->IDR & 0xF0) != 0xF0)
            key_state = 0;
        }
        }
    }
    
    

    ②.h文件

    #ifndef __MATRIX_KEY_H
    #define __MATRIX_KEY_H
    
    void key_scan(void);
    
    #endif
    
    
    
    展开全文
  • STM32F103矩阵键盘实验,按下那个键,串口输入显示,双去抖
  • STM32 矩阵键盘

    2011-08-26 08:21:22
    STM32 4*4矩阵键盘 1602显示
  • stm32矩阵键盘输入多位数据

    千次阅读 2019-04-12 15:31:39
    目的:实现矩阵键盘的多位数据输入 思路:使用while循环来规避掉循环检测中键盘的重复输入。

    目的:实现矩阵键盘的多位数据输入
    思路:使用while循环来规避掉循环检测中键盘的重复输入。

    注:键盘检测程序资源众多,此处不列举了。

    参数:
    key_back():键盘检测函数,返回值为key_val(键值),无摁键时返回no_ipt(无按键时的回传值,自订)

    方法:

    //进入while开始键盘检测,获得输入值后回传
    u8 key_input_part(void)
    {
    	while(1)
    	{
    		if( key_back()!= no_ipt)
    		 {return key_back();}
    	}
    }
    
    //循环输入,将数据整合为多位并返回,函数传参为输入位数
    u16 key_input(int a)
    {
    	int key[a];
    	u16 aa=0;
    	
    	//循环输入
    	for(int i=0;i<a;i++)
    	{
    		key[i]=key_input_part();
    		while(key[i]==key_back())
    		{;}
    	}
    	//数据整合
    	int bb=a-1;
    	for(int j=0;j<a;j++)
    	{
    		aa=aa+key[j]*MYS(bb);
    		bb--;
    	}
    	return aa;
    }
    
    //十进制幂运算,用于数据整合
    static u16 MYS(int a)
    {
    	int aa=1;
    	for(;a>0;a--)
    	{ aa=aa*10; }
    	return aa;
    }
    

    总结:调用函数后执行一次输入,然后进入while循环,松开按键之前不进行其他操作,以规避循环检测的重复输入,获得数据后将单个数据整合为多维数据,实现函数功能。

    结果:执行temp=key_input(4),依次输入1、3、2、5,调用temp可得temp=1325,实现功能。

    缺点:
    1、需要设定输入位数
    2、并不能避免循环输入检测对系统资源的占用

    结语:做课设中遇到的问题,搜索到的方案比较有限,于是自己想了一个,本站第一篇博客,有什么错误欢迎指出_(:з)∠)_

    展开全文
  • STM32 矩阵键盘扫描

    2017-07-27 03:49:45
    可以 任意管脚 数据结构实现 只需添加管脚无需其他修改 即可返回按键值
  • 不要手碰到矩阵键盘底部,否则一通混乱 2.按键消抖部分 最开始是这样的 rowScanningEnter(); Key_ROW = (u8)( (((u8)DETECT_R0) ) | (((u8)DETECT_R1) ) | (((u8)DETECT_R2) ) | ((u8)...
  • stm32 4*4矩阵键盘程序

    2017-03-25 10:57:51
    stm32 4*4矩阵键盘程序

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 999
精华内容 399
关键字:

stm32矩阵键盘