#include "key.h" #include "main.h" extern bool refresh; extern bool BT_CONN; extern Menu_table menu; bool sent1_key = false; bool sent2_key = false; bool sent3_key = false; bool sent4_key = false; bool close_flagw=false; //循环关锁 bool open_flagw=false; //循环开锁 bool sealFlag = false; //施解封确认标志位(false:施封,true:解封) uint8_t keyvalue[4]={0}; struct keys key[4]={0,0,0,0}; extern unsigned char SN1[]; extern char _BT_CONN[]; extern char Connected[]; uint8_t KEY_1_Scan(void) { static uint8_t key_state = 1; static uint8_t last_key_state = 1; static uint32_t debounce_time = 0; key_state = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_3); if (key_state != last_key_state) // 检测按键状态变化 { last_key_state = key_state; debounce_time = HAL_GetTick(); // 记录当前时间 } else { if (HAL_GetTick() - debounce_time > 50) // 去抖时间 { if (key_state == GPIO_PIN_RESET) // 按键按下 { if(!sent1_key) { switch(menu.current) { case 1: case 4: case 7: if(menu.up==1) { menu.up=0; menu.next=1; if(menu.current==7) { #ifdef keyDebuginfo #if keyDebuginfo ==1 printf("已选择解封,解封标志:%s\r\n",sealFlag ? "true" : "false"); #endif #endif } refresh=true; } else { menu.up+=1; menu.next-=1; if(menu.current==7) { #ifdef keyDebuginfo #if keyDebuginfo ==1 printf("已选择施封,解封标志:%s\r\n",sealFlag ? "true" : "false"); #endif #endif } refresh=true; } break; case 2: case 5: if(menu.up==4) { menu.up=1; menu.next=3; refresh=true; } else { menu.up+=1; menu.next-=1; refresh=true; } break; case 3: //选择蓝牙 break; } #ifdef keyDebuginfo #if keyDebuginfo ==1 printf("******k1 pressed\t%d %d %d %d %d\n",menu.current,menu.up,menu.next,menu.enter,menu.back); #endif #endif sent1_key = true; } return 1; } else // 按键释放 { sent1_key = false; return 0; } } } return 0; } uint8_t KEY_2_Scan(void) { static uint8_t key_state = 0; static uint8_t last_key_state = 0; static uint32_t debounce_time = 0; key_state = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_4); if (key_state != last_key_state) // 检测按键状态变化 { last_key_state = key_state; debounce_time = HAL_GetTick(); // 记录当前时间 } else { if (HAL_GetTick() - debounce_time > 50) // 去抖时间大于50ms { if (key_state == GPIO_PIN_RESET) // 按键按下 { if (!sent2_key) { switch (menu.current) { case 1: case 4: case 7: if (menu.up == 0) { menu.up = 1; menu.next = 0; if(menu.current==7) { #ifdef keyDebuginfo #if keyDebuginfo ==1 printf("已选择施封,解封标志:%s\r\n",sealFlag ? "true" : "false"); #endif #endif } refresh = true; } else { menu.up -= 1; menu.next += 1; if(menu.current==7) { #ifdef keyDebuginfo #if keyDebuginfo ==1 printf("已选择解封,解封标志:%s\r\n",sealFlag ? "true" : "false"); #endif #endif } refresh = true; } break; case 2: case 5: if (menu.up == 1) { menu.up = 4; menu.next = 0; refresh = true; } else { menu.up -= 1; menu.next += 1; refresh = true; } break; case 3: //选择蓝牙 break; } #ifdef keyDebuginfo #if keyDebuginfo ==1 printf("******k2 pressed\t%d %d %d %d %d\n", menu.current, menu.up, menu.next, menu.enter, menu.back); #endif #endif sent2_key = true; } return 1; } else // 按键释放 { sent2_key = false; return 0; } } } return 0; } uint8_t KEY_3_Scan(void) { static uint8_t key_state = 0; static uint8_t last_key_state = 0; static uint32_t debounce_time = 0; key_state = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_5); if (key_state != last_key_state) // 检测按键状态变化 { last_key_state = key_state; debounce_time = HAL_GetTick(); // 记录当前时间 } else { if (HAL_GetTick() - debounce_time > 50) // 去抖时间大于50ms { if (key_state == GPIO_PIN_RESET) // 按键按下 { if (!sent3_key) { switch (menu.current) { case 0: menu.current += 1; menu.up += 1; menu.enter += 1; refresh = true; break; case 1: if (menu.up == 0 && menu.next == 1) { menu.current += 3; menu.up = 1; menu.next = 0; menu.enter += 1; refresh = true; } else { menu.current += 1; menu.up = 4; menu.next = 0; menu.enter += 1; refresh = true; } break; case 2: menu.current += 1; menu.enter += 1; refresh = true; break; case 3: // 选择蓝牙 menu.enter=4; if(menu.enter==4) { BT_CONN = true; } break; case 4: if (menu.next == 1) { menu.current += 2; menu.enter += 1; refresh = true; } else { menu.current += 1; menu.up = 4; menu.next = 0; menu.enter += 1; refresh = true; } break; case 5: menu.current = 7; menu.up = 1; menu.next = 0; menu.enter += 1; refresh = true; break; case 7: if(menu.sn==SN1) { menu.current+=1; refresh = true; if(menu.up==1) { //sealFlag=false; sendCmd_BT("AT+CONN=101000000003\r\n","+CONNECTED:0,101000000003",1,1); close_flagw=true; } else { sendCmd_BT("AT+CONN=101000000003\r\n","+CONNECTED:0,101000000003",1,1); open_flagw=true; // sealFlag=true; } } else { menu.current=7; refresh = true; } break; } #ifdef keyDebuginfo #if keyDebuginfo ==1 printf("******k3 pressed\t%d %d %d %d %d\n", menu.current, menu.up, menu.next, menu.enter, menu.back); #endif #endif sent3_key = true; } return 1; } else // 按键释放 { sent3_key = false; return 0; } } } return 0; } uint8_t KEY_4_Scan(void) { static uint8_t key_state = 0; static uint8_t last_key_state = 0; static uint32_t debounce_time = 0; key_state = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_6); if (key_state != last_key_state) // 检测按键状态变化 { last_key_state = key_state; debounce_time = HAL_GetTick(); // 记录当前时间 } else { if (HAL_GetTick() - debounce_time > 50) // 去抖时间大于50ms { if (key_state == GPIO_PIN_RESET) // 按键按下 { if (!sent4_key) { switch (menu.current) { case 1: menu.current = 0; menu.up = 0; menu.next = 0; menu.enter = 0; refresh = true; break; case 2: menu.current = 1; menu.up = 1; menu.next = 0; menu.enter = 1; menu.back = 0; refresh = true; break; case 3: menu.current = 2; menu.up = 4; menu.next = 0; menu.enter = 2; menu.back = 1; refresh = true; break; case 4: menu.current = 1; menu.up = 1; menu.next = 0; menu.enter = 1; menu.back = 0; refresh = true; break; case 5: menu.current = 4; menu.up = 1; menu.next = 0; menu.back = 1; refresh = true; break; case 6: menu.current = 4; menu.up = 1; menu.next = 0; menu.back = 1; refresh = true; break; case 7: menu.current = 5; menu.up = 4; menu.next = 0; menu.back = 1; refresh = true; break; case 8: refresh = true; break; } #ifdef keyDebuginfo #if keyDebuginfo ==1 printf("******k4 pressed\t%d %d %d %d %d\n", menu.current, menu.up, menu.next, menu.enter, menu.back); #endif #endif sent4_key = true; } return 1; } else // 按键释放 { sent4_key = false; return 0; } } } return 0; } void updatekeystate(void) { keyvalue[0]=KEY_1_Scan(); keyvalue[1]=KEY_2_Scan(); keyvalue[2]=KEY_3_Scan(); keyvalue[3]=KEY_4_Scan(); }