#include "key.h" #include "usart.h" #include "interface.h" //结构体 LockInfo lockinfo; extern Menu_table menu; extern TipsFlag tipsflag; struct keys key[1]={0}; //布尔 bool sent1_key = false; bool sent2_key = false; bool sent3_key = false; bool sent4_key = false; uint32_t enterInterface_time =0; uint8_t preworkUp = 0; uint8_t onOff_Num=0; uint8_t KEY_1_Scan_PDA(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_3); if (key_state != last_key_state) // 检测按键状态变化 { last_key_state = key_state; debounce_time = HAL_GetTick(); // 记录当前时间 } else { if (HAL_GetTick() - debounce_time > 30) // 去抖时间 { if (key_state == GPIO_PIN_RESET) // 按键按下 { if(!sent1_key) { enterInterface_time = HAL_GetTick(); switch(menu.current) { case 0: { SET_MENU_STATUS(0,0,0,0); break; } case 1: { SET_MENU_STATUS(1,1,0,1); break; } case 2: case 3: { SWITCH_MENU_UP4(); break; } case 8://L绑定 { if(menu.up != macsetptr->macCount) { \ menu.up += 1; \ menu.next -= 1; \ } else if(menu.up == macsetptr->macCount) { \ menu.up = 0; \ menu.next = macsetptr->macCount; \ } \ refresh = true; \ break; } case 4: case 5: case 6: case 7: { SWITCH_MENU_UP2();//上翻2选项 break; } } #if debugkeyinfo == 1 PRINT_MENU_STATUS("K1"); #endif sent1_key = true; } return 1; } else // 按键释放 { sent1_key = false; return 0; } } } return 0; } uint8_t KEY_2_Scan_PDA(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 > 30) // 去抖时间 { if (key_state == GPIO_PIN_RESET) // 按键按下 { if (!sent2_key) { enterInterface_time = HAL_GetTick(); switch (menu.current) { case 0: { //SET_MENU_STATUS(1,0,0,0); break; } case 1: { SET_MENU_STATUS(1,0,1,1); break; } case 2: { SWITCH_MENU_DOWN4();//四选项选择 break; } case 3: case 8://L绑定 { if(menu.next!=macsetptr->macCount){ menu.up-=1; menu.next+=1; } else if(menu.next==macsetptr->macCount) { menu.up=macsetptr->macCount; menu.next=0; } refresh=true; break; } case 4: case 5: case 6: case 7: { SWITCH_MENU_DOWN2();//下翻2选项 break; } } #if debugkeyinfo == 1 PRINT_MENU_STATUS("K2"); #endif sent2_key = true; } return 1; } else // 按键释放 { sent2_key = false; return 0; } } } return 0; } uint8_t preCurrent = 0; uint8_t preBind = 0; bool L1work = false; bool L2work = false; bool L3work = false; bool L4work = false; char macStr[20][13]; // 长度为13的字符串加上字符串结束符'\0' uint8_t KEY_3_Scan_PDA(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 > 30) // 去抖时间 { if (key_state == GPIO_PIN_RESET) // 按键按下 { if (!sent3_key) { enterInterface_time = HAL_GetTick(); switch (menu.current) { case 0://跳转到菜单界面 { SET_MENU_STATUS(1,1,0,1);//跳转操作界面 break; } case 1://跳转到L绑定界面 { if(menu.up==1) { SET_MENU_STATUS(2,3,0,2); } else { SET_MENU_STATUS(3,3,0,2); } break; } case 2: { preBind = menu.up; Flash_ReadBytes(&macsetptr->macCount,MacDbHeadAddr,1);//获取共存多少MAC printf("%04X\r\n",macsetptr->macCount); char mac[13*macsetptr->macCount];//char数组需要预留足够的空间,也就是13个字符,因为还需要包含字符串结尾的'\0' Flash_ReadBytes_mac((uint16_t*)macsetptr->mac,MacDbBodyAddr,(3*macsetptr->macCount));//读MAC bin2hex(mac, (unsigned char *)macsetptr->mac, (6*macsetptr->macCount));//将uint16数组转换成char数组 (FLASH中的字符串) // 分割mac并放入macStr数组中 for (int i = 0; i < macsetptr->macCount; i++) { strncpy(macStr[i], mac + i * 12, 12); // 复制13个字符到macStr中 macStr[i][12] = '\0'; // 添加字符串结束符 } // 打印分割后的字符串 for (int i = 0; i < macsetptr->macCount; i++) { printf("macStr[%d]: %s\n", i, macStr[i]); } SET_MENU_STATUS(8,macsetptr->macCount,0,2); break; } case 8: { if(preBind==3)//L1确认绑定 { L1bd=true; sprintf(lockinfo.SN1name, "%s", macStr[menu.next]+8); Flash_WriteBytes(macsetptr->mac+menu.next*6,Sn1InfoAddr,3); break; } if(preBind==2)//L2确认绑定 { L2bd=true; sprintf(lockinfo.SN2name, "%s", macStr[menu.next]+8); Flash_WriteBytes(macsetptr->mac+menu.next*6,Sn2InfoAddr,3); break; } if(preBind==1)//L3确认绑定 { L3bd=true; sprintf(lockinfo.SN3name, "%s", macStr[menu.next]+8); Flash_WriteBytes(macsetptr->mac+menu.next*6,Sn3InfoAddr,3); break; } if(preBind==0)//L4确认绑定 { L4bd=true; sprintf(lockinfo.SN4name, "%s", macStr[menu.next]+8); Flash_WriteBytes(macsetptr->mac+menu.next*6,Sn4InfoAddr,3); break; } } case 3: { if(menu.up==3)//L1操作 { preworkUp=menu.up; SET_MENU_STATUS(4,1,0,3); break; } if(menu.up==2)//2操作 { preworkUp=menu.up; SET_MENU_STATUS(5,1,0,3); break; } if(menu.up==1)//3操作 { preworkUp=menu.up; SET_MENU_STATUS(6,1,0,3); break; } if(menu.up==0)//4操作 { preworkUp=menu.up; SET_MENU_STATUS(7,1,0,3); break; } } case 4: case 5: case 6: case 7: { preCurrent = menu.current; onOff_Num = menu.up;//1:施封 0:解封 printf("%d\r\n",onOff_Num); if(preworkUp == 3) //L1 { } else if(preworkUp == 2) //L2 { } else if(preworkUp == 1) //L3 { } else if(preworkUp == 0) //L4 { } } } #if debugkeyinfo == 1 PRINT_MENU_STATUS("K3"); #endif sent3_key = true; } return 1; } else // 按键释放 { sent3_key = false; return 0; } } } return 0; } uint8_t KEY_4_Scan_PDA(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 > 30) // 去抖时间 { if (key_state == GPIO_PIN_RESET) // 按键按下 { enterInterface_time = HAL_GetTick(); if (!sent4_key) {//返回 switch (menu.current) { case 0: case 1: { SET_MENU_STATUS(0,0,0,0); break; } case 2: case 3: { SET_MENU_STATUS(1,1,0,1); break; } case 4: case 5: case 6: case 7: { USART_SendString(&huart5, "AT+DISCONN=0\r\n");//断开连接 SET_MENU_STATUS(3,3,0,2); break; } case 8: { SET_MENU_STATUS(2,3,0,2); break; } } #if debugkeyinfo == 1 PRINT_MENU_STATUS("K4"); #endif sent4_key = true; } return 1; } else // 按键释放 { sent4_key = false; return 0; } } } return 0; } void updatekeystate(void) { KEY_1_Scan_PDA(); KEY_2_Scan_PDA(); KEY_3_Scan_PDA(); KEY_4_Scan_PDA(); }