LCD(GEC6818)

这篇具有很好参考价值的文章主要介绍了LCD(GEC6818)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

此篇博客是基于GEC6818开发板使用

1、液晶屏的基本概念

像素:屏幕上显示颜色的最小单位,英文叫pixel。注意,位图(jpg,bmp等格式的常见图片)也是由一个个的像素点构成的,跟屏幕的像素点的概念一样。原理上讲,将一张位图显示到屏幕上,就是将图片上的像素点一个个复制到屏幕像素点。

分辨率:宽高两个像素点。分辨率越高,所需要的显存越大

色深:每个像素点所对应的内存字节数,一般有8位、16位、24位或32位

 GEC6818开发板的屏幕的色深是32位的

32位色深的屏幕一般被称为真彩屏,或1600万色屏

色深决定了一个像素点所能表达的颜色的丰富程度,色深越大,色彩表现力越强

2、lcd

lcd的设备名字:/dev/fb0                (fb=framebuffer 帧缓冲)

开发板和虚拟机都在该路径下

lcd的分辨率(lcd的大小):800 * 480(像素点)

将像素点转化为字节单位(1个像素点等于4个字节)

1个像素点1等于ARGB(4个字节)

A-->透明度(决定颜色的深浅,实际要看硬件的参数是否有)

R-->red

G-->green

B-->blue

说明:挑选颜色=windows的画图软件+计算器(程序员)

struct fb_fix_screeninfo
{
    char id[16];              /* identification string eg "TT Builtin" */
    unsigned long smem_start; /* Start of frame buffer mem */
                              /* (physical address) */
    __u32 smem_len;           /* Length of frame buffer mem */
    __u32 type;               /* see FB_TYPE_*        */
    __u32 type_aux;           /* Interleave for interleaved Planes */
    __u32 visual;             /* see FB_VISUAL_*        */ 
    __u16 xpanstep;           /* zero if no hardware panning  */
    __u16 ypanstep;           /* zero if no hardware panning  */
    __u16 ywrapstep;          /* zero if no hardware ywrap    */
    __u32 line_length;        /* length of a line in bytes    */
    ...
    ...
};

struct fb_var_screeninfo
{
    __u32 xres;           /* 可见区宽度(单位:像素) */
    __u32 yres;           /* 可见区高度(单位:像素) */
    __u32 xres_virtual;   /* 虚拟区宽度(单位:像素) */
    __u32 yres_virtual;   /* 虚拟区高度(单位:像素) */
    __u32 xoffset;        /* 虚拟区到可见区x轴偏移量 */
    __u32 yoffset;        /* 虚拟区到可见区y轴偏移量 */

    __u32 bits_per_pixel; /* 色深 */

    // 像素内颜色结构
    struct fb_bitfield red;   // 红色  
    struct fb_bitfield green; // 绿色
    struct fb_bitfield blue;  // 蓝色
    struct fb_bitfield transp;// 透明度
    ...
    ...
};

struct fb_bitfield
{
    __u32 offset;   /* 颜色在像素内偏移量 */
    __u32 length;   /* 颜色占用数位长度 */
    ...
    ...
};

//上述结构体的具体定义在系统的如下路径中
/usr/include/linux/fb.h

3、lcd刷颜色操作

lcd刷颜色是最基本的使用,步骤一共有四步:

1、打开lcd

2、填充刷lcd的buf

3、将buf写到lcd中

4、关闭lcd

实现代码如下

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <fcntl.h>
#include <unistd.h>


int main(int argc,char** argv)
{
    //1、打开lcd
    int fd_lcd,ret;           // --->  lcd也是一个文件,需要使用一个文件描述符
    fd_lcd = open("/dev/fb0",O_RDWR);
    if(fd_lcd == -1)
    {
        perror("open lcd fail");
        return -1;
    }

    //2、填充刷lcd的buf
    //方法一
    //int buf[800*480] = { 0 };    
    //int color = 0x00ffffff;        //刷图的颜色
    //for(int i = 0;i < 800*480;i++)
    //{
    //    buf[i] = color;
    //}

    //方法二
    int buf[800*480] = {0};
	//给这一个buf的每一个像素点赋值
	int x=0; //x表示lcd的横轴
	int y=0; //y表示lcd的纵轴
	//用xy表示LCD的每一个像素点,然后一行一行的写(从第0行开始写)
	for(y=0;y<480;y++)
	{
		for(x=0;x<800;x++)
		{
			//y=0 x=0 第0行第0个像素点
			//y=1 x=1 第1行的第1个像素点(4个字节)  	
			buf[y*800+x] = green; 
		}		
	}

    //3、将buf写到lcd中
    write(fd_lcd,buf,sizeof(buf));

    //4、关闭lcd
    close(fd_lcd)
  
    return 0
}

4、内存映射

为什么要使用内存映射呢?

当我们使用普通的read,write函数读写lcd时,发现lcd显示颜色的时候:

1、逐渐显示的过程

2、每条颜色之间存在毛刺的现象

3、显示颜色的时间稍长

这就引出内存映射(mmap)这种方法,内存映射函数接口如下:

//mmap()函数   --->  man 2 mmap
//功能:将文件或设备映射到内存中

#include <sys/mman.h>

void* mmap(void* addr,size_t length,int port,int flag,int fd,off_t offset);
参数说明:
        addr:不为NULL  --->  用户选择内存空间的起始地址      0.00001%
              为NULL   --->  系统为用户去自动分配某一块空间 99.99999%
        length:映射的内存大小(字节数)
        port:PROT_EXEC    页面可能会被执行
             PROT_READ    可以阅读页面
             PROT_WRITE    可以写页面
             PROT_NONE    页面可能无法访问
             如果需要多个权限,则使用“ | ” 连接在一起
        flag:MAP_SHARED:    1、进程共享内存    2、内存数据的变更同步到对应的文件
              MAP_PRIVATE:    1、内存私有    2、内存数据的变更不会影响到对应的内存
        fd:文件描述符
        offset:文件偏移量(从文件的哪个地方开始进行映射)
返回值:成功:指向那片内存空间的区域的地址
        失败:NULL

//munmap()函数  --->  man 2 munmap
//功能:将文件或设备取消映射到内存

#include <sys/mman.h>

int munmap(void* addr,size_t length);
参数说明:
        addr:需要撤销映射的内存的起始地址 --->  mmap()函数的返回值
        length:撤销的长度
返回值:成功:0DD
        失败:-1
每次lcd映射完完了之后需要释放掉   ---> 使用munmap()函数

内存映射的实现步骤:

1、打开lcd(open)

2、内存映射(mmap)

3、操作映射空间

4、取消内存映射(munmap)

5、关闭lcd(close)

测试代码如下:文章来源地址https://www.toymoban.com/news/detail-494476.html

#include <stdio.h>
#include <sys/mman.h>
#inclued <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

int main(int argc,char** agrv)
{
    int fd_lcd;
    int* addr = NULL;
    int color = 0x00ff00ff;
    
    //1、打开lcd(open)
    fd_lcd = open("/dev/fb0",O_RDWR);
    if(fd_lcd == -1)
    {
        perror("open lcd fail");
        return 0; 
    }

    //2、内存映射(mmap)
    addr = mmap(NULL,800*480*4,PROT_READ|PROT_WRITE,MAP_SHARED,fd_lcd,0);
    if(addr == NULL)    
    {
        perror("mmap fail");
        return -1;
    }

    //3、操作映射空间
    /*开始操作这段映射空间*/
	//给指针指向的这段空间赋值(效率要高于读写LCD) 
	int x=0;//x是横轴
	int y=0;//y是纵轴
	//一行一行的给指针指向的像素点赋值
	for(y=0;y<480;y++)
	{
		for(x=0;x<800;x++)
			//指针偏移是指向的下一个单位
			//先指针偏移然后解引用
			*(addr+y*800+x) =  color; //颜色
	}    

    //4、取消内存映射(munmap)
    munmap(addr,800*480*4);    

    //5、关闭lcd(close)
    close(fd_lcd);

    return 0;
}

到了这里,关于LCD(GEC6818)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 粤嵌 GEC-6818 蓝牙智能家庭影音 arm开发记录

    注意:未经允许不得转载,引用请注明出处 文件操作:创建、删除、复制、移动 环境:VMware15.5,ubantu16.04,串口驱动HI-340,secureCRT 设置共享文件夹,设置后ubantu系统和windows系统可以共享使用该文件夹里面的内容。 1.gcc编译:将c文件进行编译 2.交叉编译:将c文件编译成arm文

    2024年01月22日
    浏览(95)
  • 粤嵌Linux GEC6818开发板实现电子相册

    最近学校要求使用粤嵌的开发板实现电子相册,具体的功能要有点击特定的区域实现上一张、下一张、自动播放图片、黑屏退出应用程序、左右滑动切换图片相关功能。其中涉及到的知识点也比较多(文件IO、内存映射、触摸屏、bmp图片格式、进程、线程创建和同步、字符串

    2024年02月04日
    浏览(54)
  • 语音识别开源库 FastARS 移植到GEC6818开发版

    移植 安装fftw3 移植 OpenBLAS 移植 FastARS 3.编写交叉编译的cmake 脚本 4.生成makefile 脚本 5.编译安装 6.进入 examples 目录看看是否成功生成   1.把生成的 k2_rnnt2_cli 下载到开发板的 /bin 目录 2.把所有的库文件下载到开发板的 /lib 目录     3.下载语音网络模型到开发版中 (模型转换请看

    2023年04月23日
    浏览(34)
  • 6.串口通信和传感器的使用----粤嵌gec6818开发板上实现智能家居(光照气度,压强,海拔,湿度,温度达到临界值蜂鸣器自动警报等)

    串口是一种简单的通信接口,也是单片机中最常用,最简单的通信方式 通常传感器都是采用串口作为与上位机的通信接口 ARM板上提供了三个可以外接传感器的串口接口,位于开发板的右上角, 从上到下分别是: ​ 串口号 串口驱动设备文件名 ​ CON2 “/dev/ttySAC1” ​ CON3 “

    2024年02月16日
    浏览(166)
  • GEC6818科大讯飞离线语音识别

    在下载SDK时需要注意选择Linux的版本!! 在官网下载离线语音的包,解压后可以得到下面的一些文件夹: 解压后你需要知道自己命令放在下面的文件夹中 关于Make file文件: 关于asr_offline_sample.c文件: asr_offline_sample.c 文件是我们更改为自己的逻辑的文件,但是也不需要都了解

    2024年01月17日
    浏览(56)
  • GEC6818开发板JPG图像显示,科大讯飞离线语音识别包Linux_aitalk_exp1227_1398d7c6运行demo程序,开发板实现录音

    体积小,使用到数据结构里面的 霍夫曼树(哈夫曼树) 对数据进行压缩 1.对jpegsrc.v8c.tar.gz进行arm移植 移植方式如下: 1.将jpegsrc.v8c.tar.gz解压缩到ubuntu ~ 2.进入~/jpeg-8c对jpeg库进行配置 3.编译 4.安装,将动态库存放到 /home/gec/armJPegLib 5.清空编译记录 6.自己查看下 /home/gec/armJPegLib目

    2024年01月17日
    浏览(53)
  • 粤嵌Gec6818---小项目功能实现(RFID+图片显示+音乐+视频)

    项目设计开发环境: (1)VMware Workstation Pro软件 (2)ubuntu12 .04 (能交叉编译就行) (3)SecureCRT  (4)代码编译器(notepad++/Visual Studio Code) 项目功能描述: (1)幻灯片:开始进行图片幻灯片显示,结束后进入RFID刷卡开锁界面。 (2)RFID:刷卡成功和刷卡失败两种状态(

    2024年02月08日
    浏览(55)
  • 粤嵌Gec6818---小项目功能实现简单步骤(RFID+图片显示+音乐+视频)

    项目设计开发环境: (1)VMware Workstation Pro软件 (2)ubuntu12 .04 (能交叉编译就行) (3)SecureCRT  (4)代码编译器(notepad++/Visual Studio Code) 项目功能描述: (1)幻灯片:开始进行图片幻灯片显示,结束后进入RFID刷卡开锁界面。 (2)RFID:刷卡成功和刷卡失败两种状态(

    2024年02月04日
    浏览(37)
  • 学习笔记(1)——粤嵌gec6818实现电子相册,音乐播放器,视频播放器。

    (1)设计一个初始界面,并且设置电子相册,音乐播放器,视频播放器三个触摸按键。 (2)电子相册——能够实现相册的幻灯片功能,实现相册左右滑动切换相片。 (3)音乐播放器实现——切歌,播放和暂停功能。 (4)视频播放器实现——播放、暂停、音量大小、快进倒

    2024年02月11日
    浏览(61)
  • GEC6818网络编程——服务器端与客户端tcp的双向通信

    网络编程之实现服务器和客户端的tcp双向通信,前面是双向通信的详细流程介绍,后面附上完整的代码o(  ̄▽ ̄ )ブ 1.1 服务器端双向通信的详细流程叙述 创建TCP套接字 : 使用 socket 函数创建一个TCP套接字。这里使用了IPv4地址族 AF_INET 和流式套接字 SOCK_STREAM 。 绑定IP和端口

    2024年02月21日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包