独立按键测试程序

1:Key_GPIOConfig()函数分析

  1. void Key_GPIOConfig(void)
  2. {
  3.     GPIO_InitTypeDef GPIO_InitStructure;
  4.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
  5.     /* EXTI line gpio config(PC13 PC2) */    
  6.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;       
  7.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;     // 上拉输入
  8.     GPIO_Init(GPIOA, &GPIO_InitStructure);
  9. }

配置PA-0.1.2.3四个独立按键引脚以及模式。
2: Read_Key_Port()读按键操作

  1. uint8_t Read_Key_Port(void)
  2. {        
  3.         if(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0))
  4.         {
  5.                 return KEY_1;
  6.         }
  7.         else if(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1))
  8.         {
  9.                 return KEY_2;
  10.         }
  11.         else if(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2))
  12.         {
  13.                 return KEY_3;
  14.         }
  15.         else if(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3))
  16.         {
  17.                 return KEY_4;
  18.         }
  19.         return 0;
  20. }

采用直接读按键方式·根据返回值确定·那个按键被选中。
3:扫描方式读取按键的值

  1. uint8_t key_scan(void)
  2. {
  3.         switch(Read_Key_Port())
  4.         {
  5.                 case KEY_1:
  6.                         delay_ms(30);
  7.                         if(Read_Key_Port() == KEY_1)
  8.                         {
  9.                                 while(!(Read_Key_Port() == 0));
  10.                                 return KEY_1;
  11.                         }
  12.                         break;
  13.                 case KEY_2:
  14.                         delay_ms(30);
  15.                         if(Read_Key_Port() == KEY_2)
  16.                         {
  17.                                 while(!(Read_Key_Port() == 0));
  18.                                 return KEY_2;
  19.                         }
  20.                         break;
  21.                 case KEY_3:
  22.                         delay_ms(30);
  23.                         if(Read_Key_Port() == KEY_3)
  24.                         {
  25.                                 while(!(Read_Key_Port() == 0));
  26.                                 return KEY_3;
  27.                         }
  28.                         break;
  29.                 case KEY_4:
  30.                         delay_ms(30);
  31.                         if(Read_Key_Port() == KEY_4)
  32.                         {
  33.                                 while(!(Read_Key_Port() == 0));
  34.                                 return KEY_4;
  35.                         }
  36.                         break;
  37.                 default:
  38.                         break;
  39.         }
  40.         
  41.         return NO_KEY;
  42. }

采用扫描读按键方式·根据返回值确定那个按键被选中。
4:主函数操作

  1. int main(void)
  2. {
  3.         DHT11_Data_TypeDef DHT11_Data;
  4.         System_init();
  5.         Run_Start();
  6.         LCD_P8x16Str(30,0,"FS-IOT32");
  7.         printf("hello watcher!\r\n");
  8.         while(1)
  9.         {        
  10.                 Run_Task();
  11.                 switch(key_scan())
  12.                 {
  13.                         //case KEY_1:
  14.                         case KEY_1:
  15.                                 Beep_Contrl(BEEP_ON);
  16.                                 break;
  17.                         //case KEY_2:
  18.                         case KEY_2:
  19.                           Beep_Contrl(BEEP_OFF);
  20.                                 LCD_CLS();
  21.                                 LCD_P8x16Str(20,4,"Setup Timer!!");
  22.                                 delay_ms(1000);
  23.                                 LCD_CLS();
  24.                                 LCD_P8x16Str(30,0,"FS-IOT32");
  25.                                 break;
  26.                         //case KEY_3:
  27.                         case KEY_3:        //RTCAlarm Mode
  28.                                 LCD_CLS();
  29.                                 LCD_P8x16Str(20,4,"Setup Alarm!!");
  30.                                 delay_ms(1000);
  31.                                 LCD_CLS();
  32.                                 LCD_P8x16Str(30,0,"FS-IOT32");
  33.                                 break;
  34.                         //case KEY_4:
  35.                         case KEY_4:
  36.                                 LCD_CLS();
  37.                                 LCD_P8x16Str(30,0,"Alarm 1");
  38.                                 LCD_CLS();
  39.                                 LCD_P8x16Str(30,0,"FS-IOT32");
  40.                                 break;
  41.                 }
  42.         }        
  43.         
  44. }
粽子糖果 发表于11-09 10:22 浏览65535次
分享到:

已有0条评论

暂时还没有回复哟,快来抢沙发吧

添加一条新评论

只有登录用户才能评论,请先登录注册哦!

话题作者

粽子糖果
粽子糖果(总统)
金币:41623个|学分:51975个
立即注册
畅学电子网,带你进入电子开发学习世界
专业电子工程技术学习交流社区,加入畅学一起充电加油吧!

x

畅学电子网订阅号