开发板——屏幕控制(LCD和触摸屏)
屏幕控制(LCD和触摸屏)
- LCD显示
- 显示bmp格式图片
- 显示jpeg格式图片
- 触摸屏的使用
LCD显示
- 打开LCD屏幕
open需要包含的头文件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int fd_lcd = open("/dev/fb0", O_RDWR);
- 建立映射,将LCD文件映射到一片内存
mmap需要包含的头文件
#include <sys/mman.h>
unsigned int * plcd = mmap( NULL, //是否指定内存heigh_lcd*width_lcd*4, //申请内存的大小PROT_READ | PROT_WRITE, //申请内存的权限MAP_SHARED, //内存是否共享fd_lcd, //文件描述符0); //偏移量
显示bmp格式图片
bmp格式的图片是没有经过压缩的的图片,所以打开的方式较为简单。
- 打开bmp图片
int fd_bmp = open("./pic.bmp", O_REWR);
- 将图片映射到一片内存
unsigned char * pbmp = mmap(NULL, //是否指定内存heigh_bmp*width_bmp*3, //申请内存的大小PROT_READ | PROT_WRITE, //申请内存的权限MAP_SHARED, //内存是否共享fd_bmp, //文件描述符0); //偏移量
- 读取图片的数据,然后写入LCD
int x, y;
//逐行写入
for(y=0; y<heigh_lcd; y++){//逐点写入for(x=0; x<width_lcd; x++){//合成像素点*(plcd + x + width*y) = (*(pbmp + 0 + 3*x + width*y) << 0) | \(*(pbmp + 1 + 3*x + width*y) << 8) | \(*(pbmp + 2 + 3*x + width*y) << 16);}
}
- 关闭文件,结束内存映射
close(fd_lcd);
close(fd_bmp);
munmap(plcd, heigh*width*4);
munmap(pbmp, heigh*width*3);
显示jpeg格式图片
- 安装jpg库
在虚拟机中
//解压文件
tar -zxvf jpegsrc.v9a.tar.gz
cd jpeg-9a/
注意,解压应该在非共享目录下进行,否则会使软链接失效。
//对jpeg源码进行配置
./configure --host=arm-linux --prefix=/home/gec/jpeglib
make
make install
//把虚拟机中的jpeglib目录拷贝到开发板文件系统中的根目录下
/jpgelib
//修改开发板中的配置脚本/etc/profile
vi /etc/profile
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/jpeglib/lib
//重启开发板
- 解压缩jpg格式图片
1)为JPEG对象分配空间并初始化
2)指定解压缩数据源
3)获取文件信息
4)为解压缩设定参数,包括图片大小,颜色空间
5)开始解压缩
6)取出数据
7)解压缩完成
8)释放资源
1)为JPEG对象分配空间并初始化,解压缩过程中使用的JPEG对象是一个jpeg_decompress_struct的结构体。同时还需要定义一个用于错误处理的结构体对象,IJG中标准的错误结构体是jpeg_error_mgr
struct jpeg_decompress_struct dinfo;
struct jpeg_error_mgr jerr;
然后是将错误处理结构对象绑定在JPEG对象上
dinfo.err = jpeg_std_error(&jerr);
初始化dinfo结构
jpeg_create_decompress(&dinfo);
2)指定解压缩数据源,利用标准C中的文件指针传递要打开的jpg文件
FILE *infile;
if ((infile= fopen(argv[1], "w")) == NULL)return 0;
//图片名通过main函数的参数传到main函数,使用:./show_jpg a.jpg
jpeg_stdio_src(&dinfo, infile);
3)获取文件信息,IJG将图像的缺省信息填充到dinfo结构中以便程序使用
jpeg_read_header(&dinfo, TRUE);
此时,常见的可用信息包括图像的
宽dinfo.image_width,
高dinfo.image_height,
色彩空间dinfo.jpeg_color_space,
颜色通道数dinfo.num_components等。
4)为解压缩设定参数,在完成jpeg_read_header调用后,开始解压缩之前就可以进行解压缩参数的设定,也就是为dinfo结构的成员赋值。
比如可以设定解出来的图像的大小,也就是与原图的比例。使用scale_num和scale_denom两个参数,解出来的图像大小就是scale_num/scale_denom,但是IJG当前仅支持1/1, 1/2, 1/4,和1/8这几种缩小比例。
比如要取得1/2原图的图像,需要如下设定:
dinfo.scale_num=1;
dinfo.scale_denom=2;
也可以设定输出图像的色彩空间,即dinfo.out_color_space,可以把一个原本彩色的图像由真彩色JCS_RGB变为灰度JCS_GRAYSCALE。如:
dinfo.out_color_space=JCS_GRAYSCALE;
5)开始解压缩根据设定的解压缩参数进行图像解压缩操作。
(void)jpeg_start_decompress(&dinfo);
在完成解压缩操作后,IJG就会将解压后的图像信息填充至dinfo结构中。比如,输出图像宽度dinfo.output_width,输出图像高度dinfo.output_height,每个像素中的颜色通道数dinfo.output_components(比如灰度为1,全彩色为3)等。
6)取出数据,解开的数据是按照行取出的,数据像素按照scanline来存储,scanline是从左到右,从上到下的顺序,每个像素对应的各颜色或灰度通道数据是依次存储,比如一个24-bitRGB真彩色的图像中,一个scanline中的数据存储模式是R,G,B,R,G,B,R,G,B,…,每条scanline是一个JSAMPLE类型的数组,一般来说就是unsigned char,定义于jmorecfg.h中。
//申请一片可以储存一行图片数据的内存
unsigned char *buffer=(unsigned char*)malloc(dinfo.output_width*3);
int i,j=0;
//逐行读取
while(dinfo.output_scanline<dinfo.output_height){//逐点读取jpeg_read_scanlines(&dinfo, &buffer, 1);for(x=0; x<dinfo.output_width; x++){ //合成并显示像素点 *(plcd+y*800+x) = (*(buffer+0+3*x)<<0) | (*(buffer+1+3*x)<<8) | (*(buffer+2+3*x)<<16);}y++;
}
7)解压缩完毕,释放资源
jpeg_finish_decompress(&dinfo);
jpeg_destroy_decompress(&dinfo);
fclose(infile);
- 编译
arm-linux-gcc show_pic.c -o show_pic -I /home/gec/jpeglib/include/ -L /home/gec/jpeglib/lib -ljpeg
-I: 链接到头文件所在的目录(大写的i)
-L: 链接到库所在的目录
-l: 链接到库(小写的L)
触摸屏的使用
<linux/input.h>中定义的struct input_event结构体
struct input_event {struct timeval time; //按键时间__u16 type; //类型,在下面有定义__u16 code; //类型下对应的事件__s32 value; //事件所对应的值
};
type中所有的类型:
type: EV_KEY //键盘EV_REL //相对坐标EV_ABS //绝对坐标
链接: 原文详见.
版权声明:本文为CSDN博主「lemontree1945」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lemontree1945/article/details/78864681
int get_ts_xy(int *ts_x, int *ts_y, int fd_ts)
{//触摸屏所需要的结构体struct input_event ts_buf;//记录读取的次数int count = 0;//2、读取触摸屏的数据while(1){read(fd_ts, &ts_buf, sizeof(ts_buf));//获取x轴坐标值if (ts_buf.type == EV_ABS && ts_buf.code == ABS_X){count++;//记录读到的x坐标的值*ts_x = ts_buf.value;}//获取y轴坐标值if (ts_buf.type == EV_ABS && ts_buf.code == ABS_Y){count++;//记录读到的y坐标的值*ts_y = ts_buf.value;}if(2 == count){printf("(%d, %d)\n", *ts_x, *ts_y);//延时3000msusleep(3000);count = 0;break;}}
}
本文仅为学习笔记,欢迎纠错
开发板——屏幕控制(LCD和触摸屏)相关推荐
- 物联网开发笔记(62)- 使用Micropython开发ESP32开发板之控制ILI9341 3.2寸TFT-LCD触摸屏进行LVGL图形化编程:环境搭建
一.目的 这一节我们学习如何使用我们的ESP32开发板来控制ILI9341 3.2寸TFT-LCD触摸屏进行LVGL图形化编程的第一步:环境搭建. 关键字:3.2寸SPI串口TFT液晶显示屏模块 IL ...
- 物联网开发笔记(63)- 使用Micropython开发ESP32开发板之控制ILI9341 3.2寸TFT-LCD触摸屏进行LVGL图形化编程:显示中文
一.目的 这一节我们学习如何使用我们的ESP32开发板来控制ILI9341 3.2寸TFT-LCD触摸屏进行LVGL图形化编程的第一步:显示中文. 二.环境 ESP32 + 3.2寸 ILI9341触 ...
- 物联网开发笔记(64)- 使用Micropython开发ESP32开发板之控制ILI9341 3.2寸TFT-LCD触摸屏进行LVGL图形化编程:控件显示
一.目的 这一节我们学习如何使用我们的ESP32开发板来控制ILI9341 3.2寸TFT-LCD触摸屏进行LVGL图形化编程:控件显示. 二.环境 ESP32 + ILI9341 3.2寸TFT-L ...
- 物联网开发笔记(48)- 使用Micropython开发ESP32开发板之控制OLED ssd1306屏幕
一.目的 这一节我们学习如何使用我们的ESP32开发板来控制OLED ssd1306屏幕,此处使用的是I2C协议,大家可自行百度学习一下I2C. 二.环境 ESP32 + OLED ssd1306屏幕 ...
- 在ARM开发板上实现LCD+USB键盘
一.LCD驱动 这个地方先留着 二.USB键盘驱动 在linux内核里边提供了usbkbd.c可以直接借助这个模块,编译生成驱动模块加载进内核,其实对于驱动程序,这里还不是重点,最后想要实现的是直接在 ...
- 物联网开发笔记(58)- 使用Micropython开发ESP32开发板之控制2.90寸电子墨水屏模块黑白套件
一.目的 这一节我们学习如何使用我们的ESP32开发板来控制2.90寸电子墨水屏模块(黑白套件). 二.环境 ESP32 + 2.90寸 电子墨水屏模块 + Thonny IDE + 几根杜邦线 接线 ...
- 物联网开发笔记(50)- 使用Micropython开发ESP32开发板之控制HC-SR501人体红外感应传感器
一.目的 这一节我们学习如何使用我们的ESP32开发板来控制HC-SR501人体红外感应传感器. 二.环境 ESP32 + HC-SR501人体红外感应传感器 + Thonny IDE + 几根杜邦线 ...
- 物联网开发笔记(54)- 使用Micropython开发ESP32开发板之控制MG90S舵机
一.目的 这一节我们学习如何使用我们的ESP32开发板来控制舵机.前面我和大家使用Wokwi在线仿真讲过.这里我们再来学习一下,大家可以通过文章末尾的链接去购买适合的舵机来学习.这里我为了讲解方便依然 ...
- 【嵌入式开发】手把手教你4418/6818开发板屏幕修改 本文转自迅为: http://www.topeetboard.com 开发平台:iTOP-4418/6818开发板 44186818屏幕
[嵌入式开发]手把手教你4418/6818开发板屏幕修改 本文转自迅为: http://www.topeetboard.com 开发平台:iTOP-4418/6818开发板 4418&6818 ...
最新文章
- win8计算机安全模式,安全模式,教您Win8怎么进入安全模式
- SSM框架下实现导入功能
- 优化SQL步骤—— explain分析执行计划 (explain 之 id)
- NIO网络编程应用实例——群聊系统
- pyspark 计算 皮尔逊相关系数
- python定义一个类savingaccount表示银行账户_c#教程之c#模拟银行atm机示例分享
- java程序设计计算器_Java程序设计计算器(含代码)
- 帆软按钮控件变查询_如何设置finereport按钮控件的可用时间
- Make 输出重定向到文件
- Fragment懒加载预加载
- springmvc中@PathVariable和@RequestParam的区别(百度收集)
- 仿QQ音乐网站源码PHP,仿QQ音乐首页
- 苹果CMSV10如何打包麻花影视APP教程
- MS word自带公式编辑器、MathType、AxMath三种公式编辑器的比较
- 动手打造Android7.0以上的注入工具
- N次剩余 最基础的laji入门
- [处理方法]微信内置浏览器 打开页面空白
- ChatGPT讲故事,DALLE-2负责画出来!两大AI合作出绘本!
- 通过批处理文件bat批量修改图片名称
- antdPro创建的项目网络请求统一处理
热门文章
- 安装java失败删除不掉_问题8:Java程序安装却删除不了怎么办?
- 针对付费的百度文库用冰点_9个针对开发人员的付费技术写作程序
- mathtype在word2016中安装
- [LINUX]LINUX驱动开发最简环境搭建(适用于新手)
- javascript从入门到跑路-----小文的js学习笔记(25)------运动框架----匀速运动、缓冲运动、多物体运动、链式运动
- 世界杯的比赛可以换6个人?
- FISCO BCOS 2.0原理解析: 分布式存储架构设计
- 【微电网】基于风光储能和需求响应的微电网日前经济调度(Python代码实现)
- BSA分析之MutMap分析原理详解
- Overload 和Override 的区别。