标题:
STM32-2.8寸TFTLCD屏虚拟键盘触摸密码锁程序
[打印本页]
作者:
abscond
时间:
2024-10-25 16:48
标题:
STM32-2.8寸TFTLCD屏虚拟键盘触摸密码锁程序
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "lcd.h"
#include "key.h"
#include "touch.h"
#include "malloc.h"
#include "usmart.h"
#include "sdio_sdcard.h"
#include "w25qxx.h"
#include "ff.h"
#include "exfuns.h"
#include "fontupd.h"
#include "text.h"
#include "led.h"
#include "bjdj.h"
#include "timer.h"
#include "usart3.h"
#include "gizwits_product.h"
dataPoint_t currentDataPoint;
u8 wifi_sta=0;
//协议初始化
void Gizwits_Init(void)
{
TIM3_Int_Init(9,7199);//1MS系统定时
usart3_init(9600);//WIFI初始化
memset((uint8_t*)¤tDataPoint, 0, sizeof(dataPoint_t));//设备状态结构体初始化
gizwitsInit();//缓冲区初始化
}
u8** kbd_tbl;
const u8* kbd_delFR[15]={"密码",":","清空","1","2","3","4","5","6","7","8","9","DEL","0","Enter",};//按键表
u16 flag=0;
u8 passnum[3]={4,5,6};
void Del_FR(void); //前进
void AS608_load_keyboard(u16 x,u16 y,u8 **kbtbl);//加载虚拟键盘
u8 AS608_get_keynum(u16 x,u16 y);//获取键盘数
u16 GET_NUM(void);//获取数值
int main(void)
{
u8 key_num;
int key;
u16 num,pass_num=258;
u8 wifi_con=0;//记录wifi连接状态 1:连接 0:断开
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
delay_init(); //初始化延时函数
uart_init(115200); //初始化串口1波特率为115200,用于支持USMART
KEY_Init(); //按键初始化
LCD_Init(); //LCD初始化
BEEP_Init();
LED_Init(); //LED端口初始化
Gizwits_Init(); //协议初始化
Moto_Init();
W25QXX_Init(); //初始化W25Q128
tp_dev.init(); //初始化触摸屏
usmart_dev.init(72); //初始化USMART
my_mem_init(SRAMIN); //初始化内部内存池
exfuns_init(); //为fatfs相关变量申请内存
f_mount(fs[1],"1:",1); //挂载FLASH.
POINT_COLOR=RED;
while(font_init()) //检查字库
{
LCD_ShowString(60,50,240,16,16,"Font Error!");
delay_ms(200);
LCD_Fill(60,50,240,66,WHITE);//清除显示
delay_ms(200);
}
LCD_Clear(WHITE);
POINT_COLOR=RED;
Show_Str_Mid(0,0,"STM32F103ZET6",16,240);
Show_Str_Mid(0,20,"触屏密码锁",16,240);
Show_Str_Mid(0,140,"请输入密码",16,240);
AS608_load_keyboard(0,170,(u8**)kbd_delFR);//加载虚拟键盘
flag=0;
// Show_Str_Mid(0,120,"close",16,240);
while(1)
{
num=GET_NUM();//获取返回的数值
if(num==pass_num)
{
flag++;
if(flag==2){flag=0;}
}
switch(flag)
{
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;
case 1: POINT_COLOR=RED;Show_Str_Mid(0,120,"-open",16,240); break;
}
LED1=!LED1;
}
}
//加载按键界面(尺寸x,y为240*150)
//x,y:界面起始坐标(240*320分辨率的时候,x必须为0)
void AS608_load_keyboard(u16 x,u16 y,u8 **kbtbl)
{
u16 i;
POINT_COLOR=RED;
kbd_tbl=kbtbl;
LCD_Fill(x,y,x+240,y+150,WHITE);
LCD_DrawRectangle(x,y,x+240,y+150);
LCD_DrawRectangle(x+80,y,x+160,y+150);
LCD_DrawRectangle(x,y+30,x+240,y+60);
LCD_DrawRectangle(x,y+90,x+240,y+120);
POINT_COLOR=BLUE;
for(i=0;i<15;i++)
{
if(i==1)//按键表第2个‘:’不需要中间显示
Show_Str(x+(i%3)*80+2,y+7+30*(i/3),80,30,(u8*)kbd_tbl[i],16,0);
else
Show_Str_Mid(x+(i%3)*80,y+7+30*(i/3),(u8*)kbd_tbl[i],16,80);
}
}
//按键状态设置
//x,y:键盘坐标
//key:键值(0~14)
//sta:状态,0,松开;1,按下;
void AS608_key_staset(u16 x,u16 y,u8 keyx,u8 sta)
{
u16 i=keyx/3,j=keyx%3;
if(keyx>16)return;
if(sta &&keyx!=1)//按键表第2个‘:’不需要清除
LCD_Fill(x+j*80+1,y+i*30+1,x+j*80+78,y+i*30+28,GREEN);
else if(keyx!=1)
LCD_Fill(x+j*80+1,y+i*30+1,x+j*80+78,y+i*30+28,WHITE);
if(keyx!=1)//不是‘:’
Show_Str_Mid(x+j*80,y+7+30*i,(u8*)kbd_tbl[keyx],16,80);
}
//得到触摸屏的输入
//x,y:键盘坐标
//返回值:(1~15,对应按键表)
u8 AS608_get_keynum(u16 x,u16 y)
{
u16 i,j;
static u8 key_x=0;//0,没有任何按键按下
u8 key=0;
tp_dev.scan(0);
if(tp_dev.sta&TP_PRES_DOWN)//触摸屏被按下
{
for(i=0;i<5;i++)
{
for(j=0;j<3;j++)
{
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))
{
key=i*3+j+1;
break;
}
}
if(key)
{
if(key_x==key)key=0;
else
{
AS608_key_staset(x,y,key_x-1,0);
key_x=key;
AS608_key_staset(x,y,key_x-1,1);
}
break;
}
}
}else if(key_x)
{
AS608_key_staset(x,y,key_x-1,0);
key_x=0;
}
return key;
}
//获取键盘数值
u16 GET_NUM(void)
{
u8 key_num=0;
u16 num=0;
while(1)
{
key_num=AS608_get_keynum(0,170);
if(key_num)
{
if(key_num==1)return 0xFFFF;//‘返回’键
if(key_num==3)return 0xFF00;//
if(key_num>3&&key_num<13&&num<99)//‘1-9’键(限制输入3位数)
num =num*10+key_num-3;
if(key_num==13)num =num/10;//‘Del’键
if(key_num==14&&num<99)num =num*10;//‘0’键
if(key_num==15)return num; //‘Enter’键
}
LCD_ShowNum(80+15,170+7,num,6,16);
}
}
void Del_FR(void)
{
u16 num;
LCD_Fill(0,100,lcddev.width,160,WHITE);
Show_Str_Mid(0,140,"请输入密码",16,240);
delay_ms(50);
AS608_load_keyboard(0,170,(u8**)kbd_delFR);
num=GET_NUM();//获取返回的数值
if(num==15)
{
flag++;
if(flag==2){flag=0;}
}
switch(flag)
{
case 0: Show_Str_Mid(0,120,"close",16,240); break;
case 1: Show_Str_Mid(0,100,"-open",16,240); break;
}
}
复制代码
https://live.csdn.net/v/431091
原理图: 无
仿真: 无
代码:
触屏密码锁.7z
(1.32 MB, 下载次数: 4)
2024-10-27 03:35 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1