屏幕控制(LCD和触摸屏)

  • LCD显示
    • 显示bmp格式图片
    • 显示jpeg格式图片
  • 触摸屏的使用

LCD显示

  1. 打开LCD屏幕
    open需要包含的头文件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int fd_lcd = open("/dev/fb0", O_RDWR);
  1. 建立映射,将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格式的图片是没有经过压缩的的图片,所以打开的方式较为简单。

  1. 打开bmp图片
int fd_bmp = open("./pic.bmp", O_REWR);
  1. 将图片映射到一片内存
unsigned char * pbmp = mmap(NULL,                   //是否指定内存heigh_bmp*width_bmp*3,  //申请内存的大小PROT_READ | PROT_WRITE, //申请内存的权限MAP_SHARED,           //内存是否共享fd_bmp,                 //文件描述符0);                      //偏移量
  1. 读取图片的数据,然后写入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);}
}
  1. 关闭文件,结束内存映射
close(fd_lcd);
close(fd_bmp);
munmap(plcd, heigh*width*4);
munmap(pbmp, heigh*width*3);

显示jpeg格式图片

  1. 安装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
//重启开发板
  1. 解压缩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);
  1. 编译
    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和触摸屏)相关推荐

  1. 物联网开发笔记(62)- 使用Micropython开发ESP32开发板之控制ILI9341 3.2寸TFT-LCD触摸屏进行LVGL图形化编程:环境搭建

    一.目的 这一节我们学习如何使用我们的ESP32开发板来控制ILI9341 3.2寸TFT-LCD触摸屏进行LVGL图形化编程的第一步:环境搭建. 关键字:3.2寸SPI串口TFT液晶显示屏模块 IL ...

  2. 物联网开发笔记(63)- 使用Micropython开发ESP32开发板之控制ILI9341 3.2寸TFT-LCD触摸屏进行LVGL图形化编程:显示中文

    一.目的 这一节我们学习如何使用我们的ESP32开发板来控制ILI9341 3.2寸TFT-LCD触摸屏进行LVGL图形化编程的第一步:显示中文. 二.环境 ESP32 + 3.2寸 ILI9341触 ...

  3. 物联网开发笔记(64)- 使用Micropython开发ESP32开发板之控制ILI9341 3.2寸TFT-LCD触摸屏进行LVGL图形化编程:控件显示

    一.目的 这一节我们学习如何使用我们的ESP32开发板来控制ILI9341 3.2寸TFT-LCD触摸屏进行LVGL图形化编程:控件显示. 二.环境 ESP32 + ILI9341 3.2寸TFT-L ...

  4. 物联网开发笔记(48)- 使用Micropython开发ESP32开发板之控制OLED ssd1306屏幕

    一.目的 这一节我们学习如何使用我们的ESP32开发板来控制OLED ssd1306屏幕,此处使用的是I2C协议,大家可自行百度学习一下I2C. 二.环境 ESP32 + OLED ssd1306屏幕 ...

  5. 在ARM开发板上实现LCD+USB键盘

    一.LCD驱动 这个地方先留着 二.USB键盘驱动 在linux内核里边提供了usbkbd.c可以直接借助这个模块,编译生成驱动模块加载进内核,其实对于驱动程序,这里还不是重点,最后想要实现的是直接在 ...

  6. 物联网开发笔记(58)- 使用Micropython开发ESP32开发板之控制2.90寸电子墨水屏模块黑白套件

    一.目的 这一节我们学习如何使用我们的ESP32开发板来控制2.90寸电子墨水屏模块(黑白套件). 二.环境 ESP32 + 2.90寸 电子墨水屏模块 + Thonny IDE + 几根杜邦线 接线 ...

  7. 物联网开发笔记(50)- 使用Micropython开发ESP32开发板之控制HC-SR501人体红外感应传感器

    一.目的 这一节我们学习如何使用我们的ESP32开发板来控制HC-SR501人体红外感应传感器. 二.环境 ESP32 + HC-SR501人体红外感应传感器 + Thonny IDE + 几根杜邦线 ...

  8. 物联网开发笔记(54)- 使用Micropython开发ESP32开发板之控制MG90S舵机

    一.目的 这一节我们学习如何使用我们的ESP32开发板来控制舵机.前面我和大家使用Wokwi在线仿真讲过.这里我们再来学习一下,大家可以通过文章末尾的链接去购买适合的舵机来学习.这里我为了讲解方便依然 ...

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

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

最新文章

  1. win8计算机安全模式,安全模式,教您Win8怎么进入安全模式
  2. SSM框架下实现导入功能
  3. 优化SQL步骤—— explain分析执行计划 (explain 之 id)
  4. NIO网络编程应用实例——群聊系统
  5. pyspark 计算 皮尔逊相关系数
  6. python定义一个类savingaccount表示银行账户_c#教程之c#模拟银行atm机示例分享
  7. java程序设计计算器_Java程序设计计算器(含代码)
  8. 帆软按钮控件变查询_如何设置finereport按钮控件的可用时间
  9. Make 输出重定向到文件
  10. Fragment懒加载预加载
  11. springmvc中@PathVariable和@RequestParam的区别(百度收集)
  12. 仿QQ音乐网站源码PHP,仿QQ音乐首页
  13. 苹果CMSV10如何打包麻花影视APP教程
  14. MS word自带公式编辑器、MathType、AxMath三种公式编辑器的比较
  15. 动手打造Android7.0以上的注入工具
  16. N次剩余 最基础的laji入门
  17. [处理方法]微信内置浏览器 打开页面空白
  18. ChatGPT讲故事,DALLE-2负责画出来!两大AI合作出绘本!
  19. 通过批处理文件bat批量修改图片名称
  20. antdPro创建的项目网络请求统一处理

热门文章

  1. 安装java失败删除不掉_问题8:Java程序安装却删除不了怎么办?
  2. 针对付费的百度文库用冰点_9个针对开发人员的付费技术写作程序
  3. mathtype在word2016中安装
  4. [LINUX]LINUX驱动开发最简环境搭建(适用于新手)
  5. javascript从入门到跑路-----小文的js学习笔记(25)------运动框架----匀速运动、缓冲运动、多物体运动、链式运动
  6. 世界杯的比赛可以换6个人?
  7. FISCO BCOS 2.0原理解析: 分布式存储架构设计
  8. 【微电网】基于风光储能和需求响应的微电网日前经济调度(Python代码实现)
  9. BSA分析之MutMap分析原理详解
  10. Overload 和Override 的区别。