LCD补充

news2024/11/26 2:50:56

LCD补充

目录

LCD补充

tip:随着我们学的越来越多,代码长度越来越长,编译越来越慢,有没有超过内存是我们比较关心的一件事,通过以下方法可以实时看到写的代码的大小

回顾LCD

LCD补充功能

-- 1、有关在LCD上显示动图,可以用动图拆分软件

-- 2、更改LCD屏幕上显示字体和背景的颜色

-- 3、在LCD屏幕上画圆


tip:随着我们学的越来越多,代码长度越来越长,编译越来越慢,有没有超过内存是我们比较关心的一件事,通过以下方法可以实时看到写的代码的大小

alt text

回顾LCD

-- LCD屏幕的核心:

  • 最重要的就是界面的设计(有专门的UI设计师) 对于产品,一个好看的外壳,一个好看的界面,这些都是很重要的。

  • 屏幕:液晶面板+液晶控制芯片+pcb底板

-- 单片机是和谁通信?和液晶控制芯片通信

-- 液晶控制芯片的型号?ILI9341

-- 双方的通信方式是什么?8080或者spi,但是昨天使用的就是8080

-- 通信过程?8080读写操作(各种操作指令:0x2a,0x2b,0x2c) 

alt text

-- 由于单片机上没有8080,所以又引入了FSMC

-- FSMC的本质是用来扩容的。

-- 那么为什么用FSMC呢?因为FSMC读写时序和8080读写时序接近。
因为单片机上没有8080,但与ILI9341通信必须用8080时序

-- 以上就是昨天LCD的理论内容的简单总结


LCD补充功能

-- 1、有关在LCD上显示动图,可以用动图拆分软件

先在网站上搜一个想要的动图,然后把他拖入动图拆分软件,然后保存,就可以得到一张一张的图片,然后把这些图片另存为jpg格式,然后用图片取模软件,生成.h文件

-- 可以上网搜动图,网上搜的图片改属性,点另存为就可以更改了,也可以截图改图片的属性,随后使用图片取模软件更改大小 

alt text

-- 动图拆分软件 在线GIF图片帧拆分工具 - UU在线工具

-- 在lcd屏幕上显示动图,温度,湿度,时间的代码。注意获取温湿度的代码和获取时间,在lcd上显示数据这三部分的代码最好分开写,避免造成问题。

#include "2.h"
#include "3.h"

const unsigned char *gImage[]={gImage_2,gImage_3};
u8 i=0;

int main()
{
    //pwm_init();
    dht11_init();
    SysTick_Config(72000);
    usart_init();
    //exti_init();
    key_init();
    uint16_t b=100;
    uint8_t keyflag = 0;
    
    adc_init();
    relay_init();
    rtc_init();
    
    
    LCD_Init();//屏幕初始化一定要写到串口初始化后面
    
    LCD_DrawPoint(10,10);
    LCD_ShowString(0,0,80,16,16,"123456qwer");						//宽度字符是汉字的一半,是8,汉字是16,8*10
    //LCD_ShowPhoto(0,16,240,135,(uint8_t *)gImage_1);//必须是



//摄氏度符号的取模显示*************************************************************************
    uint8_t xiang[]=
    {0x60,0x00,0x91,0xF4,0x96,0x0C,0x6C,0x04,0x08,0x04,0x18,0x00,0x18,0x00,0x18,0x00,
    0x18,0x00,0x18,0x00,0x18,0x00,0x08,0x00,0x0C,0x04,0x06,0x08,0x01,0xF0,0x00,0x00};/*"℃",0*/
    
    //1对应的黑色
    uint16_t cnttt = 0;
    for(uint8_t i=0;i<32;i++) {
        for(uint8_t j=0;j<8;j++) {
            if((xiang[i] & (1<<(7-j))) != 0) {
                LCD_DrawPoint(cnttt%16+80, cnttt/16+16);
            }
            cnttt++;	
        }
    }
//*************************************************************************	

    
    
    
    while(1)
    {
        
        if(lcdtime >= 200)
        {
            lcdtime = 0;
            LCD_ShowPhoto(0,80,98,100,(uint8_t *)gImage[i++]);
            if(i>=2)i=0;
            sprintf(D_wen, "tem: %.2f℃",dht.tem);
            sprintf(D_shi, "hum: %.2f%RH", dht.hum);
            //printf("tem:%.2f℃\r\n",dht.tem);
            LCD_ShowString(0,16,strlen(D_wen)*8,16,16,D_wen);
            LCD_ShowString(0,32,120,16,16,D_shi);
        }
        
        if(dhtime >=2000)
        {
            dhtime =0 ;
            get_dht11_val();
        }
        
        
        if(rtctime >=999)
        {
            rtctime = 0;
            get_time();
            
            sprintf(D_time, "%04d/%02d/%02d   %02d:%02d:%02d",a.tm_year+1900,a.tm_mon+1,a.tm_mday,a.tm_hour+8,a.tm_min,a.tm_sec);
            
            LCD_ShowString(0,48,180,16,16,D_time);
        }
    }
}
        


-- 效果图 

alt text

-- 补充:各种图标
iconfont-阿里巴巴矢量图标库


-- 2、更改LCD屏幕上显示字体和背景的颜色

-- 首先更改官方函数,先找到显示字符串的函数 

alt text

-- 然后更改函数,为了使我们更加方便的更改颜色,直接定义两个变量。先复制原来的官方函数然后更改函数名,在函数中添加两个变量,然后更改函数内容 

alt text

//改变颜色
void LCD_ShowCharColor(u16 x,u16 y,u8 num,u8 size,u8 mode,u16 P_COLOR,u16 B_COLOR)
{  							  
  u8 temp,t1,t;
    u16 y0=y;
    u8 csize=(size/8+((size%8)?1:0))*(size/2);		//得到字体一个字符对应点阵集所占的字节数	
    num=num-' ';//得到偏移后的值(ASCII字库是从空格开始取模,所以-' '就是对应字符的字库)
    for(t=0;t<csize;t++)
    {   
        if(size==12)temp=asc2_1206[num][t]; 	 	//调用1206字体
        else if(size==16)temp=asc2_1608[num][t];	//调用1608字体
        else if(size==24)temp=asc2_2412[num][t];	//调用2412字体
        else return;								//没有的字库
        for(t1=0;t1<8;t1++)
        {			    
            if(temp&0x80)LCD_Fast_DrawPoint(x,y,P_COLOR);							//最后一个参数是颜色
            else if(mode==0)LCD_Fast_DrawPoint(x,y,B_COLOR);
            temp<<=1;
            y++;
            if(y>=lcddev.height)return;		//超区域了
            if((y-y0)==size)
            {
                y=y0;
                x++;
                if(x>=lcddev.width)return;	//超区域了
                break;
            }
        }  	 
    }  	    	   	 	  
}   

-- 之后再将改过的函数放进显示字符串的函数中,同样加上显示颜色的变量。

void LCD_ShowStr(u16 x,u16 y,u8 size,u8 *p,u16 P_COLOR,u16 B_COLOR)
{         
    u8 x0=x;
    while((*p<='~')&&(*p>=' '))		//判断是不是非法字符!
    {  
            //LCD_ShowChar(x,y,*p,size,0);
        
        LCD_ShowCharColor(x,y,*p,size,0,P_COLOR,B_COLOR);
            p++;
            x+=size/2;
        
        if(x>(240-size/2))					//这一行写满了,该换行了
        {
            y+=size;
            x=0;//从头开始/				/也可以x=x0给一个起点坐标
        }
    }  
}

-- 最后在主函数中更改显示的颜色即可

    if(rtctime >=999)
    {
        rtctime = 0;
        get_time();
        
        sprintf(D_time, "%04d/%02d/%02d   %02d:%02d:%02d",a.tm_year+1900,a.tm_mon+1,a.tm_mday,a.tm_hour+8,a.tm_min,a.tm_sec);
        
        LCD_ShowString(0,48,180,16,16,D_time);
    }


    if(dhtime >=2000)
    {
        dhtime =0 ;
        get_dht11_val();
    }


    if(lcdtime >= 2000)
    {
        lcdtime =0 ;
        
        sprintf(D_wen, "tem: %.2f℃",dht.tem);
        sprintf(D_shi, "hum: %.2f%RH", dht.hum);
        //printf("tem:%.2f℃\r\n",dht.tem);
        LCD_ShowString(0,16,strlen(D_wen)*8,16,16,D_wen);	
        LCD_ShowStr(0,32,16,D_shi,RED,YELLOW);//改变颜色的显示字符串
    }

-- 效果图 

alt text

-- 3、在LCD屏幕上画圆
  • 在bsp_lcd.c文件中,添加函数,并在.h文件中声明
//在LCD屏幕上画圆--------------------------------------------------------------------------------------
void LCD_Draw_ColorPoint(u16 x,u16 y,u16 P_COLOR)
{
    LCD_SetCursor(x,y);		//设置光标位置 
    LCD_WriteRAM_Prepare();	//开始写入GRAM
    LCD->LCD_RAM=P_COLOR; 
}



void LCD_Draw_ColorCircle(uint16_t x, uint16_t y, uint16_t r,u16 P_COLOR)
{
    /* Bresenham画圆算法 */
    int16_t a = 0, b = r;
    int16_t d = 3 - (r << 1);		//算法决策参数
        
    /* 如果圆在屏幕可见区域外,直接退出 */
    if (x - r < 0 || x + r > 480 || y - r < 0 || y + r > 800) 
                return;
        
    /* 开始画圆 */
    while(a <= b)
    {
        LCD_Draw_ColorPoint(x - b, y - a,P_COLOR);
        LCD_Draw_ColorPoint(x + b, y - a,P_COLOR);
        LCD_Draw_ColorPoint(x - a, y + b,P_COLOR);
        LCD_Draw_ColorPoint(x - b, y - a,P_COLOR);
        LCD_Draw_ColorPoint(x - a, y - b,P_COLOR);
        LCD_Draw_ColorPoint(x + b, y + a,P_COLOR);
        LCD_Draw_ColorPoint(x + a, y - b,P_COLOR);
        LCD_Draw_ColorPoint(x + a, y + b,P_COLOR);
        LCD_Draw_ColorPoint(x - b, y + a,P_COLOR);
        a++;

        if(d < 0)
            d += 4 * a + 6;
        else
        {
            d += 10 + 4 * (a - b);
            b--;
        }

        LCD_Draw_ColorPoint(x + a, y + b,P_COLOR);
    }
}

-- main.c


LCD_Init();

LCD_Draw_ColorCircle(120,120,85,RED);

-- 效果图 

alt text

-- 可以参考该文章



【玩转嵌入式屏幕显示】(三)TFT-LCD屏幕打点 + 画线 + 画矩形 + 画圆Bresenham算法实现(基于打点函数,算法可移植到任何屏幕的驱动程序之上)_51CTO博客_嵌入式lcd显示圆形

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

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

相关文章

Python库matplotlib之九

Python库matplotlib之九 动画ArtistAnimation构造器成员函数应用例子 动画 Matplotlib基于其绘图功能&#xff0c;还提供了一个使用动画模块&#xff0c;生成动画的接口。动画是一系列帧&#xff0c;其中每个帧对应于图形上的一个图。 Matplotlib使用两个类来实现动画&#x…

ordinaryroad-barrage-fly wsl部署记录

系统&#xff1a;win11 wsl版本&#xff1a;wsl2 Linux&#xff1a;Ubuntu 22.04.4 LTS 文档&#xff1a;https://barragefly.ordinaryroad.tech/deploy/#_2-1-docker-compose docker相关的内容自己事先安装好 git clone https://github.com/OrdinaryRoad-Project/ordinaryr…

TensorBoard

1、概念 TensorBoard可以看作是一个“训练监控仪表盘”&#xff0c;可以 将训练过程中的数据可视化&#xff0c;让你通过图表直观地看到模型的表现&#xff0c; 识别问题&#xff0c;并进行调试和优化。 TensorFlow是用来训练模型的深度学习框架&#xff0c;在使用tensorflo…

基于SpringBoot+Vue的疫情物资管理系统(带1w+文档)

基于SpringBootVue的疫情物资管理系统(带1w文档) 基于SpringBootVue的疫情物资管理系统(带1w文档) 本课题研究和开发疫情物资管理系统管理系统&#xff0c;让安装在计算机上的该系统变成管理人员的小帮手&#xff0c;提高疫情物资管理系统信息处理速度&#xff0c;规范疫情物资…

内网wordpress更换IP后无法访问的解决办法

一、现象 一台装有wordpress的台式机&#xff0c;从一个校区移到了另一个校区&#xff0c;更换了IP地址&#xff0c;导致无法正常访问。 二、分析 安装wordpress的时候里面的ip&#xff08;或域名&#xff09;都已固定。安装好后&#xff0c;内网通过IP访问&am…

基于Maven 运行OpenRewrite的快速示例

本篇介绍一个基于Maven 运行OpenRewrite 的快速示例&#xff0c;展示了如何在Maven项目中使用OpenRewrite 进行代码重构。 本篇达成的效果是使用OpenRewrite 对源码自动格式化。 达成效果期望 项目中有一个类AutoFormatDemo &#xff0c;类的代码如下 public class AutoFor…

ubuntu24 root用户修改密码 ubuntu新系统没有创建root用户

ubuntu 系统在虚拟机新建一个ubuntu24&#xff0c;但是在配置系统时候&#xff0c;并没有配置root密码&#xff0c;只是新增了一个自定义账号于密码&#xff0c;在创建好后&#xff0c;可以登录系统&#xff0c;设置root密码~ 1. ubuntu系统初始化后&#xff0c;登录自建账号 …

Nullinux:一款针对Linux操作系统的安全检测工具

关于Nullinux Nullinux是一款针对Linux操作系统的安全检测工具&#xff0c;广大研究人员可以利用该工具针对Linux目标设备执行网络侦查和安全检测。 该工具可以通过SMB枚举目标设备的安全状况信息&#xff0c;其中包括操作系统信息、域信息、共享信息、目录信息和用户信息。如…

C# 结构和类

要点&#xff1a; 1、结构概述 2、结构的使用 一 为什么需要结构 问题&#xff1a; System.Drawing.Color有很多颜色值&#xff0c;它是一个枚举吗&#xff1f; 正常人眼可分辨的颜色种类可达几十万种以上 Color提供使用RGB值返回颜色的方法 FromArgb() System.Drawing.Col…

LabVIEW开关磁阻电机特性测量系统

基于LabVIEW软件和特定硬件组件的开关磁阻电机&#xff08;SRM&#xff09;特性测量系统&#xff0c;结合多功能数据采集卡&#xff0c;统能够准确地测量并分析SRM的电磁特性&#xff0c;从而支持电机模型的精确建立和性能优化。 项目背景 在工业生产和家用电器领域&#xff0…

电子取证新视角:USB键盘流量提取密码方法研究与实现

0x01 引言 在当今数字化时代&#xff0c;USB设备的广泛使用使得信息安全和电子取证领域面临着新的挑战与机遇。特别是USB键盘&#xff0c;作为一种常见的输入设备&#xff0c;其流量中可能包含用户输入的敏感信息&#xff0c;如密码和其他私人数据。因此&#xff0c;研究USB键…

数据治理:制造企业转型的关键要素与战略需求

制造业&#xff0c;作为国民经济的主体&#xff0c;是立国之本、兴国之器、强国之基。从工业文明的曙光初现&#xff0c;到今日全球化的激烈竞争&#xff0c;始终昭示着一个真理&#xff1a;没有强大的制造业&#xff0c;就没有国家和民族的强盛。 为全面推进制造强国建设&…

Qt初识_项目文件解析

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 Qt初识_项目文件解析 收录于专栏【Qt开发】 本专栏旨在分享学习Qt的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 1. pro文件解析 2.…

跟着深度学习好书实践tensorflow神经网络

前言 2024 年诺贝尔物理学奖授予了约翰霍普菲尔德 &#xff08;John Hopfield&#xff09;和图灵奖得主、AI教父杰弗里辛顿&#xff08;Geoffrey Hinton&#xff09;&#xff0c;"以表彰他们利用人工神经网络进行机器学习的奠基性发现和发明"。 辛顿在接受电话采访…

基于Handsontable.js + Excel.js实现表格预览和导出功能(公式渲染)

本文记录在html中基于Handsontable.js Excel.js实现表格预览功能。 Handsontable官方文档 一、开发前的准备引入相关依赖库 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" co…

openpdf

1、简介 2、示例 2.1 引入依赖 <dependency><groupId>com.github.librepdf</groupId><artifactId>openpdf</artifactId><version>1.3.34</version></dependency><dependency><groupId>com.github.librepdf</…

正点原子STM32F407ZG 开发板简介

1. STM32F407ZG 学习资料 1&#xff09;ST 官方的学习资料 ST 官方资料有两个网址&#xff1a; www.stmcu.org.cn 和 www.st.com 。 www.stmcu.org.cn 是 ST 中文社区&#xff0c;里面的资料全部由 ST 中国区的人负责更新和整理&#xff0c;包含了所有 ST 公司的 …

计算机的错误计算(一百二十)

摘要 探讨在许多应用中出现的函数 的计算精度问题。 例1. 考虑在许多应用中出现的函数 计算 不妨在Python下计算&#xff1a; 若用下列Rust代码在线计算&#xff1a; fn f(x: f64) -> f64 {(x.exp() - 1.0) / x }fn main() {let result f(0.9e-13);println!("…

微知-Bluefield DPU命名规则各字段作用?BF2 BF3全系列命名大全

文章目录 背景字段命名C是bmc的意思NOT的N是是否加密S表示不加密但是secureboot enable倒数第四个都是E倒数第五个是速率 V和H是200GM表示E serials&#xff0c;H表示P serials&#xff08;区别参考兄弟篇&#xff1a;[more](https://blog.csdn.net/essencelite/article/detail…

【通信协议讲解】单片机基础重点通信协议解析与总结(IIC,CAN,MODBUS...)

目录 一.IIC总线 基础特性&#xff1a; 配置特性&#xff1a; 时序特性&#xff1a; 二.SPI总线 基础特性&#xff1a; 配置特性&#xff1a; 时序特性&#xff1a; 三.串口通信 基础特性&#xff1a; 配置特性&#xff1a; 时序特性&#xff1a; 四.CAN总线 基础特性…