| 
 
| 感谢论坛网友(ID:Apu7578)在原有基础上修改的 
 /************************main.c**************************************************************/
 #include "sys.h"
 #include "delay.h"
 #include "usart.h"
 #include "led.h"
 #include "key.h"
 extern u8 keyValue_4X4;
 /************************************************
 ALIENTEK 阿波罗STM32F429开发板4*4矩阵按键
 矩阵按键实验-HAL库函数版
 作者:Bingo
 ************************************************/
 int main(void)
 {
 u8 key;
 HAL_Init();                     //初始化HAL库
 Stm32_Clock_Init(360,25,2,8);   //设置时钟,180Mhz
 delay_init(180);                //初始化延时函数
 uart_init(115200);              //初始化USART
 LED_Init();
 KEY4X4_ON();                 //打开矩阵
 delay_ms(1000);
 printf("ScanInit...
 ");
 while(1)
 {
 key = KeyScan_4X4();
 switch(key)
 {
 case 1:  printf("S1
 " );  break;
 case 2:  printf("S5
 " );  break;
 case 3:  printf("S9
 " );  break;
 case 4:  printf("S13
 ");  break;
 case 5:  printf("S2
 " );  break;
 case 6:  printf("S6
 " );  break;
 case 7:  printf("S10
 ");  break;
 case 8:  printf("S14
 ");  break;
 case 9:  printf("S3
 " );  break;
 case 10: printf("S7
 " );  break;
 case 11: printf("S11
 ");  break;
 case 12: printf("S15
 ");  break;
 case 13: printf("S4
 " );  break;
 case 14: printf("S8
 " );  break;
 case 15: printf("S12
 ");  break;
 case 16: printf("S16
 ");  break;
 }
 delay_ms(10);
 }
 }
 
 /****************************************************key.h*********************************************************/
 
 #include "sys.h"
 
 /******** 行线状态宏定义 ************/
 #define                RAW1_STATE                PBin(6)
 #define                RAW2_STATE                PBin(7)
 #define                RAW3_STATE                PBin(8)
 #define                RAW4_STATE                PBin(9)
 /******** 列线状态宏定义 ************/
 #define                COL1_STATE                PCin(6)
 #define                COL2_STATE          PCin(7)
 #define                COL3_STATE                PCin(8)
 #define                COL4_STATE                PCin(9)
 /********************* 键值分布*************************
 S1           S2           S3                S4
 S5                  S6           S7            S8
 S9                  S10      S11                S12
 S13          S14           S15            S16
 *******************************************************
 ********************矩阵按键连线***********************
 PC6      PC7      PC8      PC9
 PB6-------|--------|--------|--------|----
 PB7 ------|--------|--------|--------|----
 PB8-------|--------|--------|--------|----
 PB9 ------|--------|--------|--------|----
 *******************************************************/
 /* -- 开关状态宏定义 -- */
 #define         KEY4X4_OPEN                        1
 #define         KEY4X4_CLOSE                0
 /* -----------------所有相关函数 --------------------- */
 void KEY4X4_ON(void);   // 开启矩阵键盘
 void KEY4X4_OFF(void);        // 关闭矩阵键盘
 void KEY4X4_RAW_SET(void);                                  // 行线置位
 void KEY4X4_RAW_RESET(void);                                 // 行线复位
 void KEY4X4_RAW_READ_Init(void);                  // 行线设为输入模式
 void KEY4X4_COL_SET(void);                                        // 列线置位
 void KEY4X4_COL_RESET(void);                                // 列线复位
 void KEY4X4_COL_READ_Init(void);                    // 列线设为输入模式
 u8 KeyScan_4X4(void);         // 键盘扫描函数
 
 
 
 
 /***************************key.c***************************************************************************/
 #include "key.h"
 #include "delay.h"
 u8 KeyScan_4X4(void)
 {
 u8 keyValue=0;
 static u8 key_up=1;//按键松开标志
 KEY4X4_RAW_SET();                                                      // 行线置位 1
 KEY4X4_COL_RESET();                                                    // 列线复位 0
 KEY4X4_RAW_READ_Init();                                                // 行线设为输入模式
 if(key_up&&(RAW1_STATE==0||RAW2_STATE==0||RAW3_STATE==0||RAW4_STATE==0))
 {
 delay_ms(10);
 key_up=0;                                        //屏蔽此行则表示支持 连续按
 if           (RAW1_STATE==0)        keyValue=0;                                           // raw1
 else if(RAW2_STATE==0)        keyValue=1;                                               // raw2
 else if(RAW3_STATE==0)        keyValue=2;                                               // raw3
 else if(RAW4_STATE==0)        keyValue=3;                                               // raw4
 else return 0;
 
 KEY4X4_RAW_RESET();                                                // 行线复位 0
 KEY4X4_COL_SET();                                                  // 列线置位 1
 KEY4X4_COL_READ_Init();                                            // 列线设为输入模式
 if(COL1_STATE==0||COL2_STATE==0||COL3_STATE==0||COL4_STATE==0)
 {
 //delay_ms(5);
 if           (COL1_STATE==0)        {keyValue+=1;       return keyValue;}   // col1
 else if(COL2_STATE==0)        {keyValue+=5;       return keyValue;}   // col2
 else if(COL3_STATE==0)        {keyValue+=9;       return keyValue;}   // col3
 else if(COL4_STATE==0)        {keyValue+=13;      return keyValue;}        // col4
 else return 0;
 }
 return 0;
 }
 else if(RAW1_STATE==1&&RAW2_STATE==1&&RAW3_STATE==1&&RAW4_STATE==1) key_up=1;
 return 0;        //无按键按下
 }
 // 打开矩阵键盘
 u8 KEY4X4_ON_OFF=KEY4X4_CLOSE; // 默认关闭
 void KEY4X4_ON(void)
 {
 KEY4X4_ON_OFF=KEY4X4_OPEN;
 }
 // 关闭矩阵键盘
 void KEY4X4_OFF(void)
 {
 KEY4X4_ON_OFF=KEY4X4_CLOSE;
 }
 /******************************  行线置位 1 *************************************/
 void KEY4X4_RAW_SET(void)
 {
 GPIO_InitTypeDef GPIO_InitStruct;
 __HAL_RCC_GPIOB_CLK_ENABLE();           //开启GPIOB时钟
 // PB6,PB7,PB8,PB9设为输出模式
 GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9;
 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
 GPIO_InitStruct.Pull = GPIO_PULLUP;
 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
 HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
 // 4根行线置1
 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9,GPIO_PIN_SET);
 }
 /******************************  行线复位 0 *************************************/
 void KEY4X4_RAW_RESET(void)
 {
 GPIO_InitTypeDef GPIO_InitStruct;
 __HAL_RCC_GPIOB_CLK_ENABLE();           //开启GPIOB时钟
 // PB6,PB7,PB8,PB9设为输出模式
 GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9;
 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
 GPIO_InitStruct.Pull = GPIO_PULLUP;
 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
 HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
 // 4根行线置0
 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9,GPIO_PIN_RESET);
 }
 /******************************  行线设为输入模式  ******************************/
 void KEY4X4_RAW_READ_Init(void)
 {
 GPIO_InitTypeDef GPIO_InitStruct;
 __HAL_RCC_GPIOB_CLK_ENABLE();           //开启GPIOB时钟
 // PB6,PB7,PB8,PB9设为输入模式
 GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9;
 GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
 GPIO_InitStruct.Pull = GPIO_PULLUP;
 HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
 }
 /******************************  列线置位  **************************************/
 void KEY4X4_COL_SET(void)
 {
 GPIO_InitTypeDef GPIO_InitStruct;
 __HAL_RCC_GPIOC_CLK_ENABLE();           //开启GPIOC时钟
 // PC6,PC7,PC8,PC9设为输出模式
 GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9;
 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
 GPIO_InitStruct.Pull = GPIO_PULLUP;
 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
 HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
 // 4根列线置1
 HAL_GPIO_WritePin(GPIOC,GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9,GPIO_PIN_SET);
 }
 /******************************  列线复位  **************************************/
 void KEY4X4_COL_RESET(void)
 {
 GPIO_InitTypeDef GPIO_InitStruct;
 __HAL_RCC_GPIOC_CLK_ENABLE();           //开启GPIOC时钟
 // PC6,PC7,PC8,PC9设为输出模式
 GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9;
 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
 GPIO_InitStruct.Pull = GPIO_PULLUP;
 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
 HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
 // 4根列线置0
 HAL_GPIO_WritePin(GPIOC,GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9,GPIO_PIN_RESET);
 }
 /******************************  列线设为输入模式  ******************************/
 void KEY4X4_COL_READ_Init(void)
 {
 GPIO_InitTypeDef GPIO_InitStruct;
 __HAL_RCC_GPIOC_CLK_ENABLE();           //开启GPIOC时钟
 // PC6,PC7,PC8,PC9设为输入模式
 GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9;
 GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
 GPIO_InitStruct.Pull = GPIO_PULLUP;
 HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
 }
 | 
 |