矩阵按键控制代码
源码链接
使用4*4矩阵,主控芯片为STM32F103C8T6,串口发送配置在下面这篇文章里面
串口发送端配置博文
#include "key.h"
#include "delay.h"
void delayMs(u8 t)
{
while(t--)
{
delay_ms(20);
}
}
void KEY_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_Init(GPIOA,&GPIO_InitStructure);
}
u8 KEY_Scan(u8 mode)
{
static u8 key0_up=1;
static u8 key1_up=1;
static u8 key2_up=1;
static u8 key3_up=1;
static u8 key4_up=1;
static u8 key5_up=1;
static u8 key6_up=1;
static u8 key7_up=1;
static u8 key8_up=1;
static u8 key9_up=1;
static u8 keyA_up=1;
static u8 keyB_up=1;
static u8 keyC_up=1;
static u8 keyD_up=1;
static u8 keyX_up=1;
static u8 keyJ_up=1;
if(mode)
{
key0_up=1;
key1_up=1;
key2_up=1;
key3_up=1;
key4_up=1;
key5_up=1;
key6_up=1;
key7_up=1;
key8_up=1;
key9_up=1;
keyA_up=1;
keyB_up=1;
keyC_up=1;
keyD_up=1;
keyX_up=1;
keyJ_up=1;
}
Hang_00_L;
Hang_01_H;
Hang_02_H;
Hang_03_H;
if(key1_up&&Lie_00_V==0)
{
delayMs(jpys);
key1_up=0;
if(Lie_00_V==0)
{
return 1;
}
}else if(Lie_00_V==1)key1_up=1;
if(key2_up&&Lie_01_V==0)
{
delayMs(jpys);
key2_up=0;
if(Lie_01_V==0)
{
return 2;
}
}else if(Lie_01_V==1)key2_up=1;
if(key3_up&&Lie_02_V==0)
{
delayMs(jpys);
key3_up=0;
if(Lie_02_V==0)
{
return 3;
}
}else if(Lie_02_V==1)key3_up=1;
if(keyA_up&&Lie_03_V==0)
{
delayMs(jpys);
keyA_up=0;
if(Lie_03_V==0)
{
return 4;
}
}else if(Lie_03_V==1)keyA_up=1;
Hang_00_H;
Hang_01_L;
Hang_02_H;
Hang_03_H;
if(key4_up&&Lie_00_V==0)
{
delayMs(jpys);
key4_up=0;
if(Lie_00_V==0)
{
return 5;
}
}else if(Lie_00_V==1)key4_up=1;
if(key5_up&&Lie_01_V==0)
{
delayMs(jpys);
key5_up=0;
if(Lie_01_V==0)
{
return 6;
}
}else if(Lie_01_V==1)key5_up=1;
if(key6_up&&Lie_02_V==0)
{
delayMs(jpys);
key6_up=0;
if(Lie_02_V==0)
{
return 7;
}
}else if(Lie_02_V==1)key6_up=1;
if(keyB_up&&Lie_03_V==0)
{
delayMs(jpys);
keyB_up=0;
if(Lie_03_V==0)
{
return 8;
}
}else if(Lie_03_V==1)keyB_up=1;
Hang_00_H;
Hang_01_H;
Hang_02_L;
Hang_03_H;
if(key7_up&&Lie_00_V==0)
{
delayMs(jpys);
key7_up=0;
if(Lie_00_V==0)
{
return 9;
}
}else if(Lie_00_V==1)key7_up=1;
if(key8_up&&Lie_01_V==0)
{
delayMs(jpys);
key8_up=0;
if(Lie_01_V==0)
{
return 10;
}
}else if(Lie_01_V==1)key8_up=1;
if(key9_up&&Lie_02_V==0)
{
delayMs(jpys);
key9_up=0;
if(Lie_02_V==0)
{
return 11;
}
}else if(Lie_02_V==1)key9_up=1;
if(keyC_up&&Lie_03_V==0)
{
delayMs(jpys);
keyC_up=0;
if(Lie_03_V==0)
{
return 12;
}
}else if(Lie_03_V==1)keyC_up=1;
Hang_00_H;
Hang_01_H;
Hang_02_H;
Hang_03_L;
if(keyX_up&&Lie_00_V==0)
{
delayMs(jpys);
keyX_up=0;
if(Lie_00_V==0)
{
return 13;
}
}else if(Lie_00_V==1)keyX_up=1;
if(key0_up&&Lie_01_V==0)
{
delayMs(10);
key0_up=0;
if(Lie_01_V==0)
{
return 14;
}
}else if(Lie_01_V==1)key0_up=1;
if(keyJ_up&&Lie_02_V==0)
{
delayMs(jpys);
keyJ_up=0;
if(Lie_02_V==0)
{
return 15;
}
}else if(Lie_02_V==1)keyJ_up=1;
if(keyD_up&&Lie_03_V==0)
{
delayMs(jpys);
keyD_up=0;
if(Lie_03_V==0)
{
return 16;
}
}else if(Lie_03_V==1)keyD_up=1;
return 0;
}
key的头文件
#ifndef __KEY_H
#define __KEY_H
#include "stm32f10x.h"
#define Hang_00_L GPIO_ResetBits(GPIOA, GPIO_Pin_8)
#define Hang_00_H GPIO_SetBits(GPIOA, GPIO_Pin_8)
#define Hang_01_L GPIO_ResetBits(GPIOA, GPIO_Pin_6)
#define Hang_01_H GPIO_SetBits(GPIOA, GPIO_Pin_6)
#define Hang_02_L GPIO_ResetBits(GPIOA, GPIO_Pin_5)
#define Hang_02_H GPIO_SetBits(GPIOA, GPIO_Pin_5)
#define Hang_03_L GPIO_ResetBits(GPIOA, GPIO_Pin_4)
#define Hang_03_H GPIO_SetBits(GPIOA, GPIO_Pin_4)
#define Lie_00_V GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)
#define Lie_01_V GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)
#define Lie_02_V GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_2)
#define Lie_03_V GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3)
#define jpys 1
void KEY_init(void);
u8 KEY_Scan(u8 mode);
#endif
这里我们采用的是定时中断的办法,来采样按键是否被按下,来进行串口数值发送
timer定时器代码配置
void TIM2_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_TimeBaseStructure.TIM_Period = arr;
TIM_TimeBaseStructure.TIM_Prescaler =psc;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_Cmd(TIM2, ENABLE);
}
打开定时器中断
int TIM2_IRQHandler(void)
{
u8 temp;
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update );
if(delay_flag==1)
{
if(++delay_50==5)
delay_50=0,delay_flag=0;
}
KEY = KEY_Scan(1);
Control(KEY);
return 0;
}
配置控制处理代码Control
void Control(u8 key)
{
if(key==0x06)
{
printf("s");
}
if(key==0x04)
{
printf("f");
}
if(key==0x08)
{
printf("g");
}
if(key==0x02)
{
printf("a");
}
if(key==0x0A)
{
printf("o");
}
if(key==0x05)
{
printf("d");
}
if(key==0x07)
{
printf("i");
}
if(key==0x0C)
{
printf("i");
i1=5;
}
if(key==0x01)
{
printf("q");
}
if(key==0x03)
{
printf("w");
}
if(key==0x09)
{
printf("e");
}
if(key==0x0B)
{
printf("r");
}
if(key==0x0D)
{
printf("u");
}
if(key==0x0E)
{
printf("c");
}
if(key==0x0F)
{
printf("t");
}
if(key==0x10)
{
printf("y");
}
}