ARM GEC6818 LCD绘图 实心圆 三角形 五角星 任意区域矩形以及旗帜
要在ARM上实现LCD绘图,可以按照以下步骤进行:
-
硬件初始化:初始化LCD控制器和相关引脚,配置时钟、分辨率和颜色深度等。
-
内存映射:将LCD显示区域映射到ARM的内存地址空间中,可以通过ARM的内存映射机制来实现。
-
绘图函数:实现绘制基本图形的函数,如点、线、矩形、圆等。可以通过计算像素坐标和调用ARM的内存写入指令来实现。
-
图像显示:通过调用绘图函数绘制图像,然后将图像数据写入映射的内存地址中,刷新LCD控制器以显示图像。
不同的LCD控制器和ARM芯片可能会有一些细节上的差异,因此具体的实现步骤可能会有所不同。此外,还可以结合相关的图形库或操作系统提供的绘图函数来简化开发过程。
这里采用的是手动绘制+内存映射。
空心圆:
int draw_circle(int color, int x, int y, int r)
{int a, b, num;a = 0;b = r;//1.打开液晶屏int fd_lcd;fd_lcd = open("/dev/fb0", O_RDWR);if(fd_lcd == -1 ){perror("open lcd "); //perror()会根据错误码返回出错的原因return -1;}printf("fd_lcd = %d\n", fd_lcd); //2. 显存映射,在应用程序中得到显存的首地址int *lcd_base=NULL; //int---每个像素点占用内存是4Blcd_base = (int *)mmap(NULL, 800*480*4, PROT_READ|PROT_WRITE, MAP_SHARED,fd_lcd, 0);if(lcd_base == NULL)return -2;3.通过显存的首地址,将颜色数据写入显存while(2 * b * b >= r * r) // 1/8圆即可{draw_point(x + a, y - b,color,lcd_base); // 0~1draw_point(x - a, y - b,color,lcd_base); // 0~7draw_point(x - a, y + b,color,lcd_base); // 4~5draw_point(x + a, y + b,color,lcd_base); // 4~3draw_point(x + b, y + a,color,lcd_base); // 2~3draw_point(x + b, y - a,color,lcd_base); // 2~1draw_point(x - b, y - a,color,lcd_base); // 6~7draw_point(x - b, y + a,color,lcd_base); // 6~5a++;num = (a * a + b * b) - r*r;if(num > 0){b--;a--;}}//4.解除显存映射munmap(lcd_base, 800*480*4);//5.关闭液晶屏close(fd_lcd);return 0;
}
实心圆
int draw_circle(int color, int Xpos, int Ypos, int Radius)
{//1.打开液晶屏int fd_lcd;fd_lcd = open("/dev/fb0", O_RDWR);if(fd_lcd == -1 ){perror("open lcd "); //perror()会根据错误码返回出错的原因return -1;}printf("fd_lcd = %d\n", fd_lcd); //2. 显存映射,在应用程序中得到显存的首地址int *lcd_base=NULL; //int---每个像素点占用内存是4Blcd_base = (int *)mmap(NULL, 800*480*4, PROT_READ|PROT_WRITE, MAP_SHARED,fd_lcd, 0);if(lcd_base == NULL)return -2;int x,y,r=Radius;for(y=Ypos - r;y<Ypos +r;y++){for(x=Xpos - r;x<Xpos+r;x++){if(((x-Xpos)*(x-Xpos)+(y-Ypos)*(y-Ypos)) <= r*r){draw_point(x, y,color,lcd_base);}}}//4.解除显存映射munmap(lcd_base, 800*480*4);//5.关闭液晶屏close(fd_lcd);return 0;
}
任意区域矩形
int lcd_color(int color, int sx, int sy, int ex, int ey)
{//1.打开液晶屏int fd_lcd;fd_lcd = open("/dev/fb0", O_RDWR);if(fd_lcd == -1 ){perror("open lcd "); //perror()会根据错误码返回出错的原因return -1;}printf("fd_lcd =%d\n", fd_lcd); //2. 显存映射,在应用程序中得到显存的首地址int *lcd_base=NULL; //int---每个像素点占用内存是4Blcd_base = (int *)mmap(NULL, 800*480*4, PROT_READ|PROT_WRITE, MAP_SHARED,fd_lcd, 0);if(lcd_base == NULL)return -2;//3.通过显存的首地址,将颜色数据写入显存for(int y=sy;y<ey; y++)for(int x=sx;x<ex;x++)*(lcd_base + 800*y+x) = color;//4.解除显存映射munmap(lcd_base, 800*480*4);//5.关闭液晶屏close(fd_lcd);return 0;
}
三角形
int triangle(int x1,int y1,int x2,int y2,int x3,int y3,int col)
{//1.打开液晶屏int fd_lcd;fd_lcd = open("/dev/fb0", O_RDWR);if(fd_lcd == -1 ){perror("open lcd "); //perror()会根据错误码返回出错的原因return -1;}printf("fd_lcd =%d\n", fd_lcd); //2. 显存映射,在应用程序中得到显存的首地址int *lcd_base=NULL; //int---每个像素点占用内存是4Blcd_base = (int *)mmap(NULL, 800*480*4, PROT_READ|PROT_WRITE, MAP_SHARED,fd_lcd, 0);if(lcd_base == NULL)return -2;//flag:代表本三角形在本直线的左边(0)还是右边(1)(左边右边是抽象概念)int i,j,flag1=0,flag2=0,flag3=0;float A1,B1,C1,A2,B2,C2,A3,B3,C3;//1号点与2号点的直线方程的A,B,CA1 = y2 - y1;B1 = x1 - x2;C1 = x2*y1 - x1*y2;//2号点与3号点的直线方程的A,B,CA2 = y2 - y3;B2 = x3 - x2;C2 = x2*y3 - x3*y2;//1号点与3号点的直线方程的A,B,CA3 = y3 - y1;B3 = x1 - x3;C3 = x3*y1 - x1*y3;//判断第三个点与直线的相对位置if(x3*A1+y3*B1+C1 > 0) flag1=1;if(x1*A2+y1*B2+C2 > 0) flag2=1;if(x2*A3+y2*B3+C3 > 0) flag3=1;for(i=0;i<480;i++){for(j=0;j<800;j++){if(flag1 == 1){if(flag2 == 1){if(j*A1+i*B1+C1 > 0 && j*A2+i*B2+C2 > 0 && j*A3+i*B3+C3 < 0){draw_point(j,i,col,lcd_base);}}else{if(flag3 == 1){if(j*A1+i*B1+C1 > 0 && j*A2+i*B2+C2 < 0 && j*A3+i*B3+C3 > 0){draw_point(j,i,col,lcd_base);}}else{if(j*A1+i*B1+C1 > 0 && j*A2+i*B2+C2 < 0 && j*A3+i*B3+C3 < 0){draw_point(j,i,col,lcd_base);}}}}else{if(flag2 == 0){if(j*A1+i*B1+C1 < 0 && j*A2+i*B2+C2 < 0 && j*A3+i*B3+C3 > 0){draw_point(j,i,col,lcd_base);}}else{if(flag3 == 1){if(j*A1+i*B1+C1 < 0 && j*A2+i*B2+C2 > 0 && j*A3+i*B3+C3 > 0){draw_point(j,i,col,lcd_base);}}else{if(j*A1+i*B1+C1 < 0 && j*A2+i*B2+C2 > 0 && j*A3+i*B3+C3 < 0){draw_point(j,i,col,lcd_base);}}}}}}//4.解除显存映射munmap(lcd_base, 800*480*4);//5.关闭液晶屏close(fd_lcd);return 0;
}
五角星
void five_Pointed(int x,int y,int R,unsigned int col,int yDegree)
{struct Vertex{int x;int y;};struct Vertex RVertex[5], rVertex[5]; //外围5个顶点的坐标与内部五个顶点的坐标double rad = 3.1415926 / 180; //每度的弧度值double r = R * sin(18 * rad) / cos(36 * rad); //五角星短轴的长度for (int k = 0; k < 5; k++) //求取坐标{RVertex[k].x = (int)(x - (R * cos((90 + k * 72 + yDegree) *rad)));RVertex[k].y = (int)(y - (R * sin((90 + k * 72 + yDegree) * rad)));rVertex[k].x = (int)(x - (r * cos((90 + 36 + k * 72 + yDegree) *rad)));rVertex[k].y = (int)(y - (r * sin((90 + 36 + k * 72 + yDegree) * rad)));}triangle(RVertex[1].x,RVertex[1].y,RVertex[3].x,RVertex[3].y,rVertex[4].x,rVertex[4].y,col);triangle(RVertex[2].x,RVertex[2].y,RVertex[4].x,RVertex[4].y,rVertex[0].x,rVertex[0].y,col);triangle(RVertex[3].x,RVertex[3].y,RVertex[0].x,RVertex[0].y,rVertex[1].x,rVertex[1].y,col);
}
各国旗帜
int lcd_flag(COUNTRY countryname)
{//1.打开液晶屏int fd_lcd;fd_lcd = open("/dev/fb0", O_RDWR);if(fd_lcd == -1 ){perror("open lcd "); //perror()会根据错误码返回出错的原因return -1;}printf("fd_lcd =%d\n", fd_lcd); //2. 显存映射,在应用程序中得到显存的首地址int *lcd_base=NULL; //int---每个像素点占用内存是4Blcd_base = (int *)mmap(NULL, 800*480*4, PROT_READ|PROT_WRITE, MAP_SHARED,fd_lcd, 0);if(lcd_base == NULL)return -2;switch(countryname){case GERMANY:lcd_color(BLACK, 0, 0, 800, 160);lcd_color(RED, 0, 160, 800, 320);lcd_color(YELLOW, 0, 320,800, 480);break;case FRANCE:lcd_color(BLUE, 0, 0, 240, 480);lcd_color(WHITE, 240, 0, 560, 480);lcd_color(RED, 560, 0, 800, 480);break;case ITALI:lcd_color(GREEN, 0, 0, 240, 480);lcd_color(WHITE, 240, 0, 560, 480);lcd_color(RED, 560, 0, 800, 480);break;case SWISS:lcd_color(RED,0,0,800,480);lcd_color(WHITE,240,160,480,240);lcd_color(WHITE,320,80,400,320);break;case JAPAN:lcd_color(WHITE,0,0,800,480);draw_circle(RED,400,240,80);break;case CHINA:lcd_color(RED,0,0,800,480);five_Pointed(110,150,70,YELLOW,0);five_Pointed(200,60,40,YELLOW,20);five_Pointed(270,130,40,YELLOW,40);five_Pointed(270,230,40,YELLOW,0);five_Pointed(200,290,40,YELLOW,40);break;default:break;}//4.解除显存映射munmap(lcd_base, 800*480*4);//5.关闭液晶屏close(fd_lcd);return 0;
}
main.c
#include <stdio.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h> // 包含 close 函数所需的头文件
#include "lcd.h"int main(void)
{unsigned char state=0;while (1){switch (state){case 0:lcd_color(RED,0,0,800,480);break;case 1:lcd_color(GREEN,0,0,800,480);break;case 2:lcd_color(BLUE,0,0,800,480);break;case 3:lcd_color(YELLOW,0,0,800,480);break;case 4:lcd_color(PURPLE,0,0,800,480);break;case 5:lcd_color(BLACK,0,0,800,480);break;case 6:lcd_color(WHITE,0,0,800,480);break; case 7:lcd_flag(FRANCE);break;case 8:lcd_flag(GERMANY);break;case 9:lcd_flag(ITALI);break;case 10:lcd_flag(SWISS);break;case 11:lcd_flag(JAPAN);break;case 12:lcd_flag(CHINA);break;default:break;}if(++state>12){state=0;}sleep(3);}// lcd_flag(GERMANY);return 0;
}
lcd.h
#define RED 0x00FF0000
#define GREEN 0x0000FF00
#define YELLOW 0x00FFFF00
#define BLUE 0x000000FF
#define BLACK 0x00000000
#define WHITE 0x00FFFFFF
#define PURPLE 0x00800080typedef enum {GERMANY,FRANCE,ITALI,SWISS,JAPAN,CHINA
} COUNTRY;int lcd_color(int color, int sx, int sy, int ex, int ey);
int lcd_flag(COUNTRY countryname);
相关文章:
ARM GEC6818 LCD绘图 实心圆 三角形 五角星 任意区域矩形以及旗帜
要在ARM上实现LCD绘图,可以按照以下步骤进行: 硬件初始化:初始化LCD控制器和相关引脚,配置时钟、分辨率和颜色深度等。 内存映射:将LCD显示区域映射到ARM的内存地址空间中,可以通过ARM的内存映射机制来实现…...
Sentinel-1 Level 1数据处理的详细算法定义(三)
《Sentinel-1 Level 1数据处理的详细算法定义》文档定义和描述了Sentinel-1实现的Level 1处理算法和方程,以便生成Level 1产品。这些算法适用于Sentinel-1的Stripmap、Interferometric Wide-swath (IW)、Extra-wide-swath (EW)和Wave模式。 今天介绍的内容如下&…...
一款永久免费的内网穿透工具——巴比达
近期,一款名为巴比达的内网穿透工具凭借其永久免费的特性,以及卓越的性能与安全性,引起了我的关注。本文将深入探讨巴比达如何通过其独创的技术方案,达到企业级数据通信要求。 WanGooe Tunnel协议 首先,巴比达的核心竞…...
翻译|解开LLMs的神秘面纱:他们怎么能做没有受过训练的事情?
大语言模型(LLMs)通过将深度学习技术与强大的计算资源结合起来,正在彻底改变我们与软件互动的方式。 虽然这项技术令人兴奋,但许多人也担忧LLMs可能生成虚假的、过时的或有问题的信息,他们有时甚至会产生令人信服的幻…...
代码随想录-DAY⑦-字符串——leetcode 344 | 541 | 151
344 思路 没啥好说的, 双指针头尾交换, 相遇结束。 时间复杂度:O(n) 空间复杂度:O(1) 代码 class Solution { public:void reverseString(vector<char>& s) {int left0, rights.size()-1;while(left<right){swa…...
JavaScript(7)——数组
JavaScript中数组的用法与Java差不多,但还是有一些区别 声明数组 语法: let 数组名 [数据1,数据2,数据...] let arr new Array(数据1,数据2,...数据n) 添加数据 数组.push()方法将一个或多个元素添加到数组末尾,并返回该数组新长度 <script>…...
Spark RDD优化
Spark RDD优化 一、分区优化二、持久化优化三、依赖优化四、共享变量优化五、提交模式与运行模式优化六、其他优化 一、分区优化 分区数调整:RDD的分区数可以通过repartition和coalesce方法进行调整。合理的分区数可以提高并行度,但过多的分区会增加管…...
idea:解决Maven报错 Properties in parent definition are prohibited
在父pom文件中定义了 <dhversion>1.0-SNAPSHOT</dhversion> 在子模块中引用 <parent><groupId>com.douhuang</groupId><artifactId>douhuang-springcloud</artifactId><version>${dhversion}</version> </parent&…...
代理IP池:解析与应用
代理IP大家都了解不少了,代理IP池又是什么呢?下面简单介绍一下吧! 1. 概述 代理IP池就是由多个代理IP地址组成的集合,用于实现更高效的网络访问和数据获取。这些IP地址通常来自不同的地理位置和网络提供商,经过动态管…...
MQTT是什么,物联网
写文思路: 以下从几个方面介绍MQTT,包括:MQTT是什么,MQTT和webSocket的结合,以及使用场景, 一、MQTT是什么 MQTT(Message Queuing Telemetry Transport)是一种轻量级的发布/订阅消息…...
分布式训练
一、分布式计算 跟多GPU不同是:数据不是从主存拿的,是在分布式文件系统拿的,有多个工作站,工作站中有多个GPU,通过网络读取数据到GPU中,GPU通过网络接收到来自参数服务器的参数进行运算计算梯度,…...
day10:04一文搞懂decode和decoding的区别
在Python 3中,decode()方法和decoding概念同样与字符串的编码和解码紧密相关,但它们的应用场景和上下文有所不同。下面通过案例来解释它们的关系和区别。 1. decode() 方法 decode()方法是字节串(bytes)类型的一个方法ÿ…...
MechMind结构光相机 采图SDK python调用
测试效果 Mech-Mind结构光相机 Mech Mind(梅卡曼德)的结构光相机,特别是Mech-Eye系列,是工业级的高精度3D相机,广泛应用于工业自动化、机器人导航、质量检测等多个领域。以下是对Mech Mind结构光相机的详细解析: 一、产品概述 Mech Mind的结构光相机,如Mech-Eye PRO,…...
“学习Pandas中时间序列的基本操作“
目录 # 开篇 1. 创建和操作时间序列对象 2. 时间序列数据的读取和存储 3. 时间序列数据的索引和切片 4. 时间序列数据的操作和转换 5. 时间序列数据的可视化 6. 处理时间序列中的缺失值 7. 时间序列数据的聚合和分组 8. 时间序列的时间区间和偏移量操作 示例代码&…...
常用知识碎片 分页组件的使用(arco-design组件库)
目录 分页组件使用 API 组件代码示例 使用思路: 前端示例代码 html script 后端示例代码 Controller Impl xml 总结 分页组件使用 使用Arco Design之前需要配置好搭建前端环境可以看我另外一篇文章: 手把手教你 创建Vue项目并引入Arco Desi…...
WPF 制作一个文字漂浮提示框
WPF好像没有自带的文字提示漂浮,我们可以定制一个。 效果如下: xaml xaml如下: <Window x:Class"GroupServer.MsgTip"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://sc…...
Node.js_fs模块
文件删除 文件重命名和移动(本质都是修改路径) 文件夹操作 创建文件夹(mkdir) 读取文件夹(readdir) (打印出来是该文件夹下名称的数组形式) 读取当前的文件夹(readdir) 删除文件夹 (rmdir) 查看资源状态…...
使用 Vue 3 实现打字机效果
在现代前端开发中,添加一些视觉效果可以提升用户体验。其中,打字机效果是一种常见且吸引人的效果,可以用于展示动态文本。本文将介绍如何在 Vue 3 中实现打字机效果。 实现步骤 1. 创建自定义指令 我们首先创建一个自定义指令 v-typewriter…...
unordered_map和set
前言:本篇文章继续分享新的容器unordered_map和set。前边我们分享过map和set,其底层为红黑树,而unordered_map和set的底层则为哈希表,因此在unordered_map和set的实现中,我们可以效仿许多在map和set的中就分享过的一些…...
java:运用字节缓冲输入流将文件中的数据写到集合中
代码主要是将文本文件中的数据写到集合中,运用到的是java字节缓冲输入流的知识点。 public static void main(String[] args) throws IOException {//创建字符缓冲流输入对象BufferedReader bufferedReader new BufferedReader(new FileReader("student.txt&q…...
【机器学习】支持向量机与主成分分析在机器学习中的应用
文章目录 一、支持向量机概述什么是支持向量机?超平面和支持向量大边距直觉 二、数据预处理与可视化数据集的基本信息导入必要的库加载数据集数据概况数据可视化特征对的散点图矩阵类别分布条形图平均面积与平均光滑度的散点图变量之间的相关性热图 三、模型训练&am…...
SpringBoot项目架构实战之“网关zuul搭建“
第三章 网关zuul搭建 前言: 1、主要功能 zuul主要提供动态路由(内置ribbon实现)和过滤(可以做统一鉴权过滤器、灰度发布过滤器、黑白名单IP过滤器、服务限流过滤器(可以配合Sentinel实现))功能…...
发挥储能系统领域优势,海博思创坚定不移推动能源消费革命
随着新发展理念的深入贯彻,我国正全面落实“双碳”目标任务,通过积极转变能源消费方式,大幅提升能源利用效率,实现了以年均约3.3%的能源消费增长支撑了年均超过6%的国民经济增长。这一成就的背后,是我国能源结构的持续…...
matlab R2016b安装cplex12.6,测试时cplex出现出现内部错误的解决方法
问题场景 网上搜索matlabyalmipcplex的安装教程,跟着步骤操作即可,假如都安装好了,在matlab中测试安装是否成功,出现以下问题: 1、matlab中设置路径中添加了yalmip和cplex路径,在命令窗口中输入yalmiptest…...
C#中的Dictionary
Dictionary<TKey, TValue> 是一个泛型集合,它存储键值对(key-value pairs),其中每个键(key)都是唯一的。这个集合类提供了快速的数据插入和检索功能,因为它是基于哈希表实现的。 注意 ke…...
VSCode中多行文本的快速前后缩进
快捷键 VSCode提供了一组快捷键,用于快速调整选中文本行的缩进。 增加缩进(向前缩进):在Windows和Linux上按 Tab 键,在Mac上按 ⇧⇥(Shift Tab)。减少缩进(向后缩进)&…...
C# 8.0 新语法的学习和使用
C# 8.0 是微软在 2019 年 9 月 23 日随 .NET Core 3.0 一同发布的一个重要版本更新,带来了许多新的语言特性和改进。本文将详细介绍 C# 8.0 的新语法,并通过实际应用案例展示这些新特性的使用方法。 目录 1. 可空引用类型 2. 异步流 3. 默认接口方…...
数据结构——约瑟夫环C语言链表实现
约瑟夫环问题由古罗马史学家约瑟夫(Josephus)提出,他参加并记录了公元66—70年犹太人反抗罗马的起义。在城市沦陷之后,他和40名死硬的将士在附近的一个洞穴中避难。起义者表示“宁为玉碎不为瓦全”,约瑟夫则想“留得青…...
【MyBatis】——入门基础知识必会内容
🎼个人主页:【Y小夜】 😎作者简介:一位双非学校的大二学生,编程爱好者, 专注于基础和实战分享,欢迎私信咨询! 🎆入门专栏:🎇【MySQL࿰…...
react父调用子的方法,子调用父的方法
父调用子的方法 // 子组件 import React, { useRef, useEffect } from react;const ChildComponent ({ childMethodRef }) > {const childMethod useRef(null);useEffect(() > {childMethodRef.current childMethod;}, []);const someMethod () > {console.log(子…...
莱芜人才网/百度推广优化工具
现象 在布线自己写的ddr3压力测试代码时,报如下错误。 [Constraints 18-586]IO constraint DQS_BIAS with a setting of TRUE for cell. [DRC MDRV-1] Multiple Driver Net:Net <const0> has multiple drives:GND/G 解决流程 (1)前期原…...
做网站在哪儿买空间/域名停靠
arduino开发环境配置前言一、获取安装arduino二、HelloWorld工程总结前言 SP32开发环境大致有3种: 1.官方提供的Espressif-IDE 2.arduino开发环境 3.纯linux开发环境 前面用Espressif-IDE搭建了开发环境,这里搭建一个arduino的开发环境。 一、获取安装…...
做网站商城需要多少钱/怎么做网站排名
MySQL 有许多图形化的管理工具,我们在此介绍二个官方的工具「MySQL Administrator」及「MySQL Query Browser」。MySQL Administrator 是用来管理 MySQL Server 用的,您可以查看目前系统状态、新增使用者等。而 MySQL Query Browser 可以用来查看数据库内…...
做海产品的外贸网站/人工智能培训班
mysql开发中文博客:iMySQL | 老叶茶馆 – Oracle MySQL ACE Director,专注MySQL 动态表名列名: delimiter // create procedure oneKey(in newName varchar(250),in oldName varchar(250),in idNum INT) BEGIN SET sqlStmt CONCAT(insert …...
添加网站图标/今日新闻最新头条
叨叨两句 昨天爬了一下午坑才出来的我向大家问好?,要说小程序基础库都1.9了,但是坑还是很多。一方面是由于小程序的文档不是太友好,也许某个地方告诉你了,但是不是那么 容易发现。另一方面,微信大佬手握9亿多用户&…...
长春网站制作价格/百度搜索引擎盘搜搜
为什么80%的码农都做不了架构师?>>> IT技术潮流从来没有想今天这般风云变幻,城头变幻大王旗。对于科技人才来说,这是最好的时代,也是最坏的时代。新技能和工具的不断涌现对个人的学习能力是个极大的挑战,同…...