Arduino UNO 驱动1.8 TFT屏幕显示中文
背景
最近入手了一块1.8寸的tft屏幕,通过学习文档,已经掌握了接线,显示英文、数字、矩形区域、划线、画点等操作, 但是想显示中文的时候操作比较复杂。
问题
1、arduino uno 驱动这款屏幕目前使的是自带的<TFT.h> 库操作比较简单,不带中文百度很多内容都是espTFT库,对于arduion uno 来说不太适用,超内存了。
2、需要引入u8j2库,操作复杂。
解决措施
tft屏幕可以实现再对应的坐标画点,因此知道中文或者图案的内容,再对应的像素点上画点,就能实现想要的内容,处理如下
1、PCtoLCD2002 完美版,进行汉字取模

注意取模配置如上图所示红框所示,一个汉字的像素是16*16,液晶屏幕上的每个点,可以按需求修改。
生成的字模数据如下
"我" :0x04, 0x40, 0x0E, 0x50, 0x78, 0x48, 0x08, 0x48, 0x08, 0x40, 0xFF, 0xFE, 0x08, 0x40, 0x08, 0x44, 0x0A, 0x44, 0x0C, 0x48, 0x18, 0x30, 0x68, 0x22, 0x08, 0x52, 0x08, 0x8A, 0x2B, 0x06, 0x10, 0x02
一个汉字:一共是32个 16进制的数据数组,取模逐行的话,则两位16进制代表一行,例如:0x04,0x40 的二进制是 00000100,01000000是一个汉字的第一行。
第一行(16) 0x04,0x40
第一行(2) 00000100,01000000
第二行(16) 0x0E,0x50
第二行(2) 00001110,01010000

讲到这里原理就很明白了,把转出来的2进制进行遍历,遇到1时 就在屏幕上画点 TFTscreen.point(x, y);,但是需要注意的时,每处理2个16进制的数据,液晶上就需要换行,即Y轴坐标+1,横向扫描时,每扫描一个,X轴坐标+1,一个汉字最多加到16就要换行,这就是核心逻辑
#include <TFT.h>/*Arduino TFT text exampleThis example demonstrates how to draw text on theTFT with an Arduino. The Arduino reads the valueof an analog sensor attached to pin A0, and writesthe value to the LCD screen, updating everyquarter second.This example code is in the public domainCreated 15 April 2013 by Scott Fitzgeraldhttp://www.arduino.cc/en/Tutorial/TFTDisplayText*/#include <TFT.h> // Arduino LCD library
#include <SPI.h>// pin definition for the Uno
#define cs 10
#define dc 9
#define rst 8// pin definition for the Leonardo
// #define cs 7
// #define dc 0
// #define rst 1// create an instance of the library
TFT TFTscreen = TFT(cs, dc, rst);int xPos = 80;
int yPos = 64;// direction and speed
int xDir = 1;
int yDir = 1;// variables to keep track of the point's location
int xPrev = xPos;
int yPrev = yPos;int counter = 0;
// char array to print time
char printout[4];// 我
const byte wo[] = {0x04, 0x40, 0x0E, 0x50, 0x78, 0x48, 0x08, 0x48, 0x08, 0x40, 0xFF, 0xFE, 0x08, 0x40, 0x08, 0x44, 0x0A, 0x44, 0x0C, 0x48, 0x18, 0x30, 0x68, 0x22, 0x08, 0x52, 0x08, 0x8A, 0x2B, 0x06, 0x10, 0x02
};const byte ai[] = {0x00, 0x08, 0x01, 0xFC, 0x7E, 0x10, 0x22, 0x10, 0x11, 0x20, 0x7F, 0xFE, 0x42, 0x02, 0x82, 0x04,0x7F, 0xF8, 0x04, 0x00, 0x07, 0xF0, 0x0A, 0x10, 0x11, 0x20, 0x20, 0xC0, 0x43, 0x30, 0x1C, 0x0E
};const byte ni[] = {0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x11, 0xFE, 0x11, 0x02, 0x32, 0x04, 0x34, 0x20, 0x50, 0x20,0x91, 0x28, 0x11, 0x24, 0x12, 0x24, 0x12, 0x22, 0x14, 0x22, 0x10, 0x20, 0x10, 0xA0, 0x10, 0x40
};
const byte zhong[] = {0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x3F, 0xF8, 0x21, 0x08, 0x21, 0x08, 0x21, 0x08,0x21, 0x08, 0x21, 0x08, 0x3F, 0xF8, 0x21, 0x08, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00
};const byte guo[] = {0x00, 0x00, 0x7F, 0xFC, 0x40, 0x04, 0x40, 0x04, 0x5F, 0xF4, 0x41, 0x04, 0x41, 0x04, 0x4F, 0xE4,0x41, 0x04, 0x41, 0x44, 0x41, 0x24, 0x5F, 0xF4, 0x40, 0x04, 0x40, 0x04, 0x7F, 0xFC, 0x40, 0x04
};#define CHAR_WIDTH 16
#define CHAR_HEIGHT 16void setup() {// Put this line at the beginning of every sketch that uses the GLCD:TFTscreen.begin();// clear the screen with a black backgroundTFTscreen.background(0, 0, 0);// write the static text to the screen// set the font color to whiteTFTscreen.stroke(255, 255, 255);//TFTscreen.loadFont(str1);Serial.begin(9600);
}void loop() {// set the font colorTFTscreen.stroke(255, 255, 255);TFTscreen.setTextSize(1);// // write the text to the top left corner of the screen// TFTscreen.text("Hello 2025", 0, 0);// TFTscreen.text("Goodbye 2024 ", 1, 20);// // delay(250);// TFTscreen.stroke(0, 128, 0);// TFTscreen.text("cxk", 20, 30);// // 画个线(x,y,end:x,end:y)// TFTscreen.stroke(255, 0, 0);// TFTscreen.line(0, 0, TFTscreen.width(), TFTscreen.height());// TFTscreen.line(0, TFTscreen.height(), TFTscreen.width(), 0);// 画一个正方形// TFTscreen.noStroke(); // don't draw a line around the next rectangle// // 长方形内部填充颜色// TFTscreen.fill(255,255,0); // set the fill color to green// // 长方形大小// TFTscreen.rect(0,20,TFTscreen.width(),10); //draw a rectangle across the screen// delay(1000);// TFTscreen.background(0,0,0); // clear the screen before starting again// delay(1000);// TFTscreen.stroke(255, 0, 0);//TFTscreen.point(-100, 25); // col// TFTscreen.point(100, 50); // col// TFTscreen.point(100, 75); // colSerial.println("***********************************************");displayChineseChar(wo, 0, 0);displayChineseChar(ai, 16, 16);displayChineseChar(ni, 32, 32);displayChineseChar(zhong, 48, 48);displayChineseChar(guo, 64, 64);delay(1000);// chiness();
}// x ,y 显示位置
void displayChineseChar(char *bitmap, int16_t x, int16_t y) {// int chatLen = strlen(bitmap);// Serial.print("长度============");// Serial.println(chatLen);// int chinessChatLen = 16; // 一个汉字32位16进制int xiangsu_y = 0; // y坐标for (int row = 0; row < 32; row++) {// Serial.print("hexArray[");// Serial.print(row);// Serial.print("] = 0x");// Serial.println(bitmap[row], HEX); // 使用HEX格式打印int i = 0;int xiangsu_x = 0;int dongtairow = 0;if (row % 2 == 0) {dongtairow = 0;xiangsu_y = xiangsu_y + 1;} else {dongtairow = row % 2;}for (i = 0; i < 8; i++) {bool bit = (bitmap[row] >> (7 - i)) & 0x01;if (bit > 0) {xiangsu_x = (dongtairow * 8) + i;TFTscreen.stroke(255, 255, 255);TFTscreen.point(xiangsu_x + x, xiangsu_y + y);}}}
}// 画矩阵团图案
// void drew() {
// xPos = xPos + xDir;// yPos = yPos + yDir;// // check if the current location is different than the previous// if (xPos != xPrev || yPos != yPrev) {// TFTscreen.stroke(0, 128, 0); // set the stroke color to black// // 画一个点
// TFTscreen.point(xPrev, yPrev); // color in the previous point
// }// // draw a point in the current location// TFTscreen.stroke(255, 255, 255);// TFTscreen.point(xPos, yPos);// // if the x or x position is at the screen edges, reverse direction// if (xPos >= 160 || xPos <= 0) {// xDir = xDir * -1;
// }// if (yPos >= 128 || yPos <= 0) {// yDir = yDir * -1;
// }// // update the point's previous location// xPrev = xPos;// yPrev = yPos;// // a 33ms delay means the screen updates 30 times a second// delay(33);
// }
鸣谢
1、arduino uno 与tft屏幕配置链接 基于Arduino UNO的1.8寸TFT屏幕使用方法(Arduino系列十八)_arduino uno tft连线-CSDN博客
https://www.dragonlcm.com/1754.html
相关文章:
Arduino UNO 驱动1.8 TFT屏幕显示中文
背景 最近入手了一块1.8寸的tft屏幕,通过学习文档,已经掌握了接线,显示英文、数字、矩形区域、划线、画点等操作, 但是想显示中文的时候操作比较复杂。 问题 1、arduino uno 驱动这款屏幕目前使的是自带的<TFT.h> 库操作…...
Flink operator实现自动扩缩容
官网文档位置: 1.Autoscaler | Apache Flink Kubernetes Operator 2.Configuration | Apache Flink Kubernetes Operator 1.部署K8S集群 可参照我之前的文章k8s集群搭建 2.Helm安装Flink-Operator helm repo add flink-operator-repo https://downloads.apach…...
分布式系统架构6:链路追踪
这是小卷对分布式系统架构学习的第6篇文章,关于链路追踪,之前写过traceId的相关内容:https://juejin.cn/post/7135611432808218661,不过之前写的太浅了,且不成系统,只是简单的理解,今天来捋一下…...
vite-plugin-imagemin安装问题
vite-plugin-imagemin 是一款图片资源压缩插件,能够在打包的时候显著的降低图片资源占用。不过,在安装过程中我们遇到了如下的问题。 对于上面的问题,有以下几种常见的解决方案: 1,使用 yarn 在 package.json 内配置(推荐) 打开 package.json 配置文件,然后添加如下脚本…...
Git revert回滚
回退中间的某次提交(此操作在预生产分支上比较常见),建议此方式使用命令进行操作(做好注释,方便后续上线可以找到这个操作) Git操作: 命令:revert -n 版本号 1:git re…...
永磁同步电机预测模型控制(MPC)
永磁同步电机预测模型控制(MPC) 文章目录 前言1、模型预测控制1.1 连续控制集模型预测控制(CCS-MPC)1.2 有限控制集模型预测控制(FCS-MPC)1.3 模型预测控制的优缺点 2、永磁同步电机模型预测控制2.1 预测模型2.2 价值…...
【JAVA】switch ... case ... 的用法
语法结构: switch(表达式){ case 值1: 表达式和值1匹配时执行的语句 break; case 值2: 表达式和值2匹配时执行的语句 break; …...
基于STM32的热带鱼缸控制系统的设计
文章目录 一、热带鱼缸控制系统1.题目要求2.思路3.电路仿真3.1 未仿真3.2 开始仿真,显示屏显示水温、浑浊度、光照强度等值3.3 当水温低于阈值,开启加热并声光报警3.4 当浑浊度高于阈值,开启自动换水并声光报警3.5 当光照低于阈值,…...
Vue项目整合与优化
前几篇文章,我们讲述了 Vue 项目构建的整体流程,从无到有的实现了单页和多页应用的功能配置,但在实现的过程中不乏一些可以整合的功能点及可行性的优化方案,就像大楼造完需要进行最后的项目验收改进一样,有待我们进一步…...
WinForm开发-自定义组件-1. 工具栏: UcompToolStrip
这里写自定义目录标题 1. 工具栏: UcompToolStrip1.1 展示效果1.2 代码UcompToolStrip.csUcompToolStrip.Designer.cs 1. 工具栏: UcompToolStrip 自定义一些Winform组件 1.1 展示效果 1)使用效果 2)控件事件 1.2 代码 设计 编码 UcompToolStrip.…...
法律专业legal case的留学论文写作技巧分析(1)
对于法律专业的留学生而言,案例的分析是写作的重要方面。无论留学的国家是英、美、澳洲还是加拿大,它们都属于case law 的法律体系。一个非常显著的特点便是通过对案例进行分析和提炼,从中总结提炼出principle和rules。case analysis的留学论…...
2025编程技术前沿:探索最新的开发工具与趋势
随着技术的飞速发展,编程领域每天都在演化,新的技术、框架和工具层出不穷。本文将聚焦2025年最具潜力和吸引力的编程技术与工具,从前沿语言到最受欢迎的开发框架,带您一起探索软件开发领域的最新趋势。 一、编程语言的新生代之星…...
sqlserver sql转HTMM邮件发送
通过sql的形式,把表内数据通过邮件的形式发送出去 declare title varchar(100) DECLARE stat_date CHAR(10),create_time datetime SET stat_dateCONVERT(char(10),GETDATE(),120) SET create_timeDATEADD(MINUTE,-20,GETDATE()) DECLARE xml NVARCHAR (max) DECLAR…...
GeoTrust True BusinessID Wildcard
GeoTrust由DigiCert 提供支持,是最受信任和尊重的品牌之一,以提供高保证的网站安全而闻名。 GeoTrust True BusinessID通配符证书 – 以低成本保护多个主机名。即使将其用于您的公司主页或电子邮件服务器主机名,保护所有敏感信息也是您的目标…...
R语言的数据结构
R语言的数据结构 R语言是专门为统计计算和数据分析而设计的一种编程语言,因其强大的数据处理能力而受到广泛欢迎。在R中,数据结构是理解和有效使用R语言的基础。本文将详细介绍R语言中的主要数据结构,包括向量、矩阵、数据框、列表、因子等&…...
安装和配置MySQL教程
以下是在不同操作系统下安装和配置MySQL的详细教程: Windows系统 下载MySQL安装包 访问MySQL官方网站(https://dev.mysql.com/downloads/mysql/),根据你的操作系统版本(32位或64位)下载相应的MySQL Commu…...
黑马Java面试教程_P10_设计模式
系列博客目录 文章目录 系列博客目录前言1. 工厂方法模式1.1 概述1.2 简单工厂模式1.2.1 结构1.2.2 实现1.2.3 优缺点 1.3 工厂方法模式1.3.1 概念1.3.2 结构1.3.3 实现1.3.4 优缺点 1.4 抽象工厂模式1.4.1 概念1.4.2 结构1.4.3 实现1.4.4 优缺点1.4.5 使用场景 总结࿰…...
043_小驰私房菜_MTK Camera,Hal层将camera型号写到property属性中
【问题背景】 app层需要知道当前设备的摄像头型号,然后做一些差异化处理。底下如何上报这个摄像头型号? 【分析】 在kernel和hal层,都是有地方能获取到当前摄像头的型号,就看在哪里添加方便。获取到摄像头硬件型号后,将其写入到property属性, 然后app就可以通过读取该…...
基础图形化界面的一个图片爬虫期末
下面是爬取界面: 点击即可自动化爬取 以下是完整代码: import tkinter as tk import requests import os #用于文件和目录操作。# 图片爬虫函数 def image_spider(textbox):headers = {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, …...
Outlook2024版如何回到经典Outlook
Outlook2024版如何回到经典Outlook 如果新加入一家公司,拿到的电脑,大概率是最新版的Windows, 一切都是新的。 如果不coding, 使用国产的foxmail大概就可以解决一切问题了。可惜老程序员很多Coding都是基于传统Outlook的,科技公司所有人都是I…...
Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill
视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...
并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...
