LCD屏的应用

news2024/11/17 17:27:42

一、LCD屏应用

Linux下一切皆文件,我们的LCD屏再系统中也是一个文件,设备文件:/dev/fb0。

如果要在LCD屏显示数据,那我们就可以把数据写入LCD屏的设备文件。

1.显示颜色块

LCD屏分辨:800*480 像素 32位:说明一个像素点占4个字节,ARGB A:透明度 R:红 G:绿 B:蓝

在LCD屏上显示一种颜色,代码实现步骤:

1、打开LCD屏设备文件

2、准备颜色数据

3、写入数据

4、关闭文件

练习1:再LCD屏显示一种颜色

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

int main() {
    
    //打开LCD屏
    int lcd_fd = open("/dev/fb0", O_RDWR);
    if (lcd_fd == -1) {
        perror("open lcd failed!\n");
        return -1;
    }

    //写颜色数据到fb0
    int red = 0x00ff0000;
    int green = 0x0000ff00;
    int n;
    for(n=0; n<800*480; n++)
    {
         write(lcd_fd, &red, 4);
    }

    //关闭文件
    close(lcd_fd);
    return 0;

}

练习2:显示俄国的国旗(横屏显示)

练习3:显示法国的国旗(竖屏显示)

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

int main(void)
{
	int fd_lcd;
	int lcd_buf[800*480]; //显存。int -- 4B
	int j,i;
	fd_lcd = open("/dev/fb0", O_WRONLY);
	if(fd_lcd == -1)
	{
		perror("open lcd");
		return -1;
	}
	printf("fd_lcd = %d\n", fd_lcd);
	
	for(j=0;j<480;j++)//蓝296,白240,红264
	{
		for(i=0;i<296;i++)	lcd_buf[j*800+i]=0x000000FF;
		for(i=296;i<536;i++)  lcd_buf[j*800+i]=0x00FFFFFF;
		for(i=536;i<800;i++) lcd_buf[j*800+i]=0x00FF0000;
	}
	write(fd_lcd,lcd_buf,sizeof(lcd_buf));
	close(fd_lcd);
	return 0;
}



思考:如何显示圆球

3、显示圆球

圆的方程式:(x-x0)*(x-x0) + (y-y0)*(y-y0) = r*r

其中(x0,y0)是圆心坐标,r是半径

x0=400,y0=240,r=100

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

int main() {
    
    //打开LCD屏
    int lcd_fd = open("/dev/fb0", O_RDWR);
    if (lcd_fd == -1) {
        perror("open lcd failed!\n");
        return -1;
    }

    //写颜色数据到fb0
    int red = 0x00ff0000;
    int green = 0x0000ff00;
    int blue = 0x000000ff;
    int x,y;
    int x0 = 400,y0 = 240,r = 100;
    for(y=0; y<480; y++)
    {
        for(x=0; x<800; x++)
        {
            if((x-x0)*(x-x0) + (y-y0)*(y-y0) <= r*r)
            {
                write(lcd_fd, &blue, 4);
            }
            else
            {
                write(lcd_fd, &red, 4);
            }

        }
        
    }

    //关闭文件
    close(lcd_fd);
    return 0;

}

练习4:再LCD屏显示一个圆球

练习5:在LCD屏显示一个彩虹

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

int lcd_fd = -1;     //帧缓冲文件描述符
int * plcd = NULL;//帧缓冲设备


//屏幕初始化
void CH_init()
{
int fd = open("/dev/fb0",O_RDWR);
if(fd==-1)
{
perror("open pingmv shibai");
}
lcd_fd = fd;
plcd = mmap(NULL,800*480*4,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);//映射到屏幕
}

//画点函数
void huadian(int x0, int y0, int color)
{
if (x0 >= 0 && x0 < 480&&y0 >= 0 && y0 < 800  )
    {
        *(plcd + x0 * 800 + y0) = color;
    }
}

//白屏
void chushihua()
{
    int color = 0xffffffff;
    for(int i = 0;i<480;i++)
    {
        for(int j = 0;j<800;j++)
        {
             huadian(i,j,color);
        }
    }
}
     
 
//画圆函数
void huayuan()
{
int color[800*480]={0};
for(int i=0;i<480;i++)
{
for(int j=0;j<800;j++)
    {
    if((i-480)*(i-480)+(j-400)*(j-400)>122500 && (i-480)*(i-480)+(j-400)*(j-400)<160000) 
        {
            huadian(i,j,0x0F0FFaa0);
        }
    if((i-480)*(i-480)+(j-400)*(j-400)>90000 && (i-480)*(i-480)+(j-400)*(j-400)<122500) 
        {
            huadian(i,j,0x0F0F0F00);
        }
    if((i-480)*(i-480)+(j-400)*(j-400)>62500 && (i-480)*(i-480)+(j-400)*(j-400)<90000) 
        {
            huadian(i,j,0x0F0FFFF0);
        }
    }
}
}


//关闭屏幕
void guanbi_init()
{
munmap(plcd,800*480*4);
plcd = NULL;
close(lcd_fd);
}

int main()
{
CH_init();
chushihua();
huayuan();
guanbi_init();
}

练习6:在LCD屏显示一个太极图

#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include <sys/mman.h>
#include<unistd.h>
#include<math.h> 
int *plcd = NULL;
#define WHITE 0x00FFFFFF 
#define BLAK 0x00000000 
void draw_point(int x, int y, int color)
{
	if (x >= 0 && x<800 && y >= 0 && y<480)
	{
		*(plcd + y * 800 + x) = color;
	
	}
}
 
void draw_circle(int x, int y,double r ,int color)
{
	if (x >= 0 && x<480 && y >= 0 && y<800)
	{
		for (double i = 0; i < 480; i++)
    {
		for (double j = 0; j < 800; j++)
			{
				double all=(i-x)*(i-x)+(j-y)*(j-y);
				double fc=sqrt(all);
				if(r>fc)
				{
						draw_point(j, i, color);
					//	printf("fc=%lf\n",fc);
				}
			}
	}
	
	}
}
 
void draw_circle_b(int x, int y,double r ,int color)
{
	if (x >= 0 && x<480 && y >= 0 && y<800)
	{
		for (double i = 0; i < 480; i++)
    {
		for (double j = 0; j < 800; j++)
			{
				if(i<x){
					double all=(i-x)*(i-x)+(j-y)*(j-y);
					double fc=sqrt(all);
					if(r>fc)
					{
						draw_point(j, i, color);
					//	printf("fc=%lf\n",fc);
					}					
				}
			}
	}
	
	}
}
 
void clear(int color)
{
	int x,y;
	for(y=0;y<480;y++)
	{
		for(x=0;x<800;x++)
		{
			draw_point(x,y,color);
		}
	}
}
 
int main()
{
	int lcd_fd = open("/dev/fb0",O_RDWR);
	if (lcd_fd == -1)
	{
		perror("open lcd fail");
	}
	plcd = mmap(NULL, 800 * 480 * 4, PROT_READ | PROT_WRITE, MAP_SHARED,lcd_fd,0);
	if (plcd==NULL)
	{
		perror("mmao  fail");
	}
	int color = 0x0000FFFF;
	
    clear(0x00666666);
	draw_circle(240, 400,200, BLAK);
	draw_circle_b(240, 400,200, WHITE);
    draw_circle(240, 300,100, WHITE); 
    draw_circle(240, 500,100, BLAK); 
    draw_circle(240, 300,25, BLAK); 
    draw_circle(240, 500,25, WHITE); 
 
//	draw_circle(240, 400,50, color);  
	close(lcd_fd);
	munmap(plcd,800*480*4);
	return 0;
}
 
 
 
 
 

回去准备图片

bmp格式,分辨率800*480,24位,1.09M

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1521927.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一文搞懂PCL中自定义点云类型的构建与函数使用

上周猛男快乐开发时遇到个bug&#xff0c;要用pcl的函数对自定义的点云进行处理。一起解决问题时遇到了很多问题&#xff0c;解决后整理出来分享给各位参考&#xff0c;以免踩一样的坑&#x1f60a;。文章中自定义的点我用PointT来表示&#xff0c;自定义点云一般指的是pcl::Po…

C++:类之六脉神剑——默认成员函数

个人主页&#xff1a;日刷百题 系列专栏&#xff1a;〖C/C小游戏〗〖Linux〗〖数据结构〗 〖C语言〗 &#x1f30e;欢迎各位→点赞&#x1f44d;收藏⭐️留言&#x1f4dd; ​ ​ 一、默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为 空类 。 空类中真的什么都…

linux最佳入门(笔记)

1、内核的主要功能 2、常用命令 3、通配符&#xff1a;这个在一些启动文件中很常见 4、输入/输出重定向 意思就是将结果输出到别的地方&#xff0c;例如&#xff1a;ls标准会输出文件&#xff0c;默认是输出到屏幕&#xff0c;但是用>dir后&#xff0c;是将结果输出到dir文…

复习 --- windows 上安装 git,使用相关命令

文章目录 很少使用windows的git工具&#xff0c;这次借助这个任务&#xff0c;记录下使用过程&#xff0c;其他的等有空在整理。 其中&#xff0c;还使用了浏览器的AI小助手&#xff0c;复习了git相关的命令&#xff1a;图片放最后

Python中字符串知识点汇总,以及map()函数的使用

1.字符串的定义 字符串&#xff1a;字符串就是一系列字符。在python中&#xff0c;用引号括起来的都是字符串&#xff0c;其中的引号可以是单引号&#xff0c;也可以是双引号。 2.使用方法修改字符串的大小写 ①将字符串的字母全部改为大写&#xff1a;upper()函数 实例&…

集合系列(四) -LinkedHashMap详解

一、摘要 在集合系列的第一章&#xff0c;咱们了解到&#xff0c;Map的实现类有HashMap、LinkedHashMap、TreeMap、IdentityHashMap、WeakHashMap、Hashtable、Properties等等。 本文主要从数据结构和算法层面&#xff0c;探讨LinkedHashMap的实现。 二、简介 LinkedHashMap可…

欧科云链:ETH Dencun升级倒计时,哪些数据需要重点关注?

2024年3月13日 21:55&#xff08;epoch 269,568&#xff09;&#xff0c;以太坊将完成坎昆-德内布升级 &#xff08;Dencun 升级&#xff09;&#xff0c;OKLink 专题数据页传送门 &#x1f449; oklink.com/eth/dencun-upgrade 此次升级的主要目标是提升 Layer 2 网络的可扩展…

排序链表的三种写法

题目链接&#xff1a;https://leetcode.cn/problems/sort-list/?envTypestudy-plan-v2&envIdtop-100-liked 第一种&#xff0c;插入排序&#xff0c;会超时 class Solution {public ListNode sortList(ListNode head) {//插入排序&#xff0c;用较为简单的方式解决ListNo…

实现MySQL分页查询的三种方式~

首先我们先来查看一下表中的所有数据&#xff1a; select * from user;如下所示&#xff0c;有5条&#xff1a; 第一种方法&#xff1a; 使用LIMIT和OFFSET关键字 -- 从第1条开始取3条记录&#xff08;第一页&#xff09; SELECT * FROM user LIMIT 3 OFFSET 0; 输出如下所…

RTP 控制协议 (RTCP) 反馈用于拥塞控制

摘要 有效的 RTP 拥塞控制算法&#xff0c;需要比标准 RTP 控制协议(RTCP)发送方报告(SR)和接收方报告(RR)数据包提供的关于数据包丢失、定时和显式拥塞通知 (ECN) 标记的更细粒度的反馈。 本文档描述了 RTCP 反馈消息&#xff0c;旨在使用 RTP 对交互式实时流量启用拥塞控制…

Hack The Box-Jab

目录 信息收集 nmap enum4linux 服务信息收集 Pidgin kerbrute hashcat 反弹shell & get user 提权 系统信息收集 端口转发 漏洞利用 get root 信息收集 nmap 端口探测┌──(root㉿ru)-[~/kali/hackthebox] └─# nmap -p- 10.10.11.4 --min-rate 10000 -oA…

Linux中udp服务端,客户端的开发

UDP通信相关函数&#xff1a; ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen); 函数说明&#xff1a;接收信息 参数说明&#xff1a;sockfd:套接字buf:要接收的缓冲区len:缓冲区…

UCORE 清华大学os实验 lab0 环境配置

打卡 lab 0 &#xff1a; 环境配置 &#xff1a; 首先在ubt 上的环境&#xff0c;可以用虚拟机或者直接在windows 上面配置 然后需要很多工具 如 qemu gdb cmake git 就是中间犯了错误&#xff0c;误以为下载的安装包&#xff0c;一直解压不掉&#xff0c;结果用gpt 检查 结…

基于springboot实现小区物业管理系统项目【项目源码+论文说明】

基于springboot实现小区物业管理系统演示 摘要 随着城镇人口居住的集中化加剧 &#xff0c;传统人工小区管理模式逐渐跟不上时代的潮流。这就要求我们提供一个专门的管理系统。来提高物管的工作效率、为住户提供更好的服务。 物业管理系统运用现代化的计算机管理手段,使物业的…

应用程序开发教学:医保购药系统源码搭建实战

医保购药系统作为医疗服务的重要组成部分&#xff0c;其开发不仅能够为患者提供更加便捷的购药服务&#xff0c;还能够提高医疗机构的管理效率。接下来&#xff0c;小编将为您讲解医保购药系统的源码搭建过程&#xff0c;介绍应用程序开发的基本步骤和技巧。 一、系统设计 我…

手搭手RocketMQ重试机制

环境介绍 技术栈 springbootmybatis-plusmysqlrocketmq 软件 版本 mysql 8 IDEA IntelliJ IDEA 2022.2.1 JDK 17 Spring Boot 3.1.7 dynamic-datasource 3.6.1 mybatis-plus 3.5.3.2 rocketmq 4.9.4 加入依赖 <dependencies><dependency><…

柚见十三期(优化)

前端优化 加载匹配功能与加载骨架特效 骨架屏 : vant-skeleton index.vue中 /** * 加载数据 */ const loadData async () > { let userListData; loading.value true; //心动模式 if (isMatchMode.value){ const num 10;//推荐人数 userListData await myA…

【MySQL】5. 数据类型

数据类型 1. 数据类型分类 2. 数值类型 2.1 tinyint类型 数值越界测试&#xff1a; mysql> use tt; Database changed mysql> create table t1(-> num tinyint-> ); Query OK, 0 rows affected (0.01 sec)mysql> insert into t1 values(-128); Query OK, 1 r…

【JVM】GCRoot

GC root原理 通过对枚举GCroot对象做引用可达性分析&#xff0c;即从GC root对象开始&#xff0c;向下搜索&#xff0c;形成的路径称之为 引用链。如果一个对象到GC roots对象没有任何引用&#xff0c;没有形成引用链&#xff0c;那么该对象等待GC回收。 可以作为GC Roots的对…

倒计时30,28天

1.队列Q (nowcoder.com) //1. #include<bits/stdc.h> using namespace std; #define int long long const int N2e56; const int inf0x3f3f3f3f; int dir[13]{0,31,28,31,30,31,30,31,31,30,31,30,31}; const double piacos(-1.0); int a[N],b[N]; bool cmp(int xx,int …