找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3034|回复: 3
打印 上一主题 下一主题
收起左侧

STM32单片机刷卡签到系统设计资料 源码原理图等

[复制链接]
跳转到指定楼层
楼主
电路原理图如下:


Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)


单片机源程序如下:
  1. #include "my_include.h"

  2. #define NUM_SECTOR_REC_RFID             0
  3. #define NUM_SECTOR_CARD                 1
  4. #define ADDR_FLASH_ID_BASE_RFID         FLASH_BASE_ADDR+(STM32_FLASH_SIZE - NUM_SECTOR_REC_RFID  - 1)*1024//保存刷卡用户记录的Flash地址
  5. #define ADDR_FLASH_ID_BASE_CARD         FLASH_BASE_ADDR+(STM32_FLASH_SIZE - NUM_SECTOR_CARD - 1)*1024//保存用户卡号的Flash地址
  6. #define MAX_NUM_USER_CARD               3//RFID最大用户数
  7. #define F_SIZE                          12//默认字体大小
  8. #define MyLCD_Show(m,n,p)               LCD_ShowString(LCD_GetPos_X(F_SIZE,m),LCD_GetPos_Y(F_SIZE,n),p,F_SIZE,false)
  9. #define MAX_MENU                        4//菜单条目总数
  10. #if F_SIZE==12
  11. #define START_LINE                      0
  12. #define POS_MENU_Y                      1//菜单显示起始行数
  13. #elif F_SIZE==24
  14. #define START_LINE                      1
  15. #define POS_MENU_Y                      4//菜单显示起始行数
  16. #endif

  17. u8 UID[4];//读取到的卡号
  18. u8 userCard[MAX_NUM_USER_CARD][4];//用户的卡号

  19. char disTemp[17];
  20. char dis0[64];//液晶显示暂存数组
  21. char dis1[64];//液晶显示暂存数组
  22. u32 ticks_rly=0,ticks_beep=0;//继电器和蜂鸣器动作及时
  23. bool beepAlarm = false;//蜂鸣器报警标志
  24. _record_obj saveRecord_CARD[MAX_NUM_USER_CARD+1];//最大刷卡用户数+未录入卡号(所有未录入卡号视为同一个)
  25. char *userName_CARD[MAX_NUM_USER_CARD+1] = {"RFID01","RFID02","RFID03","RFID未录入"};//用户名称
  26. u8 workState = 0;
  27. u8 availableCardCount = 0;


  28. void OnGetUartMessage(const _uart_msg_obj *uartMsgRec)
  29. {
  30.     char *strPtr;
  31.     if((strPtr = strstr(uartMsgRec->payload,"RTC"))!=NULL)//接收到rtc字符串
  32.     {
  33.         My_RTC_SetStr(strPtr+3);//设置实时时钟时间
  34.         USART_printf(USART1,"*Set RTC OK#\r\n");
  35.     }
  36.     else if(strstr(uartMsgRec->payload,"RELAY_KEY")!=NULL)//接收到字符串
  37.     {
  38.         ticks_rly = My_SysTick_GetTicks();//获取系统时间
  39.         MyLCD_Show(4,POS_MENU_Y+3,"远程操作成功    ");//液晶显示字符串
  40.         relay = RLY_ON;//继电器闭合
  41.         beepAlarm = false;//取消蜂鸣器报警
  42.         //**All notes can be deleted and modified**//
  43.     }
  44.     else if(strstr(uartMsgRec->payload,"BEEP_KEY")!=NULL)//接收到字符串
  45.     {
  46.         #pragma push
  47.         #pragma diag_suppress 188//暂时屏蔽#188-D: enumerated type mixed with another type警告
  48.         beepAlarm = !beepAlarm;//切换报警状态
  49.         #pragma pop
  50.         buzzer = beepAlarm;//蜂鸣器动作
  51.         USART_printf(USART1,"*Set BEEP OK#\r\n");
  52.     }
  53.     else if(strstr(uartMsgRec->payload,"GET_RECORD_RFID")!=NULL)//接收到字符串
  54.     {
  55.         u8 i;
  56.         for(i=0;i<MAX_NUM_USER_CARD+1;i++)
  57.         {
  58.             sprintf(dis0,"*REC_CARD_U%dC%dT%d#\r\n",i,saveRecord_CARD[i].count,saveRecord_CARD[i].timeCount);
  59.             USART_printf(USART1,dis0);
  60.         }
  61.     }
  62.     else
  63.     {
  64.         USART_printf(USART1,"*CMD ERROR#\r\n");
  65.     }
  66. }

  67. void keySetTime( void );
  68. int main(void)
  69. {
  70.     u8 index_CARD;//当前选择的用户编号
  71.     u8 sec_now = 0;//当前时间的秒钟数
  72.     u8 day_now = 0;//当前日期的天数
  73.     u8 i;
  74.    
  75.     My_LED_Init();//LED初始化
  76.     My_KEY_Init();//按键初始化
  77.     USARTx_Init(USART1,9600);//串口初始化为9600
  78. //    USARTx_Init(USART2,9600);//串口初始化为9600
  79.     relay = RLY_ON;//继电器闭合
  80.     buzzer = BEEP_ON;//蜂鸣器报警
  81.     LCD_Init();//液晶初始化
  82.     relay = RLY_OFF;//继电器断开
  83.     buzzer = BEEP_OFF;//蜂鸣器取消报警
  84.     LCD_Clear(Color16_BLACK);//清除液晶屏幕
  85.     FRONT_COLOR = Color16_WHITE;//设置液晶前景色(画笔颜色)
  86.     BACK_COLOR = Color16_BLACK;//设置液晶背景色(画布颜色)

  87.     My_RTC_Init(false);//RTC初始化(不使能闹钟)
  88.     keySetTime();//进入按键设置时钟 如果是有无线通信的情况下 该按键设置可以取消

  89.     MyLCD_Show(4,0,"智能打卡系统");//液晶显示字符串
  90.     MyLCD_Show(4,2+START_LINE,"正在初始化...");//液晶显示字符串
  91.     My_RC522_Init();
  92.    
  93.     My_STMFlash_SectorSaveInit(NUM_SECTOR_REC_RFID,ADDR_FLASH_ID_BASE_RFID,(u16 *)saveRecord_CARD,sizeof(saveRecord_CARD)/2);//读取保存的RFID历史记录数据
  94.     for(i=0;i<MAX_NUM_USER_CARD+1;i++)
  95.     {
  96.         if(saveRecord_CARD[i].count==0xffff)
  97.         {
  98.             saveRecord_CARD[i].timeCount=0;//记录时间戳默认为0(即1970年1月1日00时00分00秒)
  99.             saveRecord_CARD[i].count=0;//记录签到次数默认为0
  100.             saveRecord_CARD[i].userID = i;//用户ID按照数组顺序赋值
  101.             saveRecord_CARD[i].type = 1;
  102.         }
  103.     }
  104.     My_STMFlash_SectorSaveInit(NUM_SECTOR_CARD,ADDR_FLASH_ID_BASE_CARD,(u16 *)userCard,sizeof(userCard)/2);//读取保存的用户卡号数据
  105.     for(i=0;i<MAX_NUM_USER_CARD;i++)//将无效卡号清零
  106.     {
  107.         if(*((u32 *)userCard[i])==0xffffffff)
  108.         {
  109.             *((u32 *)userCard[i])=0;//卡号为0是为无效卡
  110.         }
  111.         //**All notes can be deleted and modified**//
  112.     }
  113.     availableCardCount = MAX_NUM_USER_CARD-availableCardCount;
  114.    
  115.     MyLCD_Show(4,2+START_LINE,"初始化成功      ");//液晶显示字符串
  116.     sprintf(disTemp,"RFID总数:%d",availableCardCount);
  117.     MyLCD_Show(4,3+START_LINE,disTemp);//液晶显示字符串
  118.    
  119.     delay_ms(1000);
  120.     MyLCD_Show(4,2+START_LINE,"                ");//液晶显示字符串
  121.     MyLCD_Show(4,3+START_LINE,"                ");//液晶显示字符串
  122.     MyLCD_Show(4,4+START_LINE,"                ");//液晶显示字符串
  123.     MyLCD_Show(4,POS_MENU_Y,"  欢迎使用         ");//液晶显示字符串
  124. //FINGERPRINT_Cmd_Delete_All_Model();
  125.     My_Menu_Init();
  126.    
  127.      while(1)
  128.     {
  129.         My_KeyScan();//按键扫描
  130.         
  131.         
  132.         switch(My_Menu_GetSelectID())//获取菜单ID
  133.         {
  134.             case MENU_ID_ADD_RFID:////////////////////////////////////////////////添加卡号
  135.                 {
  136.                     switch(workState)
  137.                     {
  138.                         case 0:
  139.                             for(index_CARD=0;index_CARD<MAX_NUM_USER_CARD;index_CARD++)//计算有效卡号数量
  140.                             {
  141.                                 if(*((u32 *)userCard[index_CARD])==0)//卡号为0是为无效卡
  142.                                 {
  143.                                     break;
  144.                                 }
  145.                             }
  146.                             if(index_CARD>=MAX_NUM_USER_CARD)//卡号索引大于等于最大用户数
  147.                             {
  148.                                 MyLCD_Show(4,POS_MENU_Y+2,"RFID库已满!");//液晶显示字符串
  149.                                 delay_ms(1000);
  150.                                 MyLCD_Show(4,POS_MENU_Y+2,"            ");//液晶显示字符串
  151.                                 My_Menu_Back(true);
  152.                                 break;
  153.                             }
  154.                             MyLCD_Show(5,POS_MENU_Y+2,"选择编号        ");//液晶显示字符串
  155.                             sprintf(disTemp,"    %s        ",userName_CARD[index_CARD]);//显示ID号
  156.                             MyLCD_Show(4,POS_MENU_Y+3,disTemp);
  157.                             workState++;//进入下一个状态
  158.                             break;
  159.                         case 1:
  160.                             if(KeyIsPress(key_up))//按下了向上键
  161.                             {
  162.                                 index_CARD++;//ID号加
  163.                                 index_CARD %= MAX_NUM_USER_CARD;//最大用户数
  164.                                 sprintf(disTemp,"    %s        ",userName_CARD[index_CARD]);//显示ID号
  165.                                 MyLCD_Show(4,POS_MENU_Y+3,disTemp);
  166.                             }
  167.                             if(KeyIsPress(key_down))//按下了向下键
  168.                             {
  169.                                 //**All notes can be deleted and modified**//
  170.                                 sprintf(disTemp,"    %s        ",userName_CARD[index_CARD]);//显示ID号
  171.                                 MyLCD_Show(4,POS_MENU_Y+3,disTemp);
  172.                             }
  173.                             if(KeyIsPress(key_ok))//按下了OK键
  174.                             {
  175.                                 if(*((u32 *)userCard[index_CARD])==0)//卡号为0是为无效卡
  176.                                 {
  177.                                     workState++;//进入下一个状态
  178.                                 }
  179.                                 else
  180.                                 {
  181.                                     sprintf(disTemp,"%s已存在!  ",userName_CARD[index_CARD]);//显示ID号
  182.                                     MyLCD_Show(4,POS_MENU_Y+3,"                ");
  183.                                     MyLCD_Show(4,POS_MENU_Y+2,disTemp);
  184.                                     delay_ms(1000);
  185.                                     MyLCD_Show(4,POS_MENU_Y+2,"            ");
  186.                                     //**All notes can be deleted and modified**//
  187.                                 }
  188.                             }
  189.                             break;
  190.                         case 2:
  191.                             MyLCD_Show(5,POS_MENU_Y+2,"请刷卡...        ");//液晶显示字符串
  192.                             MyLCD_Show(5,POS_MENU_Y+3,"                 ");//液晶显示字符串
  193.                             workState++;//进入下一个状态
  194.                             break;
  195.                         case 3:
  196.                             if(My_RC522_ReadCardID(UID,true))//读取到一次卡号
  197.                             {
  198.                                 buzzer = BEEP_ON;
  199.                                 delay_ms(100);
  200.                                 buzzer = BEEP_OFF;
  201.                                 for(i=0;i<MAX_NUM_USER_CARD;i++)//对比所有的用户卡号
  202.                                 {
  203.                                     if(My_memcmp(UID,userCard[i],4))//与用户卡号相同
  204.                                     {
  205.                                         break;
  206.                                     }
  207.                                 }
  208.                                 if(i<MAX_NUM_USER_CARD)//与其中一个用户卡号相同
  209.                                 {
  210.                                     MyLCD_Show(5,POS_MENU_Y+2,"卡号已存在!    ");//液晶显示字符串
  211.                                     delay_ms(900);
  212.                                     MyLCD_Show(5,POS_MENU_Y+2,"                ");//液晶显示字符串
  213.                                     workState--;//返回上一个状态
  214.                                 }
  215.                                 else//与所有的用户卡号都不相同
  216.                                 {
  217.                                     MyLCD_Show(5,POS_MENU_Y+2,"刷卡成功...    ");//液晶显示字符串
  218.                                     delay_ms(400);
  219.                                     //**All notes can be deleted and modified**//
  220.                                 }
  221.                             }
  222.                             break;
  223.                         case 4:
  224.                             MyLCD_Show(5,POS_MENU_Y+2,"请再刷一次...    ");//液晶显示字符串
  225.                             workState++;//进入下一个状态
  226.                             break;
  227.                         case 5:
  228.                             if(My_RC522_ReadCardID(userCard[index_CARD],true))//读取到一次卡号
  229.                             {
  230.                                 buzzer = BEEP_ON;
  231.                                 delay_ms(100);
  232.                                 buzzer = BEEP_OFF;
  233.                                 if(My_memcmp(userCard[index_CARD],UID,4))//对比两次读取的卡号是否相同
  234.                                 {
  235.                                     MyLCD_Show(5,POS_MENU_Y+2,"刷卡成功!    ");//液晶显示字符串
  236.                                     My_STMFlash_SaveUseSector(NUM_SECTOR_CARD);//保存数据到用户RFID卡号位置
  237.                                     workState++;//进入下一个状态
  238.                                     delay_ms(900);
  239.                                 }
  240.                                 else
  241.                                 {
  242.                                     MyLCD_Show(5,POS_MENU_Y+2,"卡号不匹配!    ");//液晶显示字符串
  243.                                     MyLCD_Show(5,POS_MENU_Y+3,"请再次刷卡...  ");//液晶显示字符串
  244.                                     *((u32 *)userCard[index_CARD])=0;//卡号清零
  245.                                     //**All notes can be deleted and modified**//
  246.                                 }
  247.                             }
  248.                             break;
  249.                         case 6:
  250.                             MyLCD_Show(5,POS_MENU_Y+2,"             ");//液晶显示字符串
  251.                             My_Menu_Exit();//退出菜单
  252.                             workState=0;//回到初始状态
  253.                             break;
  254.                         default:break;
  255.                     }
  256.                 }
  257.                 break;
  258.             case MENU_ID_DEL_RFID:////////////////////////////////////////////////删除卡号
  259.                 {
  260.                     switch(workState)
  261.                     {
  262.                         case 0:
  263.                             if(index_CARD>=MAX_NUM_USER_CARD)
  264.                             {
  265.                                 index_CARD = MAX_NUM_USER_CARD-1;//指向最大值
  266.                             }
  267.                             MyLCD_Show(5,POS_MENU_Y+2,"选择编号        ");//液晶显示字符串
  268.                             sprintf(disTemp,"    %s        ",userName_CARD[index_CARD]);//显示ID号
  269.                             MyLCD_Show(4,POS_MENU_Y+3,disTemp);
  270.                             workState++;//进入下一个状态
  271.                             break;
  272.                         case 1:
  273.                             if(KeyIsPress(key_up))//按下了向上键
  274.                             {
  275.                                 index_CARD++;//ID号加
  276.                                 index_CARD %= MAX_NUM_USER_CARD;//最大用户数
  277.                                 sprintf(disTemp,"    %s        ",userName_CARD[index_CARD]);//显示ID号
  278.                                 MyLCD_Show(4,POS_MENU_Y+3,disTemp);
  279.                             }
  280.                             if(KeyIsPress(key_down))
  281.                             {
  282.                                 if(index_CARD)//索引号大于0
  283.                                 {
  284.                                     index_CARD--;//ID号减
  285.                                 }
  286.                                 else
  287.                                 {
  288.                                     index_CARD = MAX_NUM_USER_CARD-1;//指向最大值
  289.                                 }
  290.                                 sprintf(disTemp,"    %s        ",userName_CARD[index_CARD]);//显示ID号
  291.                                 MyLCD_Show(4,POS_MENU_Y+3,disTemp);
  292.                             }
  293.                             if(KeyIsPress(key_ok))//按下了OK键
  294.                             {
  295.                                 if(*((u32 *)userCard[index_CARD])==0)//卡号为0是为无效卡
  296.                                 {
  297.                                     sprintf(disTemp,"%s不存在!",userName_CARD[index_CARD]);
  298.                                     MyLCD_Show(5,POS_MENU_Y+2,disTemp);//液晶显示字符串
  299.                                     MyLCD_Show(4,POS_MENU_Y+3,"                ");//液晶显示字符串
  300.                                     //**All notes can be deleted and modified**//
  301.                                 }
  302.                                 else
  303.                                 {
  304.                                     sprintf(disTemp,"删除%s卡号?",userName_CARD[index_CARD]);
  305.                                     MyLCD_Show(4,POS_MENU_Y+2,disTemp);//液晶显示字符串
  306.                                     MyLCD_Show(4,POS_MENU_Y+3,"                ");//液晶显示字符串
  307.                                     //**All notes can be deleted and modified**//
  308.                                 }
  309.                                 delay_ms(500);
  310.                             }
  311.                             break;
  312.                         case 2:
  313.                             if(KeyIsPress(key_ok))//按下了OK键
  314.                             {
  315.                                 MyLCD_Show(4,POS_MENU_Y+2,"卡号已删除!    ");//液晶显示字符串
  316.                                 MyLCD_Show(4,POS_MENU_Y+3,"                ");//液晶显示字符串
  317.                                 saveRecord_CARD[index_CARD].timeCount = 0;//默认为0
  318.                                 saveRecord_CARD[index_CARD].count=0;//计数值清零
  319.                                 My_STMFlash_SaveUseSector(NUM_SECTOR_REC_RFID);//保存数据到RFID历史记录位置
  320.                                 *((u32 *)userCard[index_CARD])=0;//卡号清零
  321.                                 My_STMFlash_SaveUseSector(NUM_SECTOR_CARD);//保存数据到用户RFID卡号位置
  322.                                 workState++;//进入下一个状态
  323.                                 delay_ms(500);
  324.                             }
  325.                             break;
  326.                         case 3:
  327.                             MyLCD_Show(4,POS_MENU_Y+2,"                ");//液晶显示字符串
  328.                             My_Menu_Exit();//退出菜单
  329.                             workState=0;//回到初始状态
  330.                             break;
  331.                         default:break;
  332.                     }
  333.                 }
  334.                 break;
  335.             case MENU_ID_CLR_RFID:////////////////////////////////////////////////清空卡号
  336.                 {
  337.                     switch(workState)
  338.                     {
  339.                         case 0:
  340.                             MyLCD_Show(4,POS_MENU_Y+1,"                ");//液晶显示字符串
  341.                             MyLCD_Show(4,POS_MENU_Y+2,"确认清空卡号?  ");//液晶显示字符串
  342.                             MyLCD_Show(4,POS_MENU_Y+3,"                ");//液晶显示字符串
  343.                             workState++;//进入下一个状态
  344.                             break;
  345.                         case 1:
  346.                             if(KeyIsPress(key_ok))//按下了OK键
  347.                             {
  348.                                 MyLCD_Show(4,POS_MENU_Y+2,"卡号已清空!  ");//液晶显示字符串
  349.                                 //**All notes can be deleted and modified**//
  350.                                 My_STMFlash_SaveUseSector(NUM_SECTOR_REC_RFID);//保存数据到RFID历史记录位置
  351.                                 for(i=0;i<MAX_NUM_USER_CARD;i++)//清除每一个RFID卡号
  352.                                 {
  353.                                     *((u32 *)userCard[i])=0;//卡号为0是为无效卡
  354.                                 }
  355.                                 My_STMFlash_SaveUseSector(NUM_SECTOR_CARD);//保存数据到flash
  356.                                 workState++;//进入下一个状态
  357.                                 delay_ms(800);
  358.                             }
  359.                             break;
  360.                         case 2:
  361.                             MyLCD_Show(4,POS_MENU_Y+2,"                ");//液晶显示字符串
  362.                             My_Menu_Exit();//退出菜单
  363.                             workState=0;//回到初始状态
  364.                             break;
  365.                         default:break;
  366.                     }
  367.                 }
  368.                 break;
  369.             case MENU_ID_HISTORY_RFID:////////////////////////////////////////////RFID历史记录
  370.                 {
  371.                     switch(workState)
  372.                     {
  373.                         case 0:
  374.                             for(i=0;i<MAX_NUM_USER_CARD+1;i++)//遍历每一个RFID历史记录
  375.                             {
  376.                                 _calendar_obj cal_save;
  377.                                 My_RTC_IntegerToCalendar(saveRecord_CARD[i].timeCount,&cal_save);//将RFID历史记录的时间数据转换为日历结构体
  378.                                 sprintf(dis0,"%s   %d次        ",userName_CARD[i],saveRecord_CARD[i].count);//数据格式转换
  379.                                 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);
  380.                                 MyLCD_Show(0,POS_MENU_Y+(i<<1)+1,dis0);//液晶显示字符串
  381.                                 MyLCD_Show(0,POS_MENU_Y+(i<<1)+2,dis1);//液晶显示字符串
  382.                             }
  383.                             workState++;//进入下一个状态
  384.                             break;
  385.                         case 1:
  386.                             if(KeyIsPress(key_set_back))//按下了返回按键
  387.                             {
  388.                                 for(i=0;i<MAX_NUM_USER_CARD+1;i++)//清除每一条历史纪录的显示
  389.                                 {
  390.                                     MyLCD_Show(0,POS_MENU_Y+(i<<1)+1,"                      ");//液晶显示字符串
  391.                                     MyLCD_Show(0,POS_MENU_Y+(i<<1)+2,"                      ");//液晶显示字符串
  392.                                 }
  393.                             }
  394.                             break;
  395.                         default:break;
  396.                     }
  397.                 }
  398.                 break;
  399.             default:
  400.                 break;
  401.         }
  402.         My_Menu_Contrl();//控制菜单的上下移动及进入和返回
  403.         
  404.         if(My_Menu_GetSelectID() == 0)//未进入菜单
  405.         {
  406.             if(KeyIsPress(key_up))//如果按下了继电器控制按键
  407.             {
  408.                 ticks_rly = My_SysTick_GetTicks();//获取系统时间
  409.                 relay = RLY_ON;//继电器闭合
  410.                 beepAlarm = false;//取消蜂鸣器报警
  411.                 buzzer = BEEP_OFF;//取消蜂鸣器报警
  412.             }
  413.             if(KeyIsPress(key_down))//如果按下了报警按键
  414.             {
  415.                 #pragma push
  416.                 #pragma diag_suppress 188//暂时屏蔽#188-D: enumerated type mixed with another type警告
  417.                 beepAlarm = !beepAlarm;//切换报警状态
  418.                 #pragma pop
  419.                 buzzer = beepAlarm;//蜂鸣器动作
  420.             }
  421.         // 寻卡
  422.             if(My_RC522_ReadCardID(UID,true))
  423.             {
  424.                 for(index_CARD=0;index_CARD<MAX_NUM_USER_CARD;index_CARD++)//对比每一个RFID卡号
  425.                 {
  426.                     if(My_memcmp(UID,userCard[index_CARD],4))//如果卡号相同
  427.                     {
  428.                         break;
  429.                     }
  430.                 }
  431.                 buzzer = !buzzer;
  432.                 delay_ms(100);
  433.                 buzzer = !buzzer;
  434.                 saveRecord_CARD[index_CARD].timeCount = My_RTC_CalendarToInteger(&calendar);//将当前RTC时间转换为整数
  435.                 saveRecord_CARD[index_CARD].count++;//计数值+1
  436.                 if(index_CARD<MAX_NUM_USER_CARD)//如果读取到的卡号与其中一个用户卡号相同
  437.                 {
  438.                     ticks_rly = My_SysTick_GetTicks();//获取系统时间
  439.                     beepAlarm = false;//取消蜂鸣器报警
  440.                     relay = RLY_ON;//继电器闭合
  441.                     buzzer = BEEP_OFF;//取消蜂鸣器报警
  442.                     FRONT_COLOR = Color16_GREEN;//将液晶前景色(画笔颜色)设置为绿色
  443.                     sprintf(disTemp,"%s  %d次",userName_CARD[index_CARD],saveRecord_CARD[index_CARD].count);
  444.                     MyLCD_Show(4,POS_MENU_Y+3,"刷卡成功!");//液晶显示字符串
  445.                 }
  446.                 else//如果读取到的卡号与所有用户卡号都不相同
  447.                 {
  448.                     ticks_beep = My_SysTick_GetTicks();//获取系统时间
  449.                     buzzer = BEEP_ON;//蜂鸣器报警
  450.                     relay = RLY_OFF;//继电器断开
  451.                     FRONT_COLOR = Color16_RED;//将液晶前景色(画笔颜色)设置为红色
  452.                     sprintf(disTemp,"RFID未录入 %d次",saveRecord_CARD[index_CARD].count);
  453.                 }
  454.                 sprintf(dis0,"*REC_CARD_U%dC%dT%d#\r\n",index_CARD,saveRecord_CARD[index_CARD].count,saveRecord_CARD[index_CARD].timeCount);
  455.                 USART_printf(USART1,dis0);
  456.                 MyLCD_Show(4,POS_MENU_Y+2,disTemp);//液晶显示字符串
  457.                 sprintf(dis0,"%04d-%02d-%02d",calendar.year,calendar.month,calendar.day);
  458.                 sprintf(dis1,"%02d:%02d:%02d %d",calendar.hour,calendar.minute,calendar.second,calendar.week);
  459.                 MyLCD_Show(4,POS_MENU_Y+4,dis0);//液晶显示字符串
  460.                 MyLCD_Show(4,POS_MENU_Y+5,dis1);//液晶显示字符串
  461.                 //**All notes can be deleted and modified**//
  462.                 delay_ms(1800);//防止手指松开时的误判断
  463.                 MyLCD_Show(0,POS_MENU_Y+2,"                      ");//液晶显示字符串
  464.                 MyLCD_Show(0,POS_MENU_Y+3,"                      ");//液晶显示字符串
  465.                 MyLCD_Show(0,POS_MENU_Y+4,"                      ");//液晶显示字符串
  466.                 MyLCD_Show(0,POS_MENU_Y+5,"                      ");//液晶显示字符串
  467.             }
  468.         }
  469.         if(ticks_rly>0 && SysTickSecPassed(ticks_rly,3))//时间过去3秒钟
  470.         {
  471.             ticks_rly = 0;
  472.             relay = RLY_OFF;//继电器断开
  473.         }
  474.         if(ticks_beep>0 && SysTickSecPassed(ticks_beep,3))//时间过去3秒钟
  475.         {
  476.             ticks_beep = 0;
  477.             buzzer = BEEP_OFF;//取消蜂鸣器报警
  478.         }
  479.         
  480.         if(day_now != calendar.day)
  481.         {
  482.             day_now = calendar.day;
  483.             sprintf(dis0,"%04d-%02d-%02d",calendar.year,calendar.month,calendar.day);
  484.             #if START_LINE==1
  485.             MyLCD_Show(5,1,dis0);//液晶显示字符串
  486.             #else
  487.             MyLCD_Show(2,0,dis0+5);//液晶显示字符串
  488.             MyLCD_Show(7,0,"   ");//液晶显示字符串
  489.             #endif
  490.         }
  491.         if(sec_now != calendar.second)
  492.         {
  493.             sec_now = calendar.second;
  494.             sprintf(dis1,"%02d:%02d:%02d %d",calendar.hour,calendar.minute,calendar.second,calendar.week);
  495.             #if START_LINE==1
  496.             MyLCD_Show(5,2,dis1);//液晶显示字符串
  497.             #else
  498.             MyLCD_Show(9,0,dis1);//液晶显示字符串
  499.             #endif
  500.         }
  501.         if(beepAlarm)
  502.         {
  503.             relay = RLY_OFF;//继电器断开
  504.             buzzer = BEEP_ON;
  505.         }
  506.         My_UartMessage_Process();//处理串口数据
  507.     }
  508. }

  509. void My_Menu_Contrl(void)
  510. {
  511.     if(selectedMenu!=NULL)
  512.     {
  513.         if(KeyIsPress(key_up))//按下了向上键
  514.         {
  515.             My_Menu_SelectUp(true);
  516.         }
  517.         if(KeyIsPress(key_down))//按下了向上键
  518.         {
  519.             My_Menu_SelectDown(true);
  520.         }
  521.         if(KeyIsPress(key_ok))//按下了OK键
  522.         {
  523.             My_Menu_Into(true);
  524.         }
  525.         if(KeyIsPress(key_set_back))
  526.         {
  527.             MyLCD_Show(0,POS_MENU_Y+1,"                      ");//液晶显示字符串
  528.             MyLCD_Show(0,POS_MENU_Y+2,"                      ");//液晶显示字符串
  529.             MyLCD_Show(0,POS_MENU_Y+3,"                      ");//液晶显示字符串
  530.             workState=0;//回到初始状态
  531.             My_Menu_Back(true);
  532.         }
  533.     }
  534.     else if(KeyIsPress(key_set_back))
  535.     {
  536.         My_Menu_Into(true);
  537.     }
  538. }
  539. void My_Menu_Display(void)
  540. {
  541.     u8 i;
  542.     if(selectedMenu==NULL)//如果已经退出菜单
  543.     {
  544.         MyLCD_Show(4,POS_MENU_Y,"  欢迎使用         ");//液晶显示字符串
  545.         return;
  546.     }
  547.     if(My_Menu_UnderBottom())
  548.     {
  549.         MyLCD_Show(6,POS_MENU_Y,*(selectedMenu->contentPtrArray+selectedMenu->selectIndex));//液晶显示字符串
  550.         return;
  551.     }
  552.     MyLCD_Show(6,POS_MENU_Y,selectedMenu->title);//液晶显示字符串
  553.     for(i=0;i<selectedMenu->itemCount;i++)
  554.     {
  555.         if(i==selectedMenu->selectIndex)
  556.         {
  557.             FRONT_COLOR = Color16_LIGHTBLUE;//设置前景色(画笔颜色)为浅蓝色
  558.             MyLCD_Show(5,i+POS_MENU_Y+1,">");//液晶显示字符串
  559.             MyLCD_Show(6,POS_MENU_Y+1+i,*(selectedMenu->contentPtrArray+i));//液晶显示字符串
  560.             FRONT_COLOR = Color16_WHITE;//设置前景色(画笔颜色)为白色
  561.         }
  562.         else
  563.         {
  564.             MyLCD_Show(5,i+POS_MENU_Y+1," ");//液晶显示字符串
  565.             MyLCD_Show(6,POS_MENU_Y+1+i,*(selectedMenu->contentPtrArray+i));//液晶显示字符串
  566.         }
  567.     }
  568. }
  569. void My_Menu_Clear(void)
  570. {
  571.     u8 i,len;
  572.     if(selectedMenu==NULL || My_Menu_UnderBottom())//如果推出了菜单或当前在菜单的最底层
  573.     {
  574.         MyLCD_Show(4,POS_MENU_Y,"               ");//液晶显示字符串
  575.         return;
  576.     }
  577.     len = strlen(selectedMenu->title);//计算字符串长度
  578.     while(len--)
  579.     {
  580.         MyLCD_Show(6+len,POS_MENU_Y," ");//液晶显示字符串
  581.     }
  582.     for(i=0;i<selectedMenu->itemCount;i++)//
  583.     {
  584.         len = strlen(*(selectedMenu->contentPtrArray))+1;//计算字符串长度
  585.         while(len--)
  586.         {
  587.             MyLCD_Show(5+len,POS_MENU_Y+i+1," ");//液晶显示字符串
  588.         }
  589.     }
  590. }

  591. #pragma diag_suppress 188
  592. #ifdef LCD_2_4
  593.     #define MyLCD_ShowSetTime(m,n,p) LCD_ShowString(LCD_GetPos_X(24,m),LCD_GetPos_Y(24,n),p,24,false)
  594. #else
  595.     #define MyLCD_ShowSetTime(m,n,p) LCD_ShowString(LCD_GetPos_X(12,m),LCD_GetPos_Y(12,n),p,12,false)
  596. #endif
  597. void keySetTime( void )
  598. {
  599.     u8 delay=0;//延时跳出
  600.     u8 setTimeFlag =0;//不进行设置时间
  601.     u8 disPlace =0;
  602.     u16 setYear,setMonth,setDay,setHour,setMin,setSec;
  603.     u8 setFlag = 0;
  604.     u8 i= 0;
  605.    
  606.     MyLCD_ShowSetTime(1,2,"Set Rtc ?");
  607.     MyLCD_ShowSetTime(1,3,"K1:Yes K2:No");
  608.     delay = 100; //延时选择约2s
  609.     while(delay)
  610.     {
  611.         My_KeyScan();//按键扫描
  612.         if(KeyIsPressed(0))
  613.         {
  614.             setTimeFlag = 1;//进入时间设置
  615.             LCD_Clear(Color16_BLACK);//清除液晶屏幕
  616.             FRONT_COLOR = Color16_WHITE;//设置液晶前景色(画笔颜色)
  617.             MyLCD_ShowSetTime(0,0,"set RTC :");
  618.             setYear = calendar.year;setMonth = calendar.month;setDay = calendar.day;
  619.             setHour = calendar.hour;setMin = calendar.minute;setSec = calendar.second;
  620.             break;
  621.         }
  622.         else if(KeyIsPress(1))
  623.         {
  624.             break;
  625.         }
  626.         delay--; //延时--
  627.         delay_ms(10);
  628.     }
  629.    
  630.     while(setTimeFlag)//时间设置 设置到最后一项后再点击设置跳出
  631.     {
  632.         disPlace =1;//显示位置依次增加
  633.         FRONT_COLOR = Color16_WHITE;//设置液晶前景色(画笔颜色)
  634.         sprintf(dis0,"Year:%04d ",setYear);
  635.         MyLCD_ShowSetTime(2,disPlace++,dis0);
  636.         
  637.         sprintf(dis0,"Mon :%02d ",setMonth);
  638.         MyLCD_ShowSetTime(2,disPlace++,dis0);
  639.         
  640.         sprintf(dis0,"Day :%02d ",setDay);
  641.         MyLCD_ShowSetTime(2,disPlace++,dis0);
  642.         
  643.         sprintf(dis0,"Hour:%02d ",setHour);
  644.         MyLCD_ShowSetTime(2,disPlace++,dis0);
  645.         
  646.         sprintf(dis0,"Min :%02d ",setMin);
  647.         MyLCD_ShowSetTime(2,disPlace++,dis0);
  648.         
  649.         sprintf(dis0,"Sec :%02d ",setSec);
  650.         MyLCD_ShowSetTime(2,disPlace++,dis0);

  651.         My_KeyScan();//按键扫描
  652.         
  653.             if(KeyIsPress(0)) //设置值键
  654.             {
  655.                 setFlag++;//设置标志
  656.                 if(setFlag >= 7)
  657.                 {
  658.                     setFlag = 0;//设置结束
  659.                     setTimeFlag =0;//设置结束
  660.                     LCD_Clear(Color16_BLACK);//清除液晶屏幕
  661.                     FRONT_COLOR = Color16_WHITE;//设置液晶前景色(画笔颜色)
  662.                     BACK_COLOR = Color16_BLACK;//设置液晶背景色(画布颜色)
  663.                     break;
  664.                 }
  665.             }
  666.             else if(KeyIsPress(1)) //设置值键+
  667.             {
  668.                 if(setFlag == 1)if(setYear  < 2999){setYear  =  setYear     +1;}//设置年   +1
  669.                 if(setFlag == 2)if(setMonth < 12  ){setMonth =  setMonth    +1;}//设置月
  670.                 if(setFlag == 3)if(setDay   < 31  ){setDay   =  setDay      +1;}//设置日
  671.                 //  不设置 周 周是自动的
  672.                 if(setFlag == 4)if(setHour  < 23  ){setHour    = setHour   +1;}//设置时
  673.                 if(setFlag == 5)if(setMin   < 59  ){setMin     = setMin    +1;}//设置分
  674.                 if(setFlag == 6)if(setSec   < 59  ){setSec     = setSec    +1;}//设置秒
  675.             }
  676.             else if(KeyIsPress(2)) //设置值键-
  677.             {
  678.                 if(setFlag == 1)if(setYear  > 0  ){setYear  = setYear   -1;}//设置年  -1
  679.                 if(setFlag == 2)if(setMonth > 0  ){setMonth = setMonth  -1;}//设置月
  680.                 if(setFlag == 3)if(setDay   > 0  ){setDay   = setDay    -1;}//设置日
  681.                 if(setFlag == 4)if(setHour  > 0  ){setHour  = setHour   -1;}//设置时
  682.                 if(setFlag == 5)if(setMin   > 0  ){setMin   = setMin    -1;}//设置分
  683.                 if(setFlag == 6)if(setSec   > 0  ){setSec   = setSec    -1;}//设置秒
  684.             }
  685.             My_RTC_Set(setYear,setMonth,setDay,setHour,setMin,setSec);
  686.             FRONT_COLOR = Color16_RED;//设置液晶前景色(画笔颜色)
  687.             for(i=1;i<7;i++) //显示设置位置
  688.             {
  689.                 if(i == setFlag){MyLCD_ShowSetTime(1,i,">");}
  690.                 else MyLCD_ShowSetTime(1,i," ");
  691.             }
  692.     }
  693.     LCD_Clear(Color16_BLACK);//清除液晶屏幕
  694.     FRONT_COLOR = Color16_WHITE;//设置液晶前景色(画笔颜色)
  695.     BACK_COLOR = Color16_BLACK;//设置液晶背景色(画布颜色)
  696. }
复制代码

以上资料51hei下载:
STM32单片机刷卡签到系统设计.7z (11.67 MB, 下载次数: 71)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:1024398 发表于 2022-5-6 20:30 | 只看该作者
您好,麻烦问一下,我用网络调试助手链接到了esp8266,但是向他发送RTC,设备上没有反应,是为什么
回复

使用道具 举报

板凳
ID:1024398 发表于 2022-5-8 04:34 | 只看该作者
问一下,TFT是多大的
回复

使用道具 举报

地板
ID:1024398 发表于 2022-5-9 17:28 | 只看该作者

2.4英寸的,
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表