矩阵键盘程序代码(基于STM32F103)

本次上传主要展示了STM32 4X4矩阵键盘代码。

#include "bsp_button.h"
void SysTick_Delay_ms(uint32_t ms)
{
    uint32_t i;
    SysTick_Config(72000);
    for(i=0;i     {
        while (!((SysTick->CTRL)&(1<<16)));
    }
    SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk;
}
void KEY_GPIO_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;
    RCC_APBxPeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC,ENABLE);
    //初始化行引脚
    GPIO_InitStruct.GPIO_Pin=GPIO_Pin_line_one|GPIO_Pin_line_two|GPIO_Pin_line_three|GPIO_Pin_line_four;
    GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
    GPIO_Init(GPIO_PORTC, &GPIO_InitStruct);
    //初始化列引脚
    GPIO_InitStruct.GPIO_Pin=GPIO_Pin_row_one|GPIO_Pin_row_two|GPIO_Pin_row_three|GPIO_Pin_row_four;
    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;
    GPIO_Init(GPIO_PORTA, &GPIO_InitStruct);
    
    GPIO_SetBits(GPIO_PORTA, GPIO_Pin_row_one|GPIO_Pin_row_two|GPIO_Pin_row_three|GPIO_Pin_row_four);                  //列引脚全为高电平
    GPIO_SetBits(GPIO_PORTC,GPIO_Pin_line_one|GPIO_Pin_line_two|GPIO_Pin_line_three|GPIO_Pin_line_four);               //行引脚全为高电平
}
int Key_Scan_Mode(void)
{
    GPIO_SetBits(GPIO_PORTA, GPIO_Pin_row_one|GPIO_Pin_row_two|GPIO_Pin_row_three|GPIO_Pin_row_four);                  //列引脚全为高电平
    GPIO_SetBits(GPIO_PORTC,GPIO_Pin_line_one|GPIO_Pin_line_two|GPIO_Pin_line_three|GPIO_Pin_line_four);               //行引脚全为高电平
    GPIO_ResetBits(GPIO_PORTC,GPIO_Pin_line_one);
    if(GPIO_Pin_row_one_read|GPIO_Pin_row_two_read|GPIO_Pin_row_three_read|GPIO_Pin_row_four_read==RESET)
    {
        SysTick_Delay_ms(10);
        if(GPIO_Pin_row_one_read==RESET)
        {
            return 13;
        }
        if(GPIO_Pin_row_two_read==RESET)
        {
            return 5;
        }
        if(GPIO_Pin_row_three_read==RESET)
        {
            return 9;
        }
        if(GPIO_Pin_row_four_read==RESET)
        {
            return 1;
        }
    }
    GPIO_SetBits(GPIO_PORTA, GPIO_Pin_row_one|GPIO_Pin_row_two|GPIO_Pin_row_three|GPIO_Pin_row_four);                 
    GPIO_SetBits(GPIO_PORTC,GPIO_Pin_line_one|GPIO_Pin_line_two|GPIO_Pin_line_three|GPIO_Pin_line_four);
    
    GPIO_ResetBits(GPIO_PORTC,GPIO_Pin_line_two);
    if(GPIO_Pin_row_one_read|GPIO_Pin_row_two_read|GPIO_Pin_row_three_read|GPIO_Pin_row_four_read==RESET)
    {
        SysTick_Delay_ms(10);
        if(GPIO_Pin_row_one_read==RESET)
        {
            return 15;
        }
        if(GPIO_Pin_row_two_read==RESET)
        {
            return 7;
        }
        if(GPIO_Pin_row_three_read==RESET)
        {
            return 11;
        }
        if(GPIO_Pin_row_four_read==RESET)
        {
            return 3;
        }
    }//3列
    GPIO_SetBits(GPIO_PORTA, GPIO_Pin_row_one|GPIO_Pin_row_two|GPIO_Pin_row_three|GPIO_Pin_row_four);                 
    GPIO_SetBits(GPIO_PORTC,GPIO_Pin_line_one|GPIO_Pin_line_two|GPIO_Pin_line_three|GPIO_Pin_line_four);
    
    GPIO_ResetBits(GPIO_PORTC,GPIO_Pin_line_three);
    if(GPIO_Pin_row_one_read|GPIO_Pin_row_two_read|GPIO_Pin_row_three_read|GPIO_Pin_row_four_read==RESET)
    {
        SysTick_Delay_ms(10);
        if(GPIO_Pin_row_one_read==RESET)
        {
            return 14;
        }
        if(GPIO_Pin_row_two_read==RESET)
        {
            return 6;
        }
        if(GPIO_Pin_row_three_read==RESET)
        {
            return 10;
        }
        if(GPIO_Pin_row_four_read==RESET)
        {
            return 12;
        }
    }
    GPIO_SetBits(GPIO_PORTA, GPIO_Pin_row_one|GPIO_Pin_row_two|GPIO_Pin_row_three|GPIO_Pin_row_four);                 
    GPIO_SetBits(GPIO_PORTC,GPIO_Pin_line_one|GPIO_Pin_line_two|GPIO_Pin_line_three|GPIO_Pin_line_four);
    
    GPIO_ResetBits(GPIO_PORTC,GPIO_Pin_line_four);
    if(GPIO_Pin_row_one_read|GPIO_Pin_row_two_read|GPIO_Pin_row_three_read|GPIO_Pin_row_four_read==RESET)
    {
        SysTick_Delay_ms(10);
        if(GPIO_Pin_row_one_read==RESET)
        {
            return 16;
        }
        if(GPIO_Pin_row_two_read==RESET)
        {
            return 8;
        }
        if(GPIO_Pin_row_three_read==RESET)
        {
            return 12;
        }
        if(GPIO_Pin_row_four_read==RESET)
        {
            return 4;
        }
    }
    return -1;
}

#ifndef _BSP_BUTTON_H
#define _BSP_BUTTON_H
#include "stm32f10x.h"

#define RCC_APBxPeriphClockCmd     RCC_APB2PeriphClockCmd

#define GPIO_PORTA                 GPIOA                   //列
#define GPIO_PORTC                 GPIOC                   //行

#define   GPIO_Pin_line_one          GPIO_Pin_3            //1行
#define   GPIO_Pin_line_two          GPIO_Pin_1            //2行
#define   GPIO_Pin_line_three        GPIO_Pin_2            //3行
#define   GPIO_Pin_line_four         GPIO_Pin_0            //4行

#define   GPIO_Pin_row_one           GPIO_Pin_4            //1列
#define   GPIO_Pin_row_two           GPIO_Pin_6            //2列
#define   GPIO_Pin_row_three         GPIO_Pin_5            //3列
#define   GPIO_Pin_row_four          GPIO_Pin_7            //4列

#define   GPIO_Pin_row_one_read      GPIO_ReadInputDataBit(GPIO_PORTA, GPIO_Pin_row_one)
#define   GPIO_Pin_row_two_read      GPIO_ReadInputDataBit(GPIO_PORTA, GPIO_Pin_row_two)
#define   GPIO_Pin_row_three_read    GPIO_ReadInputDataBit(GPIO_PORTA, GPIO_Pin_row_three)
#define   GPIO_Pin_row_four_read     GPIO_ReadInputDataBit(GPIO_PORTA, GPIO_Pin_row_four)


void SysTick_Delay_ms(uint32_t ms);
void KEY_GPIO_Config(void);
int Key_Scan_Mode(void);
void Key_Scan_Panduan(void);
#endif
#include "stm32f10x.h"
#include "bsp_usart.h"
#include "bsp_led.h"
#include "bsp_button.h"
void delay(uint32_t ms)
{
    uint32_t i;
    SysTick_Config(72000);
    for(i=0;i     {
        while (!((SysTick->CTRL)&(1<<16)));
    }
    SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk;
}
int main()
{
    LED_GPIO_Config();
    USART_Mode_Config();
    KEY_GPIO_Config();
    while(1)
    {
        int k;
        k=Key_Scan_Mode();;
        printf("%d\n",k);
        delay(500);
    }
}

你可能感兴趣的:(STM32,stm32)