高中生
最后登录1970-1-1
在线时间 小时
注册时间2017-4-10
|
本帖最后由 无极剑圣 于 2017-5-24 21:02 编辑
矩阵键盘要求8个接口,可是开发板上没有连续的八个接口,所以可以这样编写程序
- #ifndef __KEY_H
- #define __KEY_H
- #include "stm32f4xx.h"
- //引脚定义
- /*******************************************************/
- #define KEY1_PIN GPIO_Pin_0
- #define KEY1_GPIO_PORT GPIOA
- #define KEY1_GPIO_CLK RCC_AHB1Periph_GPIOA
- #define KEY2_PIN GPIO_Pin_13
- #define KEY2_GPIO_PORT GPIOC
- #define KEY2_GPIO_CLK RCC_AHB1Periph_GPIOC
- #define C1_PIN GPIO_Pin_3
- #define C1_GPIO_PORT GPIOA
- #define C1_GPIO_CLK RCC_AHB1Periph_GPIOA
- #define C2_PIN GPIO_Pin_4
- #define C2_GPIO_PORT GPIOA
- #define C2_GPIO_CLK RCC_AHB1Periph_GPIOA
- #define C3_PIN GPIO_Pin_3
- #define C3_GPIO_PORT GPIOD
- #define C3_GPIO_CLK RCC_AHB1Periph_GPIOD
- #define C4_PIN GPIO_Pin_5
- #define C4_GPIO_PORT GPIOA
- #define C4_GPIO_CLK RCC_AHB1Periph_GPIOA
- #define R1_PIN GPIO_Pin_4
- #define R1_GPIO_PORT GPIOH
- #define R1_GPIO_CLK RCC_AHB1Periph_GPIOH
- #define R2_PIN GPIO_Pin_5
- #define R2_GPIO_PORT GPIOH
- #define R2_GPIO_CLK RCC_AHB1Periph_GPIOH
- #define R3_PIN GPIO_Pin_5
- #define R3_GPIO_PORT GPIOD
- #define R3_GPIO_CLK RCC_AHB1Periph_GPIOD
- #define R4_PIN GPIO_Pin_6
- #define R4_GPIO_PORT GPIOD
- #define R4_GPIO_CLK RCC_AHB1Periph_GPIOD
- /*******************************************************/
- void Key_GPIO_Config(void);
- int Read_KeyValue(void);
- int Key_ReadInputData(void);
- #endif /* __LED_H */
复制代码
-
- #include "./key/bsp_key.h"
- /// 延时
- void Delay_ms(int xms)
- {
- u32 i,j;
- for(i=xms;i>0;i--)
- for(j=72000;j>0;j--);
- }
- /**
- * @brief 配置按键用到的I/O口
- * @param 无
- * @retval 无
- */
- void Key_GPIO_Config(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
-
- /*开启按键GPIO口的时钟*/
- RCC_AHB1PeriphClockCmd(KEY1_GPIO_CLK|KEY2_GPIO_CLK|C1_GPIO_CLK|C2_GPIO_CLK|C3_GPIO_CLK|C4_GPIO_CLK|R1_GPIO_CLK|R2_GPIO_CLK|R3_GPIO_CLK|R4_GPIO_CLK,ENABLE);
-
- /*选择按键的引脚*/
- GPIO_InitStructure.GPIO_Pin = KEY1_PIN;
-
- /*设置引脚为输入模式*/
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
-
- /*设置引脚下拉*/
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
-
- /*使用上面的结构体初始化按键*/
- GPIO_Init(KEY1_GPIO_PORT, &GPIO_InitStructure);
-
- /*选择按键的引脚*/
- GPIO_InitStructure.GPIO_Pin = KEY2_PIN;
-
- /*使用上面的结构体初始化按键*/
- GPIO_Init(KEY2_GPIO_PORT, &GPIO_InitStructure);
-
- /*选择要控制的GPIO引脚*/
- GPIO_InitStructure.GPIO_Pin = C1_PIN;
- /*调用库函数,使用上面配置的GPIO_InitStructure初始化GPIO*/
- GPIO_Init(C1_GPIO_PORT, &GPIO_InitStructure);
- /*选择按键的引脚*/
- GPIO_InitStructure.GPIO_Pin = C2_PIN;
-
- /*使用上面的结构体初始化按键*/
- GPIO_Init(C2_GPIO_PORT, &GPIO_InitStructure);
-
-
- /*选择按键的引脚*/
- GPIO_InitStructure.GPIO_Pin = C3_PIN;
-
- /*使用上面的结构体初始化按键*/
- GPIO_Init(C3_GPIO_PORT, &GPIO_InitStructure);
-
- /*选择按键的引脚*/
- GPIO_InitStructure.GPIO_Pin = C4_PIN;
-
- /*使用上面的结构体初始化按键*/
- GPIO_Init(C4_GPIO_PORT, &GPIO_InitStructure);
-
- /*设置引脚模式为输出模式*/
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
-
- /*设置引脚的输出类型为推挽输出*/
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
-
- /*设置引脚为下拉模式*/
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
- /*设置引脚速率为2MHz */
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
-
- /*选择按键的引脚*/
- GPIO_InitStructure.GPIO_Pin = R1_PIN;
-
- /*使用上面的结构体初始化按键*/
- GPIO_Init(R1_GPIO_PORT, &GPIO_InitStructure);
-
- /*选择按键的引脚*/
- GPIO_InitStructure.GPIO_Pin = R2_PIN;
-
- /*使用上面的结构体初始化按键*/
- GPIO_Init(R2_GPIO_PORT, &GPIO_InitStructure);
-
- /*选择按键的引脚*/
- GPIO_InitStructure.GPIO_Pin = R3_PIN;
-
- /*使用上面的结构体初始化按键*/
- GPIO_Init(R3_GPIO_PORT, &GPIO_InitStructure);
-
- /*选择按键的引脚*/
- GPIO_InitStructure.GPIO_Pin = R4_PIN;
-
- /*使用上面的结构体初始化按键*/
- GPIO_Init(R4_GPIO_PORT, &GPIO_InitStructure);
-
- GPIO_WriteBit(R1_GPIO_PORT,R1_PIN, Bit_SET);
-
- GPIO_WriteBit(R2_GPIO_PORT,R2_PIN, Bit_SET);
- GPIO_WriteBit(R3_GPIO_PORT,R3_PIN, Bit_SET);
- GPIO_WriteBit(R4_GPIO_PORT,R4_PIN, Bit_SET);
- GPIO_WriteBit(C1_GPIO_PORT,C1_PIN, Bit_RESET);
- GPIO_WriteBit(C2_GPIO_PORT,C2_PIN, Bit_RESET);
- GPIO_WriteBit(C3_GPIO_PORT,C3_PIN, Bit_RESET);
- GPIO_WriteBit(C4_GPIO_PORT,C4_PIN, Bit_RESET);
-
- }
- /************************************/
- int Read_KeyValue(void)
- {
- int KeyValue=-1;
- if((Key_ReadInputData()&0xFF)!=0x0F)
- {
- Delay_ms(8);
- if((Key_ReadInputData()&0xFF)!=0x0F)
- {
-
- GPIO_SetBits(R1_GPIO_PORT, R1_PIN);
- GPIO_ResetBits(R2_GPIO_PORT, R2_PIN);
- GPIO_ResetBits(R3_GPIO_PORT, R3_PIN);
- GPIO_ResetBits(R4_GPIO_PORT, R4_PIN);
-
- switch(Key_ReadInputData()&0xFF)
- {
- case 0x11: KeyValue = 1; break; // 0001 0001
- case 0x21: KeyValue = 2; break; // 0010 0001
- case 0x41: KeyValue = 3; break; // 0100 0001
- case 0x81: KeyValue = 14; break; // 1000 0001
- }
- GPIO_SetBits(R2_GPIO_PORT, R2_PIN);
- GPIO_ResetBits(R1_GPIO_PORT, R1_PIN);
- GPIO_ResetBits(R3_GPIO_PORT, R3_PIN);
- GPIO_ResetBits(R4_GPIO_PORT, R4_PIN);
- switch(Key_ReadInputData()&0xFF)
- {
- case 0x12: KeyValue = 4; break; // 0001 0010
- case 0x22: KeyValue = 5; break; // 0010 0010
- case 0x42: KeyValue = 6; break; // 0100 0010
- case 0x82: KeyValue = 24; break; // 1000 0010
- }
-
- GPIO_SetBits(R3_GPIO_PORT, R3_PIN);
- GPIO_ResetBits(R2_GPIO_PORT, R2_PIN);
- GPIO_ResetBits(R1_GPIO_PORT, R1_PIN);
- GPIO_ResetBits(R4_GPIO_PORT, R4_PIN);
- switch(Key_ReadInputData()&0xFF)
- {
- case 0x14: KeyValue = 7; break; // 0001 0100
- case 0x24: KeyValue = 8; break; // 0010 0100
- case 0x44: KeyValue = 9; break; // 0100 0100
- case 0x84: KeyValue = 34; break; // 1000 0100
- }
-
- GPIO_SetBits(R4_GPIO_PORT, R4_PIN);
- GPIO_ResetBits(R2_GPIO_PORT, R2_PIN);
- GPIO_ResetBits(R3_GPIO_PORT, R3_PIN);
- GPIO_ResetBits(R1_GPIO_PORT, R1_PIN);
- switch(Key_ReadInputData()&0xFF)
- {
- case 0x18: KeyValue = 41; break; // 0001 1000
- case 0x28: KeyValue = 0; break; // 0010 1000
- case 0x48: KeyValue = 43; break; // 0100 1000
- case 0x88: KeyValue = 44; break; // 1000 1000
- }
-
- GPIO_SetBits(R1_GPIO_PORT, R1_PIN);
- GPIO_SetBits(R2_GPIO_PORT, R2_PIN);
- GPIO_SetBits(R3_GPIO_PORT, R3_PIN);
- GPIO_SetBits(R4_GPIO_PORT, R4_PIN);
- GPIO_ResetBits(C1_GPIO_PORT, C1_PIN);
- GPIO_ResetBits(C2_GPIO_PORT, C2_PIN);
- GPIO_ResetBits(C3_GPIO_PORT, C3_PIN);
- GPIO_ResetBits(C4_GPIO_PORT, C4_PIN);
-
-
- while((Key_ReadInputData()&0xFF)!=0x0F);
-
- return KeyValue;
- }
- }
- return -1;
- }
- int Key_ReadInputData()
- {
- int KeyValue_1=-1;
- volatile int R1,R2,R3,R4,C1,C2,C3,C4;
- C4=(int)GPIO_ReadInputDataBit(C4_GPIO_PORT, C4_PIN)<<7;
- C3=(int)GPIO_ReadInputDataBit(C3_GPIO_PORT, C3_PIN)<<6;
- C2=(int)GPIO_ReadInputDataBit(C2_GPIO_PORT, C2_PIN)<<5;
- C1=(int)GPIO_ReadInputDataBit(C1_GPIO_PORT, C1_PIN)<<4;
- R4=(int)GPIO_ReadInputDataBit(R4_GPIO_PORT, R4_PIN)<<3;
- R3=(int)GPIO_ReadInputDataBit(R3_GPIO_PORT, R3_PIN)<<2;
- R2=(int)GPIO_ReadInputDataBit(R2_GPIO_PORT, R2_PIN)<<1;
- R1=(int)GPIO_ReadInputDataBit(R1_GPIO_PORT, R1_PIN)<<0;
-
- KeyValue_1=C4|C3|C2|C1|R4|R3|R2|R1;
-
- return KeyValue_1;
- }
- /*********************************************END OF FILE**********************/
复制代码
|
|