当前位置: 首页 > news >正文

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

http://www.lryc.cn/news/515769.html

相关文章:

  • Flink operator实现自动扩缩容
  • 分布式系统架构6:链路追踪
  • vite-plugin-imagemin安装问题
  • Git revert回滚
  • 永磁同步电机预测模型控制(MPC)
  • 【JAVA】switch ... case ... 的用法
  • 基于STM32的热带鱼缸控制系统的设计
  • Vue项目整合与优化
  • WinForm开发-自定义组件-1. 工具栏: UcompToolStrip
  • 法律专业legal case的留学论文写作技巧分析(1)
  • 2025编程技术前沿:探索最新的开发工具与趋势
  • sqlserver sql转HTMM邮件发送
  • GeoTrust True BusinessID Wildcard
  • R语言的数据结构
  • 安装和配置MySQL教程
  • 黑马Java面试教程_P10_设计模式
  • 043_小驰私房菜_MTK Camera,Hal层将camera型号写到property属性中
  • 基础图形化界面的一个图片爬虫期末
  • Outlook2024版如何回到经典Outlook
  • 仿生的群体智能算法总结之二(十种)
  • SpringBoot入门之创建一个Hello World项目
  • MySQL与标准SQL的区别
  • docker中使用Dockerfile设置Volume挂载点
  • Samsung手机首次主要采用竞对Micron LPDDR5内存
  • 【项目开发】C#环境配置及VScode运行C#教程(学生管理系统)
  • [241231] CachyOS 2024 年终总结:性能飞跃与社区繁荣 | ScyllaDB 宣布转向开源可用许可证
  • AI-Talk开发板之超拟人
  • Swift Concurrency(并发)学习
  • 从0开始的opencv之旅(1)cv::Mat的使用
  • Hoverfly 任意文件读取漏洞(CVE-2024-45388)