lcd屏幕的显示原理
我们常说开发板的屏幕是800*480的
单位是什么? 像素点!
屏幕一行有800个像素点
一列有480个像素点。
像素点? 显示颜色的点

怎么让像素点显示自己想要的颜色?
OS规定: 一个 像素点由4个字节的大小来表示
这四个字节分别是什么呢?
A : 透明度 一般为0
R : Red 红色
G : Green 绿色
B : Blue 蓝色

RGB : 光的三基色
把这三种颜色 按照不同的比例混合
是不是就可以得到任何的颜色
A R G B 各占一个字节的大小
无符号一个字节(8bit)能表示的范围是多少?
0000 0000 1111 1111 1 0000 0000 - 1
0 ~ 255

也即是说:
假设我给A = 0 R =0 G = 0 B = 255
那么像素点应该显示最蓝色
如果要显示最红?
A = 0 R = 255 G = 0 B = 0

我们把这种用数字的范围来表示颜色的深浅的操作叫做颜色的量化

16进制 的一位 表示2进制的4位
假设我现在要用16进制表示最红
0x 0 255 0 0
0x A R G B
0x 00 ff 00 00

此时 也就是说 如果我想要给一个像素点上最红
那么我只需要将0X00ff0000写到像素点对应的控制点去

现在的问题是怎么写?
1. 写到哪里?

开发板有一个专门的屏幕文件 写到该文件里面就行
“/dev/fb0”
2. 怎么写?
linux的一句设计哲学
everything is file in linux
所有事物都是 文件 在linux下。
那么这意味着 我只需要学会操作文件的方法 我就可以操作linux下的一切。

第一步打开文件 open
linux手册
man 页数 要查的函数

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags);

函数功能: 打开一个指定文件
头文件:如上
参数列表:
pathname:path:路径 name 名字
路径名 带路径的文件的名字
例子:
我要打开屏幕文件
/dev/fb0

        flags:标志 决定你对打开文件的权限o_RDONLY :只读o_WRONLY:只写o_RDWR:可读可写

返回值:
成功返回文件描述符(大于2的正整数)失败返回-1
打开屏幕文件代码:

     int fd;fd=open("/dev/fb0",O_RDWR);if(fd==-1)
{perror("失败");//perror会把错误原因告诉你(英文)return -1;
}

第二步 :读文件内容 read 写文件 write

 #include <unistd.h>int write(int fd, const void *buf, int count);

函数功能: 往文件写入内容
头文件:如上
参数列表:
fd:文件描述符 open函数的返回值
表示一个打开的文件
buf:指向一段空间 这段空间用来保存你要写入的数据
count:表示你要写入多少字节数据
返回值:
成功返回实际写入的字节数 失败返回-1
int write(int fd, const void *buf, int count);

第三步:关闭文件 close
close(fd);
close只有一个参数 就是那个已经打开的文件的文件描述符

实现
在开发板屏幕上显示粉色

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<stdio.h>
#include <unistd.h>
int main()
{int i=0;
int j=0;
int color[480][800]={0};
int fd=open("/dev/fb0", O_RDWR);
if(fd==-1)
{perror("open error\n");return -1;
}
for(i=0;i<480;i++)
{for(j=0;j<800;j++){color[i][j]=0x00ffc0cb;}
}
write(fd,color,800*480*4);
close(fd);
}

在开发板屏幕上显示德国国旗

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>int main()
{int fd = open("/dev/fb0",O_RDWR);if(fd == -1){perror("open error\n");return -1;}int buf[480][800];for(int i=0; i<480; i++){for(int j=0; j<800; j++){if(i<=160){buf[i][j] = 0x00000000;}else if(i>160 && i<=320){buf[i][j] = 0x00ff0000;}else{buf[i][j] = 0x00FFD700;}}}int d = write(fd,buf,800*480*4);if(d == -1){perror("open error\n");return -1;}close(fd);
}

在开发板屏幕上显示圆

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>int main()
{int fd = open("/dev/fb0",O_RDWR);if(fd == -1){perror("open error\n");return -1;}int buf[480][800];for(int i=0; i<480; i++){for(int j=0; j<800; j++){if(0.8*(i-240)*(i-240)+(j-400)*(j-400) <= 150*150){buf[i][j] = 0x00000000;}else{buf[i][j] = 0x00FFD700;}}}int d = write(fd,buf,800*480*4);if(d == -1){perror("open error\n");return -1;}close(fd);
}

在开发板上显示太极图
思路:两个左右黑白的半圆合成一个大圆,然后在同一条直径上画上下两个直径为大圆一半的圆,再在两个圆中画两个小圆

//画圆
void draw_round(int x,int y,int r,int color)
{for(int i=0;i<480;i++){for(int j=0;j<800;j++){if((i-y)*(i-y)+(j-x)*(j-x) <=r*r){*(addr +i*800 +j)=color;}}}
}//画左半圆
static void draw_Halfround_L(int x,int y,int r,int color)
{for(int i=0;i<480;i++){for(int j=0;j<800;j++){if((i-y)*(i-y)+(j-x)*(j-x) <=r*r && j<=x){*(addr +i*800 +j)=color;}}}
}//画右半圆
static void draw_Halfround_R(int x,int y,int r,int color)
{for(int i=0;i<480;i++){for(int j=0;j<800;j++){if((i-y)*(i-y)+(j-x)*(j-x) <=r*r && j>=x){*(addr +i*800 +j)=color;}}}
}static void draw_Halfround_T(int x,int y,int r,int color)
{for(int i=0;i<480;i++){for(int j=0;j<800;j++){if((i-y)*(i-y)+(j-x)*(j-x) <=r*r && i<=y){*(addr +i*800 +j)=color;}}}
}//太极图
void draw_TaiJi(int x,int y,int r)
{//背景draw_bmp("./TaiJi.bmp",0,0);//大圆draw_Halfround_L(x,y,r,0x00000000);draw_Halfround_R(x,y,r,0x00FFFFFF);draw_round(400,140,100,0x00FFFFFF); //上圆   draw_round(400,340,100,0x00000000); //下圆draw_round(400,140,20,0x00000000); //上小圆   draw_round(400,340,20,0x00FFFFFF); //下小圆
}

嵌入式Linux开发-在6818开发板上显示图案相关推荐

  1. 《嵌入式Linux与物联网软件开发——C语言内核深度解析》一2.4 位运算构建特定二进制数...

    本节书摘来自异步社区<嵌入式Linux与物联网软件开发--C语言内核深度解析>一书中的第2章,第2.4节,作者朱有鹏 , 张先凤,更多章节内容可以访问云栖社区"异步社区" ...

  2. 嵌入式 Linux 与物联网软件开发 ——C 语言内核深度解析

    C 语言是嵌入式 Linux 领域的主要开发语言. 对于学习嵌入式.单片机.Linux 驱动开发等技术来说,C 语言是必须要过的一关.C 语言学习的特点是入门容易.深入理解难.精通更是难上加难.很多用 ...

  3. 《嵌入式Linux与物联网软件开发——C语言内核深度解析》一第1章 C语言与内存1.1 引言...

    本节书摘来自异步社区<嵌入式Linux与物联网软件开发--C语言内核深度解析>一书中的第1章,第1.1节,作者朱有鹏 , 张先凤,更多章节内容可以访问云栖社区"华章计算机&quo ...

  4. 嵌入式Linux与物联网软件开发:C语言内核深度解析

    嵌入式Linux与物联网软件开发:C语言内核深度解析     1.C语言与内存         1.引言         2.计算机程序运行的目的         3.位.半字.字的概念和内存位宽   ...

  5. 【Qt开发】【ARM-Linux开发】 QT在ARM上显示字体的问题

    在PC机上利用QT开发的应用程序在 设置字体时,在PC上运行,可根据自己的设置,字体随之变大或变小.而移植到ARM上运行时发现,显示 字 体与所设置的字体不用,字体普遍偏小.经过上网搜索发现,是环境变 ...

  6. 嵌入式Linux开发-在6818开发板显示2048游戏

    该项目只是一个原始版本,图片已经删除,我已经上传完整的项目资源zip,如有需要请自行下载!!! https://download.csdn.net/download/weixin_46836491/8 ...

  7. linux嵌入式主要学什么,学嵌入式linux,用什么开发板,请大家推荐一下

    搞个嵌入式linux培训班的课程来看下,就知道要学什么了 C语言基础.C++基础.数据结构.操作系统原理.Linux应用基础.电子电路基础 开课前一周:入学基础测试与辅导(C语言.C++.linux基 ...

  8. 嵌入式linux编程,嵌入式Linux学习笔记 - 嵌入式Linux基础知识和开发环境的构建_Linux编程_Linux公社-Linux系统门户网站...

    注:所有内容基于友善之臂Mini2440开发板 一.嵌入式Linux开发环境的构建 嵌入式开发一般分为三个步骤: 1.编译bootloader,烧到开发板 2.编译嵌入式Linux内核,烧到开发板 3 ...

  9. python 嵌入式 linux 产品 发布_基于嵌入式Linux进行Python应用开发

    ByToradex秦海 1).简介 Python 编程语言因其极强的可读性.可移植.易于维护,以及丰富的第三方扩展组件,如数据库.数学计算.图形,甚至机器视觉.人工智能.深度学习框架都提供Python ...

最新文章

  1. centos io 查看程序_centos 查看每天应用程序的iowait
  2. AI理论知识基础(21)-对变化建模-用差分方程-动力系统及常数解
  3. .net中流的概念!
  4. 视觉平衡与物理平衡_设计中的平衡理论为什么这么重要?
  5. Linux下动态库的创建与更新
  6. cmdb python 采集虚拟机_Python编程(三十四):CMDB后台管理、封装自定义JS组件、前端td标签定制显示内容及属性...
  7. Tomcat服务器搭建及测试教程(1),腾讯技术官发布的“神仙文档”火爆网络
  8. 2.深入分布式缓存:从原理到实践 --- 分布式系统理论
  9. 14.Adding Frontend Files to your Module
  10. web项目继承ServletContainerInitializer进行访问HttpServlet(WebServlet)
  11. 01串匹配问题 —— Binary Strings【Gym - 101845B】
  12. 熟悉Jeecg框架、学会环境的搭建及前后端项目(OA)的启动
  13. 太阳能充电板给锂电池充电电路设计
  14. KDD 2022论文合集(持续更新中)
  15. JavaScript 高淇讲解的代码(三)
  16. animation中CrossFade的问题
  17. Fabric CA的部署与使用
  18. Python_首字母大写
  19. 有效沟通技巧慕课答案
  20. linux 查找替换

热门文章

  1. 修复android 5.0 Xutils的框架问题retry error, curr request is null
  2. 计算机知识office答案,计算机二级office题库及答案
  3. 因式分解(2019,牛客 ,7场B)
  4. 绑定变量和BIND PEEKING
  5. 电视机和计算机的显示器各使用什么扫描方式,电视可以用作计算机显示器吗?...
  6. 开发板——屏幕控制(LCD和触摸屏)
  7. Mac更新10.14后频繁重启
  8. CREO:CREO软件之工程图【创建】以及配置(符合国家标准)的简介及其使用方法(图文教程)之详细攻略
  9. 【专题】线性同余方程
  10. 将MySQL数据导入hive时报错发现如下错误