電路原理圖如下:
51hei.png (91.99 KB, 下載次數: 76)
下載附件
2021-4-4 03:49 上傳
Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
51hei.png (14.69 KB, 下載次數: 48)
下載附件
2021-4-4 03:48 上傳
單片機源程序如下:
- #include "my_include.h"
- #define NUM_SECTOR_REC_RFID 0
- #define NUM_SECTOR_CARD 1
- #define ADDR_FLASH_ID_BASE_RFID FLASH_BASE_ADDR+(STM32_FLASH_SIZE - NUM_SECTOR_REC_RFID - 1)*1024//保存刷卡用戶記錄的Flash地址
- #define ADDR_FLASH_ID_BASE_CARD FLASH_BASE_ADDR+(STM32_FLASH_SIZE - NUM_SECTOR_CARD - 1)*1024//保存用戶卡號的Flash地址
- #define MAX_NUM_USER_CARD 3//RFID最大用戶數
- #define F_SIZE 12//默認字體大小
- #define MyLCD_Show(m,n,p) LCD_ShowString(LCD_GetPos_X(F_SIZE,m),LCD_GetPos_Y(F_SIZE,n),p,F_SIZE,false)
- #define MAX_MENU 4//菜單條目總數
- #if F_SIZE==12
- #define START_LINE 0
- #define POS_MENU_Y 1//菜單顯示起始行數
- #elif F_SIZE==24
- #define START_LINE 1
- #define POS_MENU_Y 4//菜單顯示起始行數
- #endif
- u8 UID[4];//讀取到的卡號
- u8 userCard[MAX_NUM_USER_CARD][4];//用戶的卡號
- char disTemp[17];
- char dis0[64];//液晶顯示暫存數組
- char dis1[64];//液晶顯示暫存數組
- u32 ticks_rly=0,ticks_beep=0;//繼電器和蜂鳴器動作及時
- bool beepAlarm = false;//蜂鳴器報警標志
- _record_obj saveRecord_CARD[MAX_NUM_USER_CARD+1];//最大刷卡用戶數+未錄入卡號(所有未錄入卡號視為同一個)
- char *userName_CARD[MAX_NUM_USER_CARD+1] = {"RFID01","RFID02","RFID03","RFID未錄入"};//用戶名稱
- u8 workState = 0;
- u8 availableCardCount = 0;
- void OnGetUartMessage(const _uart_msg_obj *uartMsgRec)
- {
- char *strPtr;
- if((strPtr = strstr(uartMsgRec->payload,"RTC"))!=NULL)//接收到rtc字符串
- {
- My_RTC_SetStr(strPtr+3);//設置實時時鐘時間
- USART_printf(USART1,"*Set RTC OK#\r\n");
- }
- else if(strstr(uartMsgRec->payload,"RELAY_KEY")!=NULL)//接收到字符串
- {
- ticks_rly = My_SysTick_GetTicks();//獲取系統時間
- MyLCD_Show(4,POS_MENU_Y+3,"遠程操作成功 ");//液晶顯示字符串
- relay = RLY_ON;//繼電器閉合
- beepAlarm = false;//取消蜂鳴器報警
- //**All notes can be deleted and modified**//
- }
- else if(strstr(uartMsgRec->payload,"BEEP_KEY")!=NULL)//接收到字符串
- {
- #pragma push
- #pragma diag_suppress 188//暫時屏蔽#188-D: enumerated type mixed with another type警告
- beepAlarm = !beepAlarm;//切換報警狀態
- #pragma pop
- buzzer = beepAlarm;//蜂鳴器動作
- USART_printf(USART1,"*Set BEEP OK#\r\n");
- }
- else if(strstr(uartMsgRec->payload,"GET_RECORD_RFID")!=NULL)//接收到字符串
- {
- u8 i;
- for(i=0;i<MAX_NUM_USER_CARD+1;i++)
- {
- sprintf(dis0,"*REC_CARD_U%dC%dT%d#\r\n",i,saveRecord_CARD[i].count,saveRecord_CARD[i].timeCount);
- USART_printf(USART1,dis0);
- }
- }
- else
- {
- USART_printf(USART1,"*CMD ERROR#\r\n");
- }
- }
- void keySetTime( void );
- int main(void)
- {
- u8 index_CARD;//當前選擇的用戶編號
- u8 sec_now = 0;//當前時間的秒鐘數
- u8 day_now = 0;//當前日期的天數
- u8 i;
-
- My_LED_Init();//LED初始化
- My_KEY_Init();//按鍵初始化
- USARTx_Init(USART1,9600);//串口初始化為9600
- // USARTx_Init(USART2,9600);//串口初始化為9600
- relay = RLY_ON;//繼電器閉合
- buzzer = BEEP_ON;//蜂鳴器報警
- LCD_Init();//液晶初始化
- relay = RLY_OFF;//繼電器斷開
- buzzer = BEEP_OFF;//蜂鳴器取消報警
- LCD_Clear(Color16_BLACK);//清除液晶屏幕
- FRONT_COLOR = Color16_WHITE;//設置液晶前景色(畫筆顏色)
- BACK_COLOR = Color16_BLACK;//設置液晶背景色(畫布顏色)
- My_RTC_Init(false);//RTC初始化(不使能鬧鐘)
- keySetTime();//進入按鍵設置時鐘 如果是有無線通信的情況下 該按鍵設置可以取消
- MyLCD_Show(4,0,"智能打卡系統");//液晶顯示字符串
- MyLCD_Show(4,2+START_LINE,"正在初始化...");//液晶顯示字符串
- My_RC522_Init();
-
- My_STMFlash_SectorSaveInit(NUM_SECTOR_REC_RFID,ADDR_FLASH_ID_BASE_RFID,(u16 *)saveRecord_CARD,sizeof(saveRecord_CARD)/2);//讀取保存的RFID歷史記錄數據
- for(i=0;i<MAX_NUM_USER_CARD+1;i++)
- {
- if(saveRecord_CARD[i].count==0xffff)
- {
- saveRecord_CARD[i].timeCount=0;//記錄時間戳默認為0(即1970年1月1日00時00分00秒)
- saveRecord_CARD[i].count=0;//記錄簽到次數默認為0
- saveRecord_CARD[i].userID = i;//用戶ID按照數組順序賦值
- saveRecord_CARD[i].type = 1;
- }
- }
- My_STMFlash_SectorSaveInit(NUM_SECTOR_CARD,ADDR_FLASH_ID_BASE_CARD,(u16 *)userCard,sizeof(userCard)/2);//讀取保存的用戶卡號數據
- for(i=0;i<MAX_NUM_USER_CARD;i++)//將無效卡號清零
- {
- if(*((u32 *)userCard[i])==0xffffffff)
- {
- *((u32 *)userCard[i])=0;//卡號為0是為無效卡
- }
- //**All notes can be deleted and modified**//
- }
- availableCardCount = MAX_NUM_USER_CARD-availableCardCount;
-
- MyLCD_Show(4,2+START_LINE,"初始化成功 ");//液晶顯示字符串
- sprintf(disTemp,"RFID總數:%d",availableCardCount);
- MyLCD_Show(4,3+START_LINE,disTemp);//液晶顯示字符串
-
- delay_ms(1000);
- MyLCD_Show(4,2+START_LINE," ");//液晶顯示字符串
- MyLCD_Show(4,3+START_LINE," ");//液晶顯示字符串
- MyLCD_Show(4,4+START_LINE," ");//液晶顯示字符串
- MyLCD_Show(4,POS_MENU_Y," 歡迎使用 ");//液晶顯示字符串
- //FINGERPRINT_Cmd_Delete_All_Model();
- My_Menu_Init();
-
- while(1)
- {
- My_KeyScan();//按鍵掃描
-
-
- switch(My_Menu_GetSelectID())//獲取菜單ID
- {
- case MENU_ID_ADD_RFID:////////////////////////////////////////////////添加卡號
- {
- switch(workState)
- {
- case 0:
- for(index_CARD=0;index_CARD<MAX_NUM_USER_CARD;index_CARD++)//計算有效卡號數量
- {
- if(*((u32 *)userCard[index_CARD])==0)//卡號為0是為無效卡
- {
- break;
- }
- }
- if(index_CARD>=MAX_NUM_USER_CARD)//卡號索引大于等于最大用戶數
- {
- MyLCD_Show(4,POS_MENU_Y+2,"RFID庫已滿!");//液晶顯示字符串
- delay_ms(1000);
- MyLCD_Show(4,POS_MENU_Y+2," ");//液晶顯示字符串
- My_Menu_Back(true);
- break;
- }
- MyLCD_Show(5,POS_MENU_Y+2,"選擇編號 ");//液晶顯示字符串
- sprintf(disTemp," %s ",userName_CARD[index_CARD]);//顯示ID號
- MyLCD_Show(4,POS_MENU_Y+3,disTemp);
- workState++;//進入下一個狀態
- break;
- case 1:
- if(KeyIsPress(key_up))//按下了向上鍵
- {
- index_CARD++;//ID號加
- index_CARD %= MAX_NUM_USER_CARD;//最大用戶數
- sprintf(disTemp," %s ",userName_CARD[index_CARD]);//顯示ID號
- MyLCD_Show(4,POS_MENU_Y+3,disTemp);
- }
- if(KeyIsPress(key_down))//按下了向下鍵
- {
- //**All notes can be deleted and modified**//
- sprintf(disTemp," %s ",userName_CARD[index_CARD]);//顯示ID號
- MyLCD_Show(4,POS_MENU_Y+3,disTemp);
- }
- if(KeyIsPress(key_ok))//按下了OK鍵
- {
- if(*((u32 *)userCard[index_CARD])==0)//卡號為0是為無效卡
- {
- workState++;//進入下一個狀態
- }
- else
- {
- sprintf(disTemp,"%s已存在! ",userName_CARD[index_CARD]);//顯示ID號
- MyLCD_Show(4,POS_MENU_Y+3," ");
- MyLCD_Show(4,POS_MENU_Y+2,disTemp);
- delay_ms(1000);
- MyLCD_Show(4,POS_MENU_Y+2," ");
- //**All notes can be deleted and modified**//
- }
- }
- break;
- case 2:
- MyLCD_Show(5,POS_MENU_Y+2,"請刷卡... ");//液晶顯示字符串
- MyLCD_Show(5,POS_MENU_Y+3," ");//液晶顯示字符串
- workState++;//進入下一個狀態
- break;
- case 3:
- if(My_RC522_ReadCardID(UID,true))//讀取到一次卡號
- {
- buzzer = BEEP_ON;
- delay_ms(100);
- buzzer = BEEP_OFF;
- for(i=0;i<MAX_NUM_USER_CARD;i++)//對比所有的用戶卡號
- {
- if(My_memcmp(UID,userCard[i],4))//與用戶卡號相同
- {
- break;
- }
- }
- if(i<MAX_NUM_USER_CARD)//與其中一個用戶卡號相同
- {
- MyLCD_Show(5,POS_MENU_Y+2,"卡號已存在! ");//液晶顯示字符串
- delay_ms(900);
- MyLCD_Show(5,POS_MENU_Y+2," ");//液晶顯示字符串
- workState--;//返回上一個狀態
- }
- else//與所有的用戶卡號都不相同
- {
- MyLCD_Show(5,POS_MENU_Y+2,"刷卡成功... ");//液晶顯示字符串
- delay_ms(400);
- //**All notes can be deleted and modified**//
- }
- }
- break;
- case 4:
- MyLCD_Show(5,POS_MENU_Y+2,"請再刷一次... ");//液晶顯示字符串
- workState++;//進入下一個狀態
- break;
- case 5:
- if(My_RC522_ReadCardID(userCard[index_CARD],true))//讀取到一次卡號
- {
- buzzer = BEEP_ON;
- delay_ms(100);
- buzzer = BEEP_OFF;
- if(My_memcmp(userCard[index_CARD],UID,4))//對比兩次讀取的卡號是否相同
- {
- MyLCD_Show(5,POS_MENU_Y+2,"刷卡成功! ");//液晶顯示字符串
- My_STMFlash_SaveUseSector(NUM_SECTOR_CARD);//保存數據到用戶RFID卡號位置
- workState++;//進入下一個狀態
- delay_ms(900);
- }
- else
- {
- MyLCD_Show(5,POS_MENU_Y+2,"卡號不匹配! ");//液晶顯示字符串
- MyLCD_Show(5,POS_MENU_Y+3,"請再次刷卡... ");//液晶顯示字符串
- *((u32 *)userCard[index_CARD])=0;//卡號清零
- //**All notes can be deleted and modified**//
- }
- }
- break;
- case 6:
- MyLCD_Show(5,POS_MENU_Y+2," ");//液晶顯示字符串
- My_Menu_Exit();//退出菜單
- workState=0;//回到初始狀態
- break;
- default:break;
- }
- }
- break;
- case MENU_ID_DEL_RFID:////////////////////////////////////////////////刪除卡號
- {
- switch(workState)
- {
- case 0:
- if(index_CARD>=MAX_NUM_USER_CARD)
- {
- index_CARD = MAX_NUM_USER_CARD-1;//指向最大值
- }
- MyLCD_Show(5,POS_MENU_Y+2,"選擇編號 ");//液晶顯示字符串
- sprintf(disTemp," %s ",userName_CARD[index_CARD]);//顯示ID號
- MyLCD_Show(4,POS_MENU_Y+3,disTemp);
- workState++;//進入下一個狀態
- break;
- case 1:
- if(KeyIsPress(key_up))//按下了向上鍵
- {
- index_CARD++;//ID號加
- index_CARD %= MAX_NUM_USER_CARD;//最大用戶數
- sprintf(disTemp," %s ",userName_CARD[index_CARD]);//顯示ID號
- MyLCD_Show(4,POS_MENU_Y+3,disTemp);
- }
- if(KeyIsPress(key_down))
- {
- if(index_CARD)//索引號大于0
- {
- index_CARD--;//ID號減
- }
- else
- {
- index_CARD = MAX_NUM_USER_CARD-1;//指向最大值
- }
- sprintf(disTemp," %s ",userName_CARD[index_CARD]);//顯示ID號
- MyLCD_Show(4,POS_MENU_Y+3,disTemp);
- }
- if(KeyIsPress(key_ok))//按下了OK鍵
- {
- if(*((u32 *)userCard[index_CARD])==0)//卡號為0是為無效卡
- {
- sprintf(disTemp,"%s不存在!",userName_CARD[index_CARD]);
- MyLCD_Show(5,POS_MENU_Y+2,disTemp);//液晶顯示字符串
- MyLCD_Show(4,POS_MENU_Y+3," ");//液晶顯示字符串
- //**All notes can be deleted and modified**//
- }
- else
- {
- sprintf(disTemp,"刪除%s卡號?",userName_CARD[index_CARD]);
- MyLCD_Show(4,POS_MENU_Y+2,disTemp);//液晶顯示字符串
- MyLCD_Show(4,POS_MENU_Y+3," ");//液晶顯示字符串
- //**All notes can be deleted and modified**//
- }
- delay_ms(500);
- }
- break;
- case 2:
- if(KeyIsPress(key_ok))//按下了OK鍵
- {
- MyLCD_Show(4,POS_MENU_Y+2,"卡號已刪除! ");//液晶顯示字符串
- MyLCD_Show(4,POS_MENU_Y+3," ");//液晶顯示字符串
- saveRecord_CARD[index_CARD].timeCount = 0;//默認為0
- saveRecord_CARD[index_CARD].count=0;//計數值清零
- My_STMFlash_SaveUseSector(NUM_SECTOR_REC_RFID);//保存數據到RFID歷史記錄位置
- *((u32 *)userCard[index_CARD])=0;//卡號清零
- My_STMFlash_SaveUseSector(NUM_SECTOR_CARD);//保存數據到用戶RFID卡號位置
- workState++;//進入下一個狀態
- delay_ms(500);
- }
- break;
- case 3:
- MyLCD_Show(4,POS_MENU_Y+2," ");//液晶顯示字符串
- My_Menu_Exit();//退出菜單
- workState=0;//回到初始狀態
- break;
- default:break;
- }
- }
- break;
- case MENU_ID_CLR_RFID:////////////////////////////////////////////////清空卡號
- {
- switch(workState)
- {
- case 0:
- MyLCD_Show(4,POS_MENU_Y+1," ");//液晶顯示字符串
- MyLCD_Show(4,POS_MENU_Y+2,"確認清空卡號? ");//液晶顯示字符串
- MyLCD_Show(4,POS_MENU_Y+3," ");//液晶顯示字符串
- workState++;//進入下一個狀態
- break;
- case 1:
- if(KeyIsPress(key_ok))//按下了OK鍵
- {
- MyLCD_Show(4,POS_MENU_Y+2,"卡號已清空! ");//液晶顯示字符串
- //**All notes can be deleted and modified**//
- My_STMFlash_SaveUseSector(NUM_SECTOR_REC_RFID);//保存數據到RFID歷史記錄位置
- for(i=0;i<MAX_NUM_USER_CARD;i++)//清除每一個RFID卡號
- {
- *((u32 *)userCard[i])=0;//卡號為0是為無效卡
- }
- My_STMFlash_SaveUseSector(NUM_SECTOR_CARD);//保存數據到flash
- workState++;//進入下一個狀態
- delay_ms(800);
- }
- break;
- case 2:
- MyLCD_Show(4,POS_MENU_Y+2," ");//液晶顯示字符串
- My_Menu_Exit();//退出菜單
- workState=0;//回到初始狀態
- break;
- default:break;
- }
- }
- break;
- case MENU_ID_HISTORY_RFID:////////////////////////////////////////////RFID歷史記錄
- {
- switch(workState)
- {
- case 0:
- for(i=0;i<MAX_NUM_USER_CARD+1;i++)//遍歷每一個RFID歷史記錄
- {
- _calendar_obj cal_save;
- My_RTC_IntegerToCalendar(saveRecord_CARD[i].timeCount,&cal_save);//將RFID歷史記錄的時間數據轉換為日歷結構體
- sprintf(dis0,"%s %d次 ",userName_CARD[i],saveRecord_CARD[i].count);//數據格式轉換
- sprintf(dis1,"%04d-%02d-%02d %02d:%02d:%02d",cal_save.year,cal_save.month,cal_save.day,cal_save.hour,cal_save.minute,cal_save.second);
- MyLCD_Show(0,POS_MENU_Y+(i<<1)+1,dis0);//液晶顯示字符串
- MyLCD_Show(0,POS_MENU_Y+(i<<1)+2,dis1);//液晶顯示字符串
- }
- workState++;//進入下一個狀態
- break;
- case 1:
- if(KeyIsPress(key_set_back))//按下了返回按鍵
- {
- for(i=0;i<MAX_NUM_USER_CARD+1;i++)//清除每一條歷史紀錄的顯示
- {
- MyLCD_Show(0,POS_MENU_Y+(i<<1)+1," ");//液晶顯示字符串
- MyLCD_Show(0,POS_MENU_Y+(i<<1)+2," ");//液晶顯示字符串
- }
- }
- break;
- default:break;
- }
- }
- break;
- default:
- break;
- }
- My_Menu_Contrl();//控制菜單的上下移動及進入和返回
-
- if(My_Menu_GetSelectID() == 0)//未進入菜單
- {
- if(KeyIsPress(key_up))//如果按下了繼電器控制按鍵
- {
- ticks_rly = My_SysTick_GetTicks();//獲取系統時間
- relay = RLY_ON;//繼電器閉合
- beepAlarm = false;//取消蜂鳴器報警
- buzzer = BEEP_OFF;//取消蜂鳴器報警
- }
- if(KeyIsPress(key_down))//如果按下了報警按鍵
- {
- #pragma push
- #pragma diag_suppress 188//暫時屏蔽#188-D: enumerated type mixed with another type警告
- beepAlarm = !beepAlarm;//切換報警狀態
- #pragma pop
- buzzer = beepAlarm;//蜂鳴器動作
- }
- // 尋卡
- if(My_RC522_ReadCardID(UID,true))
- {
- for(index_CARD=0;index_CARD<MAX_NUM_USER_CARD;index_CARD++)//對比每一個RFID卡號
- {
- if(My_memcmp(UID,userCard[index_CARD],4))//如果卡號相同
- {
- break;
- }
- }
- buzzer = !buzzer;
- delay_ms(100);
- buzzer = !buzzer;
- saveRecord_CARD[index_CARD].timeCount = My_RTC_CalendarToInteger(&calendar);//將當前RTC時間轉換為整數
- saveRecord_CARD[index_CARD].count++;//計數值+1
- if(index_CARD<MAX_NUM_USER_CARD)//如果讀取到的卡號與其中一個用戶卡號相同
- {
- ticks_rly = My_SysTick_GetTicks();//獲取系統時間
- beepAlarm = false;//取消蜂鳴器報警
- relay = RLY_ON;//繼電器閉合
- buzzer = BEEP_OFF;//取消蜂鳴器報警
- FRONT_COLOR = Color16_GREEN;//將液晶前景色(畫筆顏色)設置為綠色
- sprintf(disTemp,"%s %d次",userName_CARD[index_CARD],saveRecord_CARD[index_CARD].count);
- MyLCD_Show(4,POS_MENU_Y+3,"刷卡成功!");//液晶顯示字符串
- }
- else//如果讀取到的卡號與所有用戶卡號都不相同
- {
- ticks_beep = My_SysTick_GetTicks();//獲取系統時間
- buzzer = BEEP_ON;//蜂鳴器報警
- relay = RLY_OFF;//繼電器斷開
- FRONT_COLOR = Color16_RED;//將液晶前景色(畫筆顏色)設置為紅色
- sprintf(disTemp,"RFID未錄入 %d次",saveRecord_CARD[index_CARD].count);
- }
- sprintf(dis0,"*REC_CARD_U%dC%dT%d#\r\n",index_CARD,saveRecord_CARD[index_CARD].count,saveRecord_CARD[index_CARD].timeCount);
- USART_printf(USART1,dis0);
- MyLCD_Show(4,POS_MENU_Y+2,disTemp);//液晶顯示字符串
- sprintf(dis0,"%04d-%02d-%02d",calendar.year,calendar.month,calendar.day);
- sprintf(dis1,"%02d:%02d:%02d %d",calendar.hour,calendar.minute,calendar.second,calendar.week);
- MyLCD_Show(4,POS_MENU_Y+4,dis0);//液晶顯示字符串
- MyLCD_Show(4,POS_MENU_Y+5,dis1);//液晶顯示字符串
- //**All notes can be deleted and modified**//
- delay_ms(1800);//防止手指松開時的誤判斷
- MyLCD_Show(0,POS_MENU_Y+2," ");//液晶顯示字符串
- MyLCD_Show(0,POS_MENU_Y+3," ");//液晶顯示字符串
- MyLCD_Show(0,POS_MENU_Y+4," ");//液晶顯示字符串
- MyLCD_Show(0,POS_MENU_Y+5," ");//液晶顯示字符串
- }
- }
- if(ticks_rly>0 && SysTickSecPassed(ticks_rly,3))//時間過去3秒鐘
- {
- ticks_rly = 0;
- relay = RLY_OFF;//繼電器斷開
- }
- if(ticks_beep>0 && SysTickSecPassed(ticks_beep,3))//時間過去3秒鐘
- {
- ticks_beep = 0;
- buzzer = BEEP_OFF;//取消蜂鳴器報警
- }
-
- if(day_now != calendar.day)
- {
- day_now = calendar.day;
- sprintf(dis0,"%04d-%02d-%02d",calendar.year,calendar.month,calendar.day);
- #if START_LINE==1
- MyLCD_Show(5,1,dis0);//液晶顯示字符串
- #else
- MyLCD_Show(2,0,dis0+5);//液晶顯示字符串
- MyLCD_Show(7,0," ");//液晶顯示字符串
- #endif
- }
- if(sec_now != calendar.second)
- {
- sec_now = calendar.second;
- sprintf(dis1,"%02d:%02d:%02d %d",calendar.hour,calendar.minute,calendar.second,calendar.week);
- #if START_LINE==1
- MyLCD_Show(5,2,dis1);//液晶顯示字符串
- #else
- MyLCD_Show(9,0,dis1);//液晶顯示字符串
- #endif
- }
- if(beepAlarm)
- {
- relay = RLY_OFF;//繼電器斷開
- buzzer = BEEP_ON;
- }
- My_UartMessage_Process();//處理串口數據
- }
- }
- void My_Menu_Contrl(void)
- {
- if(selectedMenu!=NULL)
- {
- if(KeyIsPress(key_up))//按下了向上鍵
- {
- My_Menu_SelectUp(true);
- }
- if(KeyIsPress(key_down))//按下了向上鍵
- {
- My_Menu_SelectDown(true);
- }
- if(KeyIsPress(key_ok))//按下了OK鍵
- {
- My_Menu_Into(true);
- }
- if(KeyIsPress(key_set_back))
- {
- MyLCD_Show(0,POS_MENU_Y+1," ");//液晶顯示字符串
- MyLCD_Show(0,POS_MENU_Y+2," ");//液晶顯示字符串
- MyLCD_Show(0,POS_MENU_Y+3," ");//液晶顯示字符串
- workState=0;//回到初始狀態
- My_Menu_Back(true);
- }
- }
- else if(KeyIsPress(key_set_back))
- {
- My_Menu_Into(true);
- }
- }
- void My_Menu_Display(void)
- {
- u8 i;
- if(selectedMenu==NULL)//如果已經退出菜單
- {
- MyLCD_Show(4,POS_MENU_Y," 歡迎使用 ");//液晶顯示字符串
- return;
- }
- if(My_Menu_UnderBottom())
- {
- MyLCD_Show(6,POS_MENU_Y,*(selectedMenu->contentPtrArray+selectedMenu->selectIndex));//液晶顯示字符串
- return;
- }
- MyLCD_Show(6,POS_MENU_Y,selectedMenu->title);//液晶顯示字符串
- for(i=0;i<selectedMenu->itemCount;i++)
- {
- if(i==selectedMenu->selectIndex)
- {
- FRONT_COLOR = Color16_LIGHTBLUE;//設置前景色(畫筆顏色)為淺藍色
- MyLCD_Show(5,i+POS_MENU_Y+1,">");//液晶顯示字符串
- MyLCD_Show(6,POS_MENU_Y+1+i,*(selectedMenu->contentPtrArray+i));//液晶顯示字符串
- FRONT_COLOR = Color16_WHITE;//設置前景色(畫筆顏色)為白色
- }
- else
- {
- MyLCD_Show(5,i+POS_MENU_Y+1," ");//液晶顯示字符串
- MyLCD_Show(6,POS_MENU_Y+1+i,*(selectedMenu->contentPtrArray+i));//液晶顯示字符串
- }
- }
- }
- void My_Menu_Clear(void)
- {
- u8 i,len;
- if(selectedMenu==NULL || My_Menu_UnderBottom())//如果推出了菜單或當前在菜單的最底層
- {
- MyLCD_Show(4,POS_MENU_Y," ");//液晶顯示字符串
- return;
- }
- len = strlen(selectedMenu->title);//計算字符串長度
- while(len--)
- {
- MyLCD_Show(6+len,POS_MENU_Y," ");//液晶顯示字符串
- }
- for(i=0;i<selectedMenu->itemCount;i++)//
- {
- len = strlen(*(selectedMenu->contentPtrArray))+1;//計算字符串長度
- while(len--)
- {
- MyLCD_Show(5+len,POS_MENU_Y+i+1," ");//液晶顯示字符串
- }
- }
- }
- #pragma diag_suppress 188
- #ifdef LCD_2_4
- #define MyLCD_ShowSetTime(m,n,p) LCD_ShowString(LCD_GetPos_X(24,m),LCD_GetPos_Y(24,n),p,24,false)
- #else
- #define MyLCD_ShowSetTime(m,n,p) LCD_ShowString(LCD_GetPos_X(12,m),LCD_GetPos_Y(12,n),p,12,false)
- #endif
- void keySetTime( void )
- {
- u8 delay=0;//延時跳出
- u8 setTimeFlag =0;//不進行設置時間
- u8 disPlace =0;
- u16 setYear,setMonth,setDay,setHour,setMin,setSec;
- u8 setFlag = 0;
- u8 i= 0;
-
- MyLCD_ShowSetTime(1,2,"Set Rtc ?");
- MyLCD_ShowSetTime(1,3,"K1:Yes K2:No");
- delay = 100; //延時選擇約2s
- while(delay)
- {
- My_KeyScan();//按鍵掃描
- if(KeyIsPressed(0))
- {
- setTimeFlag = 1;//進入時間設置
- LCD_Clear(Color16_BLACK);//清除液晶屏幕
- FRONT_COLOR = Color16_WHITE;//設置液晶前景色(畫筆顏色)
- MyLCD_ShowSetTime(0,0,"set RTC :");
- setYear = calendar.year;setMonth = calendar.month;setDay = calendar.day;
- setHour = calendar.hour;setMin = calendar.minute;setSec = calendar.second;
- break;
- }
- else if(KeyIsPress(1))
- {
- break;
- }
- delay--; //延時--
- delay_ms(10);
- }
-
- while(setTimeFlag)//時間設置 設置到最后一項后再點擊設置跳出
- {
- disPlace =1;//顯示位置依次增加
- FRONT_COLOR = Color16_WHITE;//設置液晶前景色(畫筆顏色)
- sprintf(dis0,"Year:%04d ",setYear);
- MyLCD_ShowSetTime(2,disPlace++,dis0);
-
- sprintf(dis0,"Mon :%02d ",setMonth);
- MyLCD_ShowSetTime(2,disPlace++,dis0);
-
- sprintf(dis0,"Day :%02d ",setDay);
- MyLCD_ShowSetTime(2,disPlace++,dis0);
-
- sprintf(dis0,"Hour:%02d ",setHour);
- MyLCD_ShowSetTime(2,disPlace++,dis0);
-
- sprintf(dis0,"Min :%02d ",setMin);
- MyLCD_ShowSetTime(2,disPlace++,dis0);
-
- sprintf(dis0,"Sec :%02d ",setSec);
- MyLCD_ShowSetTime(2,disPlace++,dis0);
- My_KeyScan();//按鍵掃描
-
- if(KeyIsPress(0)) //設置值鍵
- {
- setFlag++;//設置標志
- if(setFlag >= 7)
- {
- setFlag = 0;//設置結束
- setTimeFlag =0;//設置結束
- LCD_Clear(Color16_BLACK);//清除液晶屏幕
- FRONT_COLOR = Color16_WHITE;//設置液晶前景色(畫筆顏色)
- BACK_COLOR = Color16_BLACK;//設置液晶背景色(畫布顏色)
- break;
- }
- }
- else if(KeyIsPress(1)) //設置值鍵+
- {
- if(setFlag == 1)if(setYear < 2999){setYear = setYear +1;}//設置年 +1
- if(setFlag == 2)if(setMonth < 12 ){setMonth = setMonth +1;}//設置月
- if(setFlag == 3)if(setDay < 31 ){setDay = setDay +1;}//設置日
- // 不設置 周 周是自動的
- if(setFlag == 4)if(setHour < 23 ){setHour = setHour +1;}//設置時
- if(setFlag == 5)if(setMin < 59 ){setMin = setMin +1;}//設置分
- if(setFlag == 6)if(setSec < 59 ){setSec = setSec +1;}//設置秒
- }
- else if(KeyIsPress(2)) //設置值鍵-
- {
- if(setFlag == 1)if(setYear > 0 ){setYear = setYear -1;}//設置年 -1
- if(setFlag == 2)if(setMonth > 0 ){setMonth = setMonth -1;}//設置月
- if(setFlag == 3)if(setDay > 0 ){setDay = setDay -1;}//設置日
- if(setFlag == 4)if(setHour > 0 ){setHour = setHour -1;}//設置時
- if(setFlag == 5)if(setMin > 0 ){setMin = setMin -1;}//設置分
- if(setFlag == 6)if(setSec > 0 ){setSec = setSec -1;}//設置秒
- }
- My_RTC_Set(setYear,setMonth,setDay,setHour,setMin,setSec);
- FRONT_COLOR = Color16_RED;//設置液晶前景色(畫筆顏色)
- for(i=1;i<7;i++) //顯示設置位置
- {
- if(i == setFlag){MyLCD_ShowSetTime(1,i,">");}
- else MyLCD_ShowSetTime(1,i," ");
- }
- }
- LCD_Clear(Color16_BLACK);//清除液晶屏幕
- FRONT_COLOR = Color16_WHITE;//設置液晶前景色(畫筆顏色)
- BACK_COLOR = Color16_BLACK;//設置液晶背景色(畫布顏色)
- }
復制代碼
以上資料51hei下載:
STM32單片機刷卡簽到系統設計.7z
(11.67 MB, 下載次數: 71)
2021-4-4 03:51 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|