key.c
#include "key.h"
#include "delay.h"
void key_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//关闭jtag,使能SWD,可以用SWD模式调试
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//行:推挽输出
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3|GPIO_Pin_2|GPIO_Pin_0|GPIO_Pin_13;//行连接的引脚
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//列:上拉输入,检测高低电频来判断按键是否按下,有按键按下为0,没有按键按下为1
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9|GPIO_Pin_8|GPIO_Pin_7|GPIO_Pin_6;//列连接的引脚
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
}
//通过一行行扫描,检测到0即为按下,返回按钮,方法比较简单,感觉比寄存器好理解
u8 KEY_Scan(u8 mode)
{
static u8 key_up=1;//按键按松开标志
if(mode)key_up=1; //支持连按 mode:0,不支持连续按;1,支持连续按;
//检测第一行
key_row1_low;key_row2_high;key_row3_high;key_row4_high;
if(key_up&&(S1==0||S2==0||S3==0||S4==0))
{
delay_ms(10);//去抖动
key_up=0;
if(S1==0)return S1_PRES;
else if(S2==0)return S2_PRES;
else if(S3==0)return S3_PRES;
else if(S4==0)return S4_PRES;
}else if(S1==1&&S2==1&&S3==1&&S4==1)key_up=1;
//检测第二行
key_row1_high;key_row2_low;key_row3_high;key_row4_high;
if(key_up&&(S5==0||S6==0||S7==0||S8==0))
{
delay_ms(10);//去抖动
key_up=0;
if(S5==0)return S5_PRES;
else if(S6==0)return S6_PRES;
else if(S7==0)return S7_PRES;
else if(S8==0)return S8_PRES;
}else if(S5==1&&S6==1&&S7==1&&S8==1)key_up=1;
//检测第三行
key_row1_high;key_row2_high;key_row3_low;key_row4_high;
if(key_up&&(S9==0||S10==0||S11==0||S12==0))
{
delay_ms(10);//去抖动
key_up=0;
if(S9==0)return S9_PRES;
else if(S10==0)return S10_PRES;
else if(S11==0)return S11_PRES;
else if(S12==0)return S12_PRES;
}else if(S9==1&&S10==1&&S11==1&&S12==1)key_up=1;
//检测第四行
key_row1_high;key_row2_high;key_row3_high;key_row4_low;
if(key_up&&(S13==0||S14==0||S15==0||S16==0))
{
delay_ms(10);//去抖动
key_up=0;
if(S13==0)return S13_PRES;
else if(S14==0)return S14_PRES;
else if(S15==0)return S15_PRES;
else if(S16==0)return S16_PRES;
}else if(S13==1&&S14==1&&S15==1&&S16==1)key_up=1;
return 0;// 无按键按下
}
key.h
#ifndef __KEY_H
#define __KEY_H
#include "sys.h"
#include"stm32f10x.h"
#define S1 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_9)//读取按键S1,PC9
#define S2 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_8)//读取按键S2,PC8
#define S3 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_7)//读取按键S3,PC7
#define S4 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_6)//读取按键S4,PC6
#define S5 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_9)//读取按键S5,PC9
#define S6 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_8)//读取按键S6,PC8
#define S7 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_7)//读取按键S7,PC7
#define S8 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_6)//读取按键S8,PC6
#define S9 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_9)//读取按键S9,PC9
#define S10 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_8)//读取按键S10,PC8
#define S11 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_7)//读取按键S11,PC7
#define S12 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_6)//读取按键S12,PC6
#define S13 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_9)//读取按键S13,PC9
#define S14 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_8)//读取按键S14,PC8
#define S15 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_7)//读取按键S15,PC7
#define S16 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_6)//读取按键S16,PC6
#define S1_PRES 1
#define S2_PRES 2
#define S3_PRES 3
#define S4_PRES 4
#define S5_PRES 5
#define S6_PRES 6
#define S7_PRES 7
#define S8_PRES 8
#define S9_PRES 9
#define S10_PRES 10
#define S11_PRES 11
#define S12_PRES 12
#define S13_PRES 13
#define S14_PRES 14
#define S15_PRES 15
#define S16_PRES 16
#define key_row1_low GPIO_WriteBit(GPIOC,GPIO_Pin_3,Bit_RESET) //第一行
#define key_row1_high GPIO_WriteBit(GPIOC,GPIO_Pin_3,Bit_SET)
#define key_row2_low GPIO_WriteBit(GPIOC,GPIO_Pin_2,Bit_RESET) //第二行
#define key_row2_high GPIO_WriteBit(GPIOC,GPIO_Pin_2,Bit_SET)
#define key_row3_low GPIO_WriteBit(GPIOC,GPIO_Pin_0,Bit_RESET) //第三行
#define key_row3_high GPIO_WriteBit(GPIOC,GPIO_Pin_0,Bit_SET)
#define key_row4_low GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_RESET) //第四行
#define key_row4_high GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_SET)
void key_Init(void);
u8 KEY_Scan(u8 mode);
#endif