#include\//反转法测矩阵按键
void Delay(__IO uint32_t t); void RCC_Config(void); void GPIO_Config(void); uint32_t Key_Scan(void); void GPIO_RConfig(void); void LED_Config(void);
void Delay_ms(__IO uint32_t time); void Time_Delay(void);
void GPIO_SetBits_Row(void); void GPIO_ResetBits_Row(void); void GPIO_SetBits_Col(void); void GPIO_ResetBits_Col(void);
GPIO_InitTypeDef GPIO_InitStructure; static __IO uint32_t TimingDelay=0;
uint32_t num=0; uint8_t j,i; //PA6 PA7 PB7 PA5 uint8_t key[4][4]={0x01,0x05,0x09,0x0d, //PE15 0x02,0x06,0x0a,0x0e, //PE14 0x03,0x07,0x0b,0x0f, //PE13 0x04,0x08,0x0c,0x10 }; //PE11
struct IO_Port{
GPIO_TypeDef *GPIO_X; unsigned short GPIO_Pin; };
static struct IO_Port key_row[4]={
{GPIOE,GPIO_Pin_15},{GPIOE,GPIO_Pin_14}, {GPIOE,GPIO_Pin_13},{GPIOE,GPIO_Pin_11} };
static struct IO_Port key_col[4]={
{GPIOA,GPIO_Pin_6},{GPIOA,GPIO_Pin_7},
1
{GPIOB,GPIO_Pin_7},{GPIOA,GPIO_Pin_5} };
int main(void) {
uint32_t key=0; RCC_Config(); LED_Config();
SysTick_Config(72000);
while(1) { key=Key_Scan(); switch(key) { case 0x01:
GPIO_WriteBit(GPIOB,GPIO_Pin_5,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5))); break; case 0x02:
GPIO_WriteBit(GPIOB,GPIO_Pin_5,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5))); break; case 0x03:
GPIO_WriteBit(GPIOB,GPIO_Pin_5,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5))); break; case 0x04:
GPIO_WriteBit(GPIOB,GPIO_Pin_5,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5))); break; case 0x05:
GPIO_WriteBit(GPIOB,GPIO_Pin_5,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5))); break;
2
case 0x06:
GPIO_WriteBit(GPIOB,GPIO_Pin_5,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5))); break; case 0x07:
GPIO_WriteBit(GPIOB,GPIO_Pin_5,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5))); break; case 0x08:
GPIO_WriteBit(GPIOB,GPIO_Pin_5,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5))); break; case 0x09:
GPIO_WriteBit(GPIOB,GPIO_Pin_5,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5))); break; case 0x0a:
GPIO_WriteBit(GPIOB,GPIO_Pin_5,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5))); break; case 0x0b:
GPIO_WriteBit(GPIOB,GPIO_Pin_5,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5))); break; case 0x0c:
GPIO_WriteBit(GPIOB,GPIO_Pin_5,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5))); break; case 0x0d:
GPIO_WriteBit(GPIOB,GPIO_Pin_5,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5))); break; case 0x0e:
GPIO_WriteBit(GPIOB,GPIO_Pin_5,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5)));
3
break; case 0x0f:
GPIO_WriteBit(GPIOB,GPIO_Pin_5,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5))); break; case 0x10:
GPIO_WriteBit(GPIOB,GPIO_Pin_5,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5))); break; default: break; }
} }
void GPIO_SetBits_Row(void) {
uint8_t i;
for(i=0;i<4;i++) { GPIO_SetBits(key_row[i].GPIO_X,key_row[i].GPIO_Pin); } }
void GPIO_ResetBits_Row(void) {
uint8_t i;
for(i=0;i<4;i++) { GPIO_ResetBits(key_row[i].GPIO_X,key_row[i].GPIO_Pin); } }
void GPIO_SetBits_Col(void) {
uint8_t i;
4
for(i=0;i<4;i++) { GPIO_SetBits(key_col[i].GPIO_X,key_col[i].GPIO_Pin); } }
void GPIO_ResetBits_Col(void) {
uint8_t i; for(i=0;i<4;i++) { GPIO_ResetBits(key_col[i].GPIO_X,key_col[i].GPIO_Pin); } }
//反转法按键 先让行输出低电平 列输出高电平 然后读列的状态 如果为低电平
//反转按键 即列输出低电平 行输出高电平 依次检测行的输出 如果为低电平 则相应按键按下
uint32_t Key_Scan(void) {
num=0; GPIO_Config(); GPIO_ResetBits_Row(); GPIO_SetBits_Col(); for(i=0;i<4;i++) { if(GPIO_ReadInputDataBit(key_col[i].GPIO_X,key_col[i].GPIO_Pin)==0) { Delay(90000); if(GPIO_ReadInputDataBit(key_col[i].GPIO_X,key_col[i].GPIO_Pin)==0); GPIO_RConfig(); GPIO_ResetBits_Col(); GPIO_SetBits_Row(); for(j=0;j<4;j++) { if(GPIO_ReadInputDataBit(key_row[j].GPIO_X,key_row[j].GPIO_Pin)==0) {
while(GPIO_ReadInputDataBit(key_row[j].GPIO_X,key_row[j].GPIO_Pin)==0);
5