本次上传主要展示了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);
}
}