当前位置: 首页 > 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.mrgr.cn/news/82543.html

相关文章:

  • Elasticsearch: 高级搜索
  • 从0开始的opencv之旅(1)cv::Mat的使用
  • Elasticsearch:利用 AutoOps 检测长时间运行的搜索查询
  • 时序优化方法
  • 蓝桥杯备赛:C++基础,顺序表和vector(STL)
  • 使用 Docker 查看 Elasticsearch 错误日志
  • 软件逆向之标志位
  • 公共数据授权运营系统建设手册(附下载)
  • Tableau数据可视化与仪表盘搭建-数据连接
  • C语言:结构体
  • 【Rust自学】10.4. trait Pt.2:trait作为参数和返回类型、trait bound
  • 每天你好20250105(距离春节24天!!!)
  • 「C++笔记」unordered_map:哈希化的无序映射函数(键值对)
  • BerOS 文件系统路径归一化问题及其 Python 实现
  • 软件测试面试题整理
  • Chapter 3 Coding Attention Mechanisms
  • unity学习6:unity的3D项目的基本界面和菜单
  • 基于NLP的医学搜索相关性判断
  • GIT 企业级开发学习 1_基本操作
  • Navicat 17 for Mac 数据库管理软件
  • 人工智能之机器学习算法
  • 【QT】增删改查 XML 文件的类
  • AI是如何实现推理的
  • Ant Design Pro写项目的总结经验(react)
  • ABAQUS三维Voronoi晶体几何建模
  • Flume拦截器的实现