前言
先放个最终结果图
之前,课程设计实验要做一个嵌入式画板,可苦了作为一名面向csdn编程的小白。我遍访CSDN,博客园,未如人意。网上这方面太少了,只得自己上手。换个思路,了解功能,再找每个功能函数,然后穿起来未尝不是解决之法。
一、功能概述
老师的要求是这样的:
1.点击进入绘画大师设置界面
2.设置界面能够对画笔的粗细进行设置
3.设置界面能够对画笔的颜色进行设置
4.设置界面能够对画板的背景色进行设置
5.点击“开始绘画”按钮,进入画图板
6.画笔写字画画时,线条较为连续
7.画图板界面可以点击按钮返回到设置界面
8.从设置界面重新再次进入画图板后,能够保存之前的内容
9.点击清除按钮,重新开始绘图
我们梳理一下:
界面:
- 开始界面
- 设置界面
- 画板界面
函数:
1. 坐标函数(通过坐标进行交互)
2. 换图函数(切换界面)
3. 画线函数 (关键功能)
4. 背景函数(功能四)
5. 保存函数(保存之前的内容)
6. 设置函数和侧边函数(简单)
7. 主函数
变量:
> 1. 画笔颜色
> 2. 画笔粗细
> 3. 背景颜色
> 4. 坐标
> 5. 一些标志位
二、代码实现
1.坐标函数
//读坐标
int getxy()
{
//1.打开触摸屏文件
int fd = open("/dev/input/event0",O_RDWR);
if (fd == -1)
{
perror("open failed!");
return -1;
}
//2.读取触摸屏文件数据
int flag = 0; //记录当前获取坐标的信息
while (1)
{
read(fd, &xy, sizeof(xy));
if(xy.type == EV_ABS && xy.code == ABS_X)
{
x = xy.value*800/1024;//获取点击的时候X轴坐标的值 (0~1024)--> (0~800)
flag = 1;
}
if(xy.type == EV_ABS && xy.code == ABS_Y)
{
y = xy.value*480/600; //获取点击的时候Y轴坐标的值 (0~600)-->(0~480)
flag = 2;
}
//设置条件:每读取一次完整的坐标,就打印一次坐标
if(flag == 2)
{
printf("(%d,%d)\n", x, y);
flag = 0;
break;//获取一次坐标就跳出循环
}
}
//3.关闭触摸屏文件
close(fd);
return 0;
}
2.换图函数
/*调用的换图函数*/
void show_bmp(char *bmp_pathname)
{
pic = open(bmp_pathname,O_RDONLY);
if(pic < 0)
{
printf("open pic error!\n");
}
//2.打开LCD屏幕
lcd = open("/dev/fb0",O_WRONLY);
if(lcd < 0)
{
printf("open lcd error!\n");
}
//3.偏移54个字节
lseek(pic,54,SEEK_SET);
//4.读取bmp图片的数据
ret = read(pic,bmp_buf,800*480*3);
if(ret != 800*480*