Cortex-M开发板密码登陆界面
Posted MangataTS
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Cortex-M开发板密码登陆界面相关的知识,希望对你有一定的参考价值。
效果图
登陆主界面
输入密码
密码错误
密码正确(我这里省事登陆成功直接放的一张图)
思路
主界面
主界面要有的元素有:输入框、数字键盘(字母键盘)、logo(可有可无)、删除键、登陆键
所以我们单独写一个专门显示登陆界面的函数,每次都加载主界面的这些元素:
void Show_Main()
show_anybmp(background,0,0);//背景
show_anybmp(Login_Logo,90,90);//logo
//显示数字键盘1-9
for(int x = 310,i = 1;i <= 3; ++i,x += 60)
for(int y = 240,j = 1;j <= 3; ++j,y += 60)
show_anybmp(number[(i-1)*3+j],x,y);
show_anybmp(number[0],360,420);//数字0
show_anybmp(del,590,240);//删除键
show_anybmp(login,590,340);//登陆键
show_anybmp(shownumbers,280,90);//显示输入的数字
判断触摸范围
我们可以单独写一个函数来帮我们比较传入的这个坐标是否在我们想要的范围内
int is_in(E e,int startx,int starty,int endx,int endy)
if(e.startx >= startx && e.startx <= endx && e.starty >= starty && e.starty <= endy
&& e.endx >= startx && e.endx <= endx && e.endy >= starty && e.endy <= endy)//如果在这个范围内返回1
return true;
return false;
然后将我们每次获取到的坐标点和我们有的控件做一个比较:
int check(E e)//检验函数
printf("start:(x = %d,y = %d), end:(x = %d,y = %d)\\n",e.startx,e.starty,e.endx,e.endy);
if(is_in(e,590,240,690,300))//点击删除框
if(locpass == 0) //表示密码框为空
printf("密码框为空!\\n");
return -1;
else//删除操作
locpass--;
show_anybmp(whiteblock,280+60*locpass,90);//覆盖前面一个位置
return 1;//成功操作返回1
else if(is_in(e,590,340,690,400))//点击登陆框
if(locpass != 4)
printf("密码框未输满!\\n");
return -2;//密码框未输满!
else
int fg = true;
for(int i = 0;i < PASSLEN; ++i)
if(password[i] != banzipassword[i])
fg = false;
if(fg) //如果对了,那么显示奖励图片
printf("密码正确!\\n");
show_Right();
else //如果错了
printf("密码错误!\\n");
Faild_login();
return -3;
else
if(locpass == 4) //密码框已满
printf("密码框已满!\\n");
return -4;//密码框满了
else//点击数字框
int locnumber;
for(int x = 310,i = 1;i <= 3; ++i,x += 60)
for(int y = 240,j = 1;j <= 3; ++j,y += 60)
if(is_in(e,x,y,x+60,y+60))
locnumber = (i-1)*3+j;
show_anybmp(number[locnumber],280+locpass*60,90);//显示输入的数字
password[locpass++] = '0'+locnumber;
return 1;
if(is_in(e,360,420,420,480))//数字0
locnumber = 0;
show_anybmp(number[locnumber],280+locpass*60,90);
password[locpass++] = '0'+locnumber;
return 1;
return -5;//不知道什么错误
输入框
对于输入框,我们可以定义一个数组来存放我们已经输入的值,然后将输入的内容覆盖到输入框里面
- 如果有输入操作我们应该先判断输入框是否已满,如果满了,我们就不能再往后放置了
- 如果有删除操作那么我们应该先看是否输入为空,如果为空就不能往前覆盖空白了
登陆控件
对于登陆控件我们应该先判断输入的密码是否输满了,如果没输满那么我们不应该拿去和我们内置的密码对比,如果满了我们就拿去和我们的密码对比,如果没问题那么就进入我们的奖励页面,然后退出程序,或者你们想怎么操作都行,我这里是直接显示奖励图片,然后退出,如果有问题,那么我们就给一个提示框,然后重写加载主界面
void show_Right()
show_anybmp(Right_Reword,0,0);//显示奖励图片
lcd_close();
exit(0);//退出程序
void Faild_login()
show_anybmp(Error_login,100,90);
sleep(1);//睡1s
Show_Main();//清空主界面
locpass = 0;//将密码指针移到开头
完整Code和素材
Code
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/input.h>
#include <sys/mman.h>
#include <stdlib.h>
#define TS "/dev/input/event0"
#define LCD "/dev/fb0"
#define PASSLEN 4
#define true 1
#define false 0
int ts_fd = -1; //触摸屏文件描述符
int *p = NULL; //显存映射指针
int lcd_fd = -1;//液晶屏文件描述符
typedef struct Point
int x,y;
P;
typedef struct Edge
int startx,starty,endx,endy;
E;
char password[4];
int locpass;
//************素材内容************
char *number[]=//数字
"sucai/0.bmp",
"sucai/1.bmp",
"sucai/2.bmp",
"sucai/3.bmp",
"sucai/4.bmp",
"sucai/5.bmp",
"sucai/6.bmp",
"sucai/7.bmp",
"sucai/8.bmp",
"sucai/9.bmp",
;
char *del="sucai/del.bmp";
char *login="sucai/login.bmp";
char *background="sucai/back.bmp";
char *whiteblock="sucai/whiteblock.bmp";
char *shownumbers="sucai/shownumbers.bmp";
char *Right_Reword="sucai/right.bmp";
char *Error_login="sucai/errorlogin.bmp";
//************素材内容************
char *Login_Logo="sucai/login_logo.bmp";
char *banzipassword="4399";//内置密码
E getxy()
P p;
//2、读取触摸屏数据、判断事件类型及动作
struct input_event buf; //输入事件结构体变量
E edge;
edge.startx = -1;
edge.starty = -1;
// int x1=-1, y1=-1; //在屏幕范围之外
while(1)
read(ts_fd, &buf, sizeof(buf));
if(buf.type == EV_ABS) //绝对事件
if(buf.code == ABS_X) //x轴事件
// *x = buf.value; //蓝色边框
p.x = buf.value*800/1024; //黑色边框
else if(buf.code == ABS_Y) //y轴事件
// *y = buf.value; //蓝色边框
p.y = buf.value*480/600; //黑色边框
if(p.x<0 || p.x>800 ) //坐标值跑飞重读一次
continue;
else if(p.y<0 || p.y>480 )
continue;
if(buf.type == EV_KEY && buf.code == BTN_TOUCH) //按压事件
if (buf.value == 0)
printf("松开\\n");
edge.endx = p.x;
edge.endy = p.y;
break;
else
printf("按下\\n");
if (edge.startx == -1 || edge.starty == -1)
edge.startx = p.x;
edge.starty = p.y;
return edge;
void init()
ts_fd = open(TS, O_RDONLY); //以只读的权限打开触摸屏
if(ts_fd == -1)
perror("open touch screen failed");
exit(0); //结束程序
lcd_fd = open(LCD, O_RDWR); //以读写权限打开液晶屏
if(lcd_fd == -1)
perror("open lcd failed");
exit(0); //结束程序
p = mmap(NULL, 800*480*4, PROT_READ|PROT_WRITE, MAP_SHARED, lcd_fd, 0); //给液晶屏映射一块内存
if(p == MAP_FAILED) //是否映射失败
perror("mmap failed");
exit(0); //结束程序
/* 资源释放 */
void lcd_close(void)
munmap(p, 800*480*4);
close(lcd_fd);
close(ts_fd);
//给一个像素点上色
void lcd_one_pixel(int x, int y, int color)
*(p+y*800+x) = color; //给每个地址解引用赋值颜色
/* 显示任意大小任意位置图片 */
//x0和y0是液晶屏起始映射点
void show_anybmp(char *bmpname, int x0, int y0)
if(bmpname == NULL)
printf("BMP文件名为空\\n");
lcd_close();
exit(0);
//打开bmp图片
int bmp_fd = open(bmpname, O_RDONLY);
if(bmp_fd == -1)
perror("open bmp failed");
lcd_close();
exit(0); //结束程序
//读取头信息
char bmp_info[54] = 0;
read(bmp_fd, bmp_info, 54);
int w = bmp_info[18] | bmp_info[19]<<8; //获取图片像素宽
int h = bmp_info[22] | bmp_info[23]<<8; //获取图片像素高
printf("bmp:%s, w=%d, h=%d\\n", bmpname, w, h);
if(w+x0>800 || h+y0>480)
printf("超出屏幕范围\\n");
exit(0);
lcd_close();
//读取RGB数据
char bmp_buf[800*480*3] = 0;
int color, i=0;
read(bmp_fd, bmp_buf, 800*480*3);
for(int y=0; y<h; y++)
for(int x=0; x<w; x++)
color = bmp_buf[i+0] | bmp_buf[i+1]<<8 | bmp_buf[i+2]<<16; //24位转32位,从lcd的最后一行开始存储
i += 3; //偏移下一个像素点
lcd_one_pixel(x+x0, h-1-y+y0, color); //映射每一个像素点
//关闭文件
close(bmp_fd);
void Show_Main()
show_anybmp(background,0,0);//背景
show_anybmp(Login_Logo,90,90);//logo
//显示数字键盘
for(int x = 310,i = 1;i <= 3; ++i,x += 60)
for(int y = 240,j = 1;j <= 3; ++j,y += 60)
show_anybmp(number[(i-1)*3+j],x,y);
show_anybmp(number[0],360,420);//数字0
show_anybmp(del,590,240);//删除键
show_anybmp(login,590,340);//登陆键
show_anybmp(shownumbers,ubuntu 循环登陆页面,登陆成功无法进入桌面
Cherry机械键盘开发板无线鼠标等100份好礼,回帖就送!