前言

先放个最终结果图

之前,课程设计实验要做一个嵌入式画板,可苦了作为一名面向csdn编程的小白。我遍访CSDN,博客园,未如人意。网上这方面太少了,只得自己上手。换个思路,了解功能,再找每个功能函数,然后穿起来未尝不是解决之法。

一、功能概述

老师的要求是这样的:

1.点击进入绘画大师设置界面
2.设置界面能够对画笔的粗细进行设置
3.设置界面能够对画笔的颜色进行设置
4.设置界面能够对画板的背景色进行设置
5.点击“开始绘画”按钮,进入画图板
6.画笔写字画画时,线条较为连续
7.画图板界面可以点击按钮返回到设置界面
8.从设置界面重新再次进入画图板后,能够保存之前的内容
9.点击清除按钮,重新开始绘图

我们梳理一下:
界面:

  1. 开始界面
  1. 设置界面
  1. 画板界面

函数:

 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*3){printf("read pic error!\n");}//5.24位转32位for(i=0,j=0;i<800*480;i++,j+=3){lcd_buf[i] = (bmp_buf[j]<<0)|(bmp_buf[j+1]<<8)|(bmp_buf[j+2]<<16);}//6.图片翻转for(y=0;y<480;y++){for(x=0;x<800;x++){show_buf[800*(479-y)+x] = lcd_buf[800*y+x];}}//7.写入数据到LCD屏幕ret = write(lcd,show_buf,800*480*4);if(ret != 800*480*4){printf("write lcd error!\n");}//8.关闭LCD与图片close(lcd);close(pic);
}

3、画线函数

在lcd屏幕上画线,其实就是在不断画半径为r的圆
所以实现方式就是
画点函数---->画圆函数---->画线函数

1).画点

//画点函数
void draw_point(int x0, int y0, int color)
{if (x0 >= 0 && x0 < 800&&y0 >= 0 && y0 < 480  ){*(plcd + y0 * 800 + x0) = color;}
}

2).画实心圆

//画圆void draw_circle(int x0,int y0,int r,int color)
{int a,b;int di;a=0;b=r;    di=3-(r<<1);             //判断下个点位置的标志while(a<=b){int i = a,p = b;while(i>0){      draw_point(x0+b,y0-i,color);draw_point(x0-i,y0+b,color);i--;}     while(p>0){      draw_point(x0-a,y0-p,color);draw_point(x0-p,y0-a,color);draw_point(x0+a,y0-p,color);draw_point(x0-p,y0+a,color);draw_point(x0+a,y0+p,color);draw_point(x0+p,y0+a,color);p--;}a++;//Bresenham算法画圆    if(di<0)di +=4*a+6;     else{di+=10+4*(a-b);   b--;}                           }draw_point(x0,y0,color); //圆心坐标
}

3).画线

//画线
//-----------画线。参数:起始坐标,终点坐标,颜色--------
void draw_line(int x1,int y1,int x2,int y2,int color)
{int dx,dy,e;dx=x2-x1; dy=y2-y1;if(dx>=0){if(dy >= 0) // dy>=0{if(dx>=dy) // 1/8 octant{e=dy-dx/2;while(x1<=x2){draw_circle(x1,y1,r,color);if(e>0){y1+=1;e-=dx;}   x1+=1;e+=dy;}}else        // 2/8 octant{e=dx-dy/2;while(y1<=y2){draw_circle(x1,y1,r,color);if(e>0){x1+=1;e-=dy;}   y1+=1;e+=dx;}}}else           // dy<0{dy=-dy;   // dy=abs(dy)if(dx>=dy) // 8/8 octant{e=dy-dx/2;while(x1<=x2){draw_circle(x1,y1,r,color);if(e>0){y1-=1;e-=dx;}   x1+=1;e+=dy;}}else        // 7/8 octant{e=dx-dy/2;while(y1>=y2){draw_circle(x1,y1,r,color);if(e>0){x1+=1;e-=dy;}   y1-=1;e+=dx;}}}   }else //dx<0{dx=-dx;     //dx=abs(dx)if(dy >= 0) // dy>=0{if(dx>=dy) // 4/8 octant{e=dy-dx/2;while(x1>=x2){draw_circle(x1,y1,r,color);if(e>0){y1+=1;e-=dx;}   x1-=1;e+=dy;}}else        // 3/8 octant{e=dx-dy/2;while(y1<=y2){draw_circle(x1,y1,r,color);if(e>0){x1-=1;e-=dy;}   y1+=1;e+=dx;}}}else           // dy<0{dy=-dy;   // dy=abs(dy)if(dx>=dy) // 5/8 octant{e=dy-dx/2;while(x1>=x2){draw_circle(x1,y1,r,color);if(e>0){y1-=1;e-=dx;}   x1-=1;e+=dy;}}else        // 6/8 octant{e=dx-dy/2;while(y1>=y2){draw_circle(x1,y1,r,color);if(e>0){x1-=1;e-=dy;}   y1-=1;e+=dx;}}}   }
}

4.背景函数

背景函数解决方法就是在全屏刷上颜色

//背景填色
void chushihua()
{for(int j = 0;j<=480;j++){for(int i = 200;i<=800;i++){draw_point(i,j,color2);}}
}

5 保存函数

本来我想直接保存当前lcd屏幕上的所有显示点,但如果在背景换色之后不是又被覆盖了,所以我的想法是用二维数组保存之前的触摸坐标及当时画笔颜色半径,在切换回画板时快速复现一下之前的所有操作不就行了,背景改变不会影响数组数据。
而清除功能就直接将二维数组归零

int sj[][4]; //保存数据 x,y,color ,r
设置函数中的切换回画板部分/
if(k>0){int X2,Y2,x,y,color,r2;for(int i = 0;i<k;i++){     x=sj[i][0],y=sj[i][1],r2=sj[i][2],color=sj[i][3];draw_circle(x,y,r2,color);if(  ((X2-x)*(X2-x)+(Y2-y)*(Y2-y)) <3000&&i>1){//修正断点连续draw_line2( X2,Y2,x,y,r2,color);//直线}X2=sj[i][0];Y2=sj[i][1];                                 } fj=0;printf("重现");}//返回//坐标函数中的画布部分if(x>200){ //画布位置draw_circle(x,y,r,color);if(  ((X-x)*(X-x)+(Y-y)*(Y-y)) <3000){//修正断点连续draw_line( X,Y,x,y,color);//直线printf("----");}X=x;Y=y;if(fj==0){sj[k][0]=x;sj[k][1]=y;sj[k][2]=r;sj[k++][3]=color;}}

6.设置函数和侧边函数

这个我认为比较简单,大家自己根据要求设置几个标志位和条件语句,根据条件执行相应参数改变或调用相应函数即可。

三、资源

以上是我认为关键的部分,如果能给你提供一些思路就再好不过了。由于个人是个菜鸡,写的代码太长了,全放在这也影响各位观感,我就整理成压缩包了。
补的链接。
感谢浏览( •̀ ω •́ )✧

【6818开发板】嵌入式lcd屏绘画板实现相关推荐

  1. 创龙DSP6748开发板驱动LCD屏

    1. DSP6748内部有2个LCD控制器,Raster Controller 光栅控制器和the LCD Interface Display Driver (LIDD) controller 控制器 ...

  2. ARM6818开发板画任意矩形,圆形,三角形,五角星,6818开发板画太极,画五星红旗(含码源与思路)

    本文利用6818开发板完成LCD屏上绘制任意的矩形,圆形,三角形或五角星形图案,还有绘制太极,五星红旗的方案. 目录 映射 绘制矩形 代码思路 代码实现 实践出真知 绘制圆形 代码思路 代码实现 绘制 ...

  3. 【嵌入式开发】手把手教你4418/6818开发板屏幕修改 本文转自迅为: http://www.topeetboard.com 开发平台:iTOP-4418/6818开发板 44186818屏幕

    [嵌入式开发]手把手教你4418/6818开发板屏幕修改 本文转自迅为: http://www.topeetboard.com 开发平台:iTOP-4418/6818开发板 4418&6818 ...

  4. 嵌入式Linux开发-6818开发板使用流程

    1. linux 运行c文件 先在window下编译C文件 在虚拟机共享此文件 在linux运行终端 cd /路径 gcc test.c -o 2 ./2 注:TAB键和空格的区别,空格在不同编译软件 ...

  5. linux平台下的6818开发板(ARM)显示屏的字体显示

    软件开发环境:ubuntu-18.04\ubuntu-16.04 硬件开发环境:ARM架构下的6818开发板 串口软件:secureCRT(类似于Linux终端下的命令行操作) 通过Linux平台用终 ...

  6. 基于粤嵌gec6818开发板嵌入式开发电子相册,音乐播放,视频播放,2048游戏

    一.功能与要求 实现功能:本系统需要使用粤嵌的GEC-6818开发板设计一款娱乐影音系统,其中包括图片显示(相册).音乐播放.视频播放,游戏四个部分,在每个部分内部,具有操控各个部分的功能触摸按键.本 ...

  7. iTOP-4418/6818开发板支持双屏异显,双屏同显

    iTOP-4418/6818开发板平台安卓系统下支持双屏异显,双屏同显,客户可按照不同用途,分别播放适合屏幕显示方式的内容 ,如HDMI屏幕和LCD屏幕显示不同内容, 一个屏幕播放广告,另一个屏幕运行 ...

  8. 6818 开发板 配置 ubuntu 桌面环境 与 ROS

    6818开发板 配置ubuntu 桌面环境与 ROS 可用的固件有ubuntu core 16(arm64).ubuntu core 16(armhf).Lubuntu desktop(armhf). ...

  9. 开发板的lcd 显示

    http://hi.baidu.com/guoggn/blog/item/018ed7f28932261eb07ec59a.html 转]S3c2410 LCD驱动学习心得 2010-07-26 14 ...

最新文章

  1. 创建文件夹(如果已经存在就清空)python脚本
  2. JPA规范的主要内容
  3. csv.writer写入文件有多余的空行
  4. 数据字典简单例子_Python学习100天-Day14(数据分析篇-pandas02)
  5. 程序员学历要求越来越高,薪酬天花板犹如发际线,原因很简单!
  6. 屏蔽关闭百度搜索风云热点的方法
  7. python用一维数组存储学号和成绩、然后按成绩排序输出_九度oj 题目1196:成绩排序...
  8. php 关于token、签名、加密的一点理解
  9. 挪车让路,没有留下电话怎么办?
  10. java 大学考试_大学java期末考试试题
  11. 最新小说免费API--书香楼,每日不断更新
  12. 制作U盘免疫病毒文件夹
  13. linux vi/vim 的命令
  14. html5 上标,HTML5 Canvas +下标和上标
  15. C语言求ax2+bx+c=0的解,解一元二次方程
  16. AC695X_FCCBQB认证资料获取[杰理全系列]
  17. 使用Java实现MP3音乐播放
  18. 你了解API测试吗?如何充分的测试一个API?
  19. 【机器学习】如何成为当下合格的算法工程师
  20. cool start

热门文章

  1. Spring实战 | 第二部分 Web中的Spring(第五章 构建Spring Web应用程序)
  2. 从蒙娜丽莎到战争机器 — 达芬奇大师科学展
  3. Carla学习(八)利用carla制作自己的kitti数据集
  4. 在vue项目中使用Lottie动画(随看随用)
  5. 环形图中间怎么加文字
  6. 2021建筑八大员(材料员)模拟真题集及答案解析
  7. 用c语言写简单的游戏名字大全,适合女生的游戏名字,适合女生的游戏名字大全4个字...
  8. java女侠游戏_放开那女侠游戏
  9. 关于「梦幻手游」过于重度和高端缺少乐趣的问题
  10. 推荐 :python脚本:下载动漫之家漫画