找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 981|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

STM32-2.8寸TFTLCD屏虛擬鍵盤觸摸密碼鎖程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1023151 發(fā)表于 2024-10-25 16:48 | 只看該作者 回帖獎勵(lì) |倒序?yàn)g覽 |閱讀模式
  1. #include "sys.h"
  2. #include "delay.h"
  3. #include "usart.h"
  4. #include "lcd.h"
  5. #include "key.h"
  6. #include "touch.h"         
  7. #include "malloc.h"
  8. #include "usmart.h"  
  9. #include "sdio_sdcard.h"   
  10. #include "w25qxx.h"   
  11. #include "ff.h"  
  12. #include "exfuns.h"   
  13. #include "fontupd.h"
  14. #include "text.h"        
  15. #include "led.h"
  16. #include "bjdj.h"
  17. #include "timer.h"
  18. #include "usart3.h"
  19. #include "gizwits_product.h"
  20. dataPoint_t currentDataPoint;
  21. u8 wifi_sta=0;
  22. //協(xié)議初始化
  23. void Gizwits_Init(void)
  24. {        
  25.         TIM3_Int_Init(9,7199);//1MS系統(tǒng)定時(shí)
  26.     usart3_init(9600);//WIFI初始化
  27.         memset((uint8_t*)&currentDataPoint, 0, sizeof(dataPoint_t));//設(shè)備狀態(tài)結(jié)構(gòu)體初始化
  28.         gizwitsInit();//緩沖區(qū)初始化
  29. }
  30. u8** kbd_tbl;
  31. const  u8* kbd_delFR[15]={"密碼",":","清空","1","2","3","4","5","6","7","8","9","DEL","0","Enter",};//按鍵表
  32. u16 flag=0;
  33. u8 passnum[3]={4,5,6};
  34. void Del_FR(void);        //前進(jìn)
  35. void AS608_load_keyboard(u16 x,u16 y,u8 **kbtbl);//加載虛擬鍵盤
  36. u8  AS608_get_keynum(u16 x,u16 y);//獲取鍵盤數(shù)
  37. u16 GET_NUM(void);//獲取數(shù)值

  38. int main(void)
  39. {   
  40.         u8 key_num;
  41.         int key;        
  42.         u16 num,pass_num=258;
  43.         u8 wifi_con=0;//記錄wifi連接狀態(tài) 1:連接 0:斷開
  44.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設(shè)置系統(tǒng)中斷優(yōu)先級分組2
  45.         delay_init();          //初始化延時(shí)函數(shù)
  46.         uart_init(115200);        //初始化串口1波特率為115200,用于支持USMART
  47.         KEY_Init();                                        //按鍵初始化
  48.          LCD_Init();                                        //LCD初始化         
  49.         BEEP_Init();
  50.         LED_Init();                             //LED端口初始化
  51.         Gizwits_Init();         //協(xié)議初始化
  52.         Moto_Init();
  53.         W25QXX_Init();                        //初始化W25Q128
  54.         tp_dev.init();                        //初始化觸摸屏
  55.         usmart_dev.init(72);                //初始化USMART
  56.         my_mem_init(SRAMIN);                //初始化內(nèi)部內(nèi)存池
  57.         exfuns_init();                        //為fatfs相關(guān)變量申請內(nèi)存  
  58.          f_mount(fs[1],"1:",1);  //掛載FLASH.
  59.         POINT_COLOR=RED;
  60.         while(font_init())                         //檢查字庫
  61.         {            
  62.                 LCD_ShowString(60,50,240,16,16,"Font Error!");
  63.                 delay_ms(200);                                 
  64.                 LCD_Fill(60,50,240,66,WHITE);//清除顯示
  65.                 delay_ms(200);        
  66.         }

  67.         LCD_Clear(WHITE);
  68.         POINT_COLOR=RED;
  69.         Show_Str_Mid(0,0,"STM32F103ZET6",16,240);                                                
  70.         Show_Str_Mid(0,20,"觸屏密碼鎖",16,240);               
  71.         Show_Str_Mid(0,140,"請輸入密碼",16,240);        
  72.         AS608_load_keyboard(0,170,(u8**)kbd_delFR);//加載虛擬鍵盤
  73.         flag=0;


  74. //        Show_Str_Mid(0,120,"close",16,240);
  75.         
  76.         while(1)
  77.         {

  78.                 num=GET_NUM();//獲取返回的數(shù)值

  79.                 if(num==pass_num)
  80.                 {
  81.                         flag++;
  82.                         if(flag==2){flag=0;}
  83.                 }

  84.                 switch(flag)
  85.                 {
  86.                         case 0: POINT_COLOR=RED;Show_Str_Mid(0,120,"close",16,240);         GPIO_ResetBits(GPIOB,GPIO_Pin_8);delay_ms(50);GPIO_SetBits(GPIOB,GPIO_Pin_8);delay_ms(50);break;
  87.                         case 1: POINT_COLOR=RED;Show_Str_Mid(0,120,"-open",16,240);         break;
  88.                         
  89.                 }

  90.                 LED1=!LED1;               
  91.                                                 
  92.         }         
  93. }


  94. //加載按鍵界面(尺寸x,y為240*150)
  95. //x,y:界面起始坐標(biāo)(240*320分辨率的時(shí)候,x必須為0)
  96. void AS608_load_keyboard(u16 x,u16 y,u8 **kbtbl)
  97. {
  98.         u16 i;
  99.         POINT_COLOR=RED;
  100.         kbd_tbl=kbtbl;
  101.         LCD_Fill(x,y,x+240,y+150,WHITE);
  102.         LCD_DrawRectangle(x,y,x+240,y+150);                                                   
  103.         LCD_DrawRectangle(x+80,y,x+160,y+150);         
  104.         LCD_DrawRectangle(x,y+30,x+240,y+60);
  105.         LCD_DrawRectangle(x,y+90,x+240,y+120);
  106.         POINT_COLOR=BLUE;
  107.         for(i=0;i<15;i++)
  108.         {
  109.                 if(i==1)//按鍵表第2個(gè)‘:’不需要中間顯示
  110.                         Show_Str(x+(i%3)*80+2,y+7+30*(i/3),80,30,(u8*)kbd_tbl[i],16,0);        
  111.                 else
  112.                         Show_Str_Mid(x+(i%3)*80,y+7+30*(i/3),(u8*)kbd_tbl[i],16,80);
  113.         }
  114. }
  115. //按鍵狀態(tài)設(shè)置
  116. //x,y:鍵盤坐標(biāo)
  117. //key:鍵值(0~14)
  118. //sta:狀態(tài),0,松開;1,按下;
  119. void AS608_key_staset(u16 x,u16 y,u8 keyx,u8 sta)
  120. {                  
  121.         u16 i=keyx/3,j=keyx%3;
  122.         if(keyx>16)return;
  123.         if(sta &&keyx!=1)//按鍵表第2個(gè)‘:’不需要清除
  124.                 LCD_Fill(x+j*80+1,y+i*30+1,x+j*80+78,y+i*30+28,GREEN);
  125.         else if(keyx!=1)
  126.                 LCD_Fill(x+j*80+1,y+i*30+1,x+j*80+78,y+i*30+28,WHITE);
  127.         if(keyx!=1)//不是‘:’
  128.                 Show_Str_Mid(x+j*80,y+7+30*i,(u8*)kbd_tbl[keyx],16,80);        
  129. }
  130. //得到觸摸屏的輸入
  131. //x,y:鍵盤坐標(biāo)
  132. //返回值:(1~15,對應(yīng)按鍵表)
  133. u8 AS608_get_keynum(u16 x,u16 y)
  134. {
  135.         u16 i,j;
  136.         static u8 key_x=0;//0,沒有任何按鍵按下
  137.         u8 key=0;
  138.         tp_dev.scan(0);                  
  139.         if(tp_dev.sta&TP_PRES_DOWN)//觸摸屏被按下
  140.         {        
  141.                 for(i=0;i<5;i++)
  142.                 {
  143.                         for(j=0;j<3;j++)
  144.                         {
  145.                                  if(tp_dev.x[0]<(x+j*80+80)&&tp_dev.x[0]>(x+j*80)&&tp_dev.y[0]<(y+i*30+30)&&tp_dev.y[0]>(y+i*30))
  146.                                 {        
  147.                                         key=i*3+j+1;         
  148.                                         break;                           
  149.                                 }
  150.                         }
  151.                         if(key)
  152.                         {           
  153.                                 if(key_x==key)key=0;
  154.                                 else
  155.                                 {
  156.                                         AS608_key_staset(x,y,key_x-1,0);
  157.                                         key_x=key;
  158.                                         AS608_key_staset(x,y,key_x-1,1);
  159.                                 }
  160.                                 break;
  161.                         }
  162.           }  
  163.         }else if(key_x)
  164.         {
  165.                 AS608_key_staset(x,y,key_x-1,0);
  166.                 key_x=0;
  167.         }
  168.         return key;
  169. }
  170. //獲取鍵盤數(shù)值
  171. u16 GET_NUM(void)
  172. {
  173.         u8  key_num=0;
  174.         u16 num=0;
  175.         while(1)
  176.         {
  177.                 key_num=AS608_get_keynum(0,170);        
  178.                 if(key_num)
  179.                 {
  180.                         if(key_num==1)return 0xFFFF;//‘返回’鍵
  181.                         if(key_num==3)return 0xFF00;//               
  182.                         if(key_num>3&&key_num<13&&num<99)//‘1-9’鍵(限制輸入3位數(shù))
  183.                                 num =num*10+key_num-3;               
  184.                         if(key_num==13)num =num/10;//‘Del’鍵                        
  185.                         if(key_num==14&&num<99)num =num*10;//‘0’鍵
  186.                         if(key_num==15)return num;  //‘Enter’鍵
  187.                 }
  188.                 LCD_ShowNum(80+15,170+7,num,6,16);
  189.                
  190.         }        
  191. }


  192. void Del_FR(void)
  193. {
  194.         u16 num;
  195.         
  196.         LCD_Fill(0,100,lcddev.width,160,WHITE);
  197.         
  198.         Show_Str_Mid(0,140,"請輸入密碼",16,240);
  199.         delay_ms(50);
  200.         AS608_load_keyboard(0,170,(u8**)kbd_delFR);
  201.         num=GET_NUM();//獲取返回的數(shù)值
  202.         if(num==15)
  203.         {
  204.                 flag++;
  205.                 if(flag==2){flag=0;}
  206.         }
  207.         
  208.         switch(flag)
  209.         {
  210.                 case 0: Show_Str_Mid(0,120,"close",16,240);         break;
  211.                 case 1: Show_Str_Mid(0,100,"-open",16,240);         break;
  212.                
  213.         }
  214.         

  215. }
復(fù)制代碼


https://live.csdn.net/v/431091

原理圖: 無
仿真: 無
代碼: 觸屏密碼鎖.7z (1.32 MB, 下載次數(shù): 4)

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 共享資料的黑幣獎勵(lì)!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表