嵌入式Linux开发-在6818开发板上显示图案
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开发板上显示图案相关推荐
- 《嵌入式Linux与物联网软件开发——C语言内核深度解析》一2.4 位运算构建特定二进制数...
本节书摘来自异步社区<嵌入式Linux与物联网软件开发--C语言内核深度解析>一书中的第2章,第2.4节,作者朱有鹏 , 张先凤,更多章节内容可以访问云栖社区"异步社区" ...
- 嵌入式 Linux 与物联网软件开发 ——C 语言内核深度解析
C 语言是嵌入式 Linux 领域的主要开发语言. 对于学习嵌入式.单片机.Linux 驱动开发等技术来说,C 语言是必须要过的一关.C 语言学习的特点是入门容易.深入理解难.精通更是难上加难.很多用 ...
- 《嵌入式Linux与物联网软件开发——C语言内核深度解析》一第1章 C语言与内存1.1 引言...
本节书摘来自异步社区<嵌入式Linux与物联网软件开发--C语言内核深度解析>一书中的第1章,第1.1节,作者朱有鹏 , 张先凤,更多章节内容可以访问云栖社区"华章计算机&quo ...
- 嵌入式Linux与物联网软件开发:C语言内核深度解析
嵌入式Linux与物联网软件开发:C语言内核深度解析 1.C语言与内存 1.引言 2.计算机程序运行的目的 3.位.半字.字的概念和内存位宽 ...
- 【Qt开发】【ARM-Linux开发】 QT在ARM上显示字体的问题
在PC机上利用QT开发的应用程序在 设置字体时,在PC上运行,可根据自己的设置,字体随之变大或变小.而移植到ARM上运行时发现,显示 字 体与所设置的字体不用,字体普遍偏小.经过上网搜索发现,是环境变 ...
- 嵌入式Linux开发-在6818开发板显示2048游戏
该项目只是一个原始版本,图片已经删除,我已经上传完整的项目资源zip,如有需要请自行下载!!! https://download.csdn.net/download/weixin_46836491/8 ...
- linux嵌入式主要学什么,学嵌入式linux,用什么开发板,请大家推荐一下
搞个嵌入式linux培训班的课程来看下,就知道要学什么了 C语言基础.C++基础.数据结构.操作系统原理.Linux应用基础.电子电路基础 开课前一周:入学基础测试与辅导(C语言.C++.linux基 ...
- 嵌入式linux编程,嵌入式Linux学习笔记 - 嵌入式Linux基础知识和开发环境的构建_Linux编程_Linux公社-Linux系统门户网站...
注:所有内容基于友善之臂Mini2440开发板 一.嵌入式Linux开发环境的构建 嵌入式开发一般分为三个步骤: 1.编译bootloader,烧到开发板 2.编译嵌入式Linux内核,烧到开发板 3 ...
- python 嵌入式 linux 产品 发布_基于嵌入式Linux进行Python应用开发
ByToradex秦海 1).简介 Python 编程语言因其极强的可读性.可移植.易于维护,以及丰富的第三方扩展组件,如数据库.数学计算.图形,甚至机器视觉.人工智能.深度学习框架都提供Python ...
最新文章
- centos io 查看程序_centos 查看每天应用程序的iowait
- AI理论知识基础(21)-对变化建模-用差分方程-动力系统及常数解
- .net中流的概念!
- 视觉平衡与物理平衡_设计中的平衡理论为什么这么重要?
- Linux下动态库的创建与更新
- cmdb python 采集虚拟机_Python编程(三十四):CMDB后台管理、封装自定义JS组件、前端td标签定制显示内容及属性...
- Tomcat服务器搭建及测试教程(1),腾讯技术官发布的“神仙文档”火爆网络
- 2.深入分布式缓存:从原理到实践 --- 分布式系统理论
- 14.Adding Frontend Files to your Module
- web项目继承ServletContainerInitializer进行访问HttpServlet(WebServlet)
- 01串匹配问题 —— Binary Strings【Gym - 101845B】
- 熟悉Jeecg框架、学会环境的搭建及前后端项目(OA)的启动
- 太阳能充电板给锂电池充电电路设计
- KDD 2022论文合集(持续更新中)
- JavaScript 高淇讲解的代码(三)
- animation中CrossFade的问题
- Fabric CA的部署与使用
- Python_首字母大写
- 有效沟通技巧慕课答案
- linux 查找替换
热门文章
- 修复android 5.0 Xutils的框架问题retry error, curr request is null
- 计算机知识office答案,计算机二级office题库及答案
- 因式分解(2019,牛客 ,7场B)
- 绑定变量和BIND PEEKING
- 电视机和计算机的显示器各使用什么扫描方式,电视可以用作计算机显示器吗?...
- 开发板——屏幕控制(LCD和触摸屏)
- Mac更新10.14后频繁重启
- CREO:CREO软件之工程图【创建】以及配置(符合国家标准)的简介及其使用方法(图文教程)之详细攻略
- 【专题】线性同余方程
- 将MySQL数据导入hive时报错发现如下错误