OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3001|回复: 1

STM32F429 实现4*4矩阵按键HAL库程序

[复制链接]

2

主题

48

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
377
金钱
377
注册时间
2019-8-13
在线时间
108 小时
发表于 2019-10-17 01:33:03 | 显示全部楼层 |阅读模式
感谢论坛网友(ID:Apu7578)在原有基础上修改的

/************************main.c**************************************************************/
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"
extern u8 keyValue_4X4;
/************************************************
ALIENTEK 阿波罗STM32F429开发板4*4矩阵按键
矩阵按键实验-HAL库函数版
作者:Bingo
************************************************/
int main(void)
{
    u8 key;
    HAL_Init();                     //初始化HAL库   
    Stm32_Clock_Init(360,25,2,8);   //设置时钟,180Mhz
    delay_init(180);                //初始化延时函数
    uart_init(115200);              //初始化USART
    LED_Init();
    KEY4X4_ON();                 //打开矩阵
    delay_ms(1000);
    printf("ScanInit...\r\n");
    while(1)
    {        
        key = KeyScan_4X4();
        switch(key)
          {
            case 1:  printf("S1\n" );  break;                                                                                
            case 2:  printf("S5\n" );  break;                                                                                 
            case 3:  printf("S9\n" );  break;                                                                              
            case 4:  printf("S13\n");  break;                                                                              
            case 5:  printf("S2\n" );  break;                                                
            case 6:  printf("S6\n" );  break;                                                                                
            case 7:  printf("S10\n");  break;                                                                                
            case 8:  printf("S14\n");  break;                                                                        
            case 9:  printf("S3\n" );  break;                                                                                       
            case 10: printf("S7\n" );  break;                                                                                                      
            case 11: printf("S11\n");  break;                                                                                                      
            case 12: printf("S15\n");  break;                                                                              
            case 13: printf("S4\n" );  break;                                                                                                      
            case 14: printf("S8\n" );  break;                                                                                                        
            case 15: printf("S12\n");  break;                                                                              
            case 16: printf("S16\n");  break;  
        }   
        delay_ms(10);      
    }
}

/****************************************************key.h*********************************************************/

#include "sys.h"

/******** 行线状态宏定义 ************/
#define                RAW1_STATE                PBin(6)
#define                RAW2_STATE                PBin(7)
#define                RAW3_STATE                PBin(8)
#define                RAW4_STATE                PBin(9)
/******** 列线状态宏定义 ************/
#define                COL1_STATE                PCin(6)
#define                COL2_STATE          PCin(7)
#define                COL3_STATE                PCin(8)
#define                COL4_STATE                PCin(9)
/********************* 键值分布*************************
                 S1           S2           S3                S4
                 S5                  S6           S7            S8
                 S9                  S10      S11                S12
                 S13          S14           S15            S16   
*******************************************************
********************矩阵按键连线***********************
                 PC6      PC7      PC8      PC9
        PB6-------|--------|--------|--------|----
        PB7 ------|--------|--------|--------|----
        PB8-------|--------|--------|--------|----
        PB9 ------|--------|--------|--------|----
*******************************************************/
/* -- 开关状态宏定义 -- */
#define         KEY4X4_OPEN                        1
#define         KEY4X4_CLOSE                0
/* -----------------所有相关函数 --------------------- */
void KEY4X4_ON(void);   // 开启矩阵键盘
void KEY4X4_OFF(void);        // 关闭矩阵键盘
void KEY4X4_RAW_SET(void);                                  // 行线置位
void KEY4X4_RAW_RESET(void);                                 // 行线复位
void KEY4X4_RAW_READ_Init(void);                  // 行线设为输入模式
void KEY4X4_COL_SET(void);                                        // 列线置位
void KEY4X4_COL_RESET(void);                                // 列线复位
void KEY4X4_COL_READ_Init(void);                    // 列线设为输入模式
u8 KeyScan_4X4(void);         // 键盘扫描函数




/***************************key.c***************************************************************************/
#include "key.h"
#include "delay.h"
u8 KeyScan_4X4(void)
{
        u8 keyValue=0;
    static u8 key_up=1;//按键松开标志
        KEY4X4_RAW_SET();                                                      // 行线置位 1
        KEY4X4_COL_RESET();                                                    // 列线复位 0
        KEY4X4_RAW_READ_Init();                                                // 行线设为输入模式
    if(key_up&&(RAW1_STATE==0||RAW2_STATE==0||RAW3_STATE==0||RAW4_STATE==0))
        {
        delay_ms(10);
        key_up=0;                                        //屏蔽此行则表示支持 连续按
                if           (RAW1_STATE==0)        keyValue=0;                                           // raw1
                else if(RAW2_STATE==0)        keyValue=1;                                               // raw2
                else if(RAW3_STATE==0)        keyValue=2;                                               // raw3
                else if(RAW4_STATE==0)        keyValue=3;                                               // raw4
                else return 0;       
               
                KEY4X4_RAW_RESET();                                                // 行线复位 0
                KEY4X4_COL_SET();                                                  // 列线置位 1
                KEY4X4_COL_READ_Init();                                            // 列线设为输入模式
                if(COL1_STATE==0||COL2_STATE==0||COL3_STATE==0||COL4_STATE==0)
                {
                        //delay_ms(5);
                        if           (COL1_STATE==0)        {keyValue+=1;       return keyValue;}   // col1
                        else if(COL2_STATE==0)        {keyValue+=5;       return keyValue;}   // col2
                        else if(COL3_STATE==0)        {keyValue+=9;       return keyValue;}   // col3
                        else if(COL4_STATE==0)        {keyValue+=13;      return keyValue;}        // col4
                        else return 0;
                }               
                return 0;
        }
    else if(RAW1_STATE==1&&RAW2_STATE==1&&RAW3_STATE==1&&RAW4_STATE==1) key_up=1;
        return 0;        //无按键按下
}
// 打开矩阵键盘
u8 KEY4X4_ON_OFF=KEY4X4_CLOSE; // 默认关闭
void KEY4X4_ON(void)
{
        KEY4X4_ON_OFF=KEY4X4_OPEN;
}
// 关闭矩阵键盘
void KEY4X4_OFF(void)
{
        KEY4X4_ON_OFF=KEY4X4_CLOSE;
}
/******************************  行线置位 1 *************************************/
void KEY4X4_RAW_SET(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;  
        __HAL_RCC_GPIOB_CLK_ENABLE();           //开启GPIOB时钟
                // PB6,PB7,PB8,PB9设为输出模式
        GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9;
        GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
        GPIO_InitStruct.Pull = GPIO_PULLUP;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
        HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);       
                // 4根行线置1
        HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9,GPIO_PIN_SET);       
}
/******************************  行线复位 0 *************************************/
void KEY4X4_RAW_RESET(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;   
        __HAL_RCC_GPIOB_CLK_ENABLE();           //开启GPIOB时钟
                // PB6,PB7,PB8,PB9设为输出模式
    GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9;
        GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
        GPIO_InitStruct.Pull = GPIO_PULLUP;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
        HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);       
                // 4根行线置0
        HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9,GPIO_PIN_RESET);       
}
/******************************  行线设为输入模式  ******************************/
void KEY4X4_RAW_READ_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;   
        __HAL_RCC_GPIOB_CLK_ENABLE();           //开启GPIOB时钟
                // PB6,PB7,PB8,PB9设为输入模式
        GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9;
        GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
        GPIO_InitStruct.Pull = GPIO_PULLUP;
        HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);               
}
/******************************  列线置位  **************************************/
void KEY4X4_COL_SET(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;  
        __HAL_RCC_GPIOC_CLK_ENABLE();           //开启GPIOC时钟
                // PC6,PC7,PC8,PC9设为输出模式
        GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9;
        GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
        GPIO_InitStruct.Pull = GPIO_PULLUP;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
        HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);       
                // 4根列线置1
    HAL_GPIO_WritePin(GPIOC,GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9,GPIO_PIN_SET);       
}
/******************************  列线复位  **************************************/
void KEY4X4_COL_RESET(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;   
        __HAL_RCC_GPIOC_CLK_ENABLE();           //开启GPIOC时钟
                // PC6,PC7,PC8,PC9设为输出模式
        GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9;
        GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
        GPIO_InitStruct.Pull = GPIO_PULLUP;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
        HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);       
                // 4根列线置0
    HAL_GPIO_WritePin(GPIOC,GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9,GPIO_PIN_RESET);               
}
/******************************  列线设为输入模式  ******************************/
void KEY4X4_COL_READ_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;   
        __HAL_RCC_GPIOC_CLK_ENABLE();           //开启GPIOC时钟
                // PC6,PC7,PC8,PC9设为输入模式
        GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9;
        GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
        GPIO_InitStruct.Pull = GPIO_PULLUP;
        HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);       
}


QQ图片20191017011919.png
L4$PCQHX}9B26FMD@E.png

stm32f429矩阵键盘HAL库.rar

924.74 KB, 下载次数: 51

源码

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10568
金钱
10568
注册时间
2017-2-18
在线时间
1913 小时
发表于 2019-10-17 19:32:06 | 显示全部楼层
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-16 17:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表