打印

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

[复制链接]
618|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
冰糖炖雪梨|  楼主 | 2018-7-7 07:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
感谢论坛网友(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...
");
    while(1)
    {        
        key = KeyScan_4X4();
        switch(key)
          {
            case 1:  printf("S1
" );  break;                                                                                
            case 2:  printf("S5
" );  break;                                                                                 
            case 3:  printf("S9
" );  break;                                                                              
            case 4:  printf("S13
");  break;                                                                              
            case 5:  printf("S2
" );  break;                                                
            case 6:  printf("S6
" );  break;                                                                                
            case 7:  printf("S10
");  break;                                                                                
            case 8:  printf("S14
");  break;                                                                        
            case 9:  printf("S3
" );  break;                                                                                       
            case 10: printf("S7
" );  break;                                                                                                      
            case 11: printf("S11
");  break;                                                                                                      
            case 12: printf("S15
");  break;                                                                              
            case 13: printf("S4
" );  break;                                                                                                      
            case 14: printf("S8
" );  break;                                                                                                        
            case 15: printf("S12
");  break;                                                                              
            case 16: printf("S16
");  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);        
}

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

430

主题

436

帖子

0

粉丝