TFT液晶屏显示中英文
预了解知识
- 字体表示:根据选择的字体1206或1608,它们表示字符是12个或16个像素高(对应循环第一个for),字符的宽度是6个或8个像素宽(对应循环嵌套的for),通过for来遍历像素定义中的每一个数字0或1,1的时候显示该像素点,0的时候不显示,这样就能够显示出文字了。
- 叠加方式:就是不管原来的底色是什么,当像素为1的时候就显示该点,为0的时候什么也不做。所以如果是实时更新数据显示会一直累加之前的像素的上面造成所谓的“花屏”。
- 非叠加方式:就是为1的时候显示该点,比叠加方式多了一步,为0时显示底色就可以把上一次不相干的像素点变成底色,其实是一种“障眼法”。
字符字节数计算
- 每个32×32的汉字点阵,有128个字节(高32个像素点,宽32个像素点,每一个像素点代表1位,32×32=32×4×8=128×8位=128字节)
- 举例:如果提取的字体规格大小:宽×2 = 高,要实现8×16的汉字点阵所需要的字节数。函数入口参数size为16,程序表达式:
uint8_t csize = (size / 8 + ((size % 8) ? 1 : 0)) * (size / 2);
如何让TFT屏显示中英文
- 使用TFT屏的驱动硬件为ST7735S,软件驱动为模拟SPI,这里主要讲解在TFT屏上显示中英文的程序流程,细节驱动不在此说明。
- 显示字符函数原型为:
void Show_Str(uint16_t x, uint16_t y, uint16_t fc, uint16_t bc, uint16_t *str,uint8_t size,uint8_t mode);
/******************************************************************************* @fn Show_Str** @brief 显示字符,包含中英文显示** @param x,y - 起点坐标宽,高* @param fc - 前置画笔颜色* @param bc - 背景颜色* @param str - 字符串* @param size - 字体大小* @param mode - 显示模式 0,填充模式;1,叠加模式** @return none*/
void Show_Str(uint16_t x, uint16_t y, uint16_t fc, uint16_t bc, uint16_t *str, uint8_t size, uint8_t mode)
{uint16_t x0 = x; uint8_t bHz = 0; //字符或者中文 while (*str ! =0) //数据未结束{ if (!bHz){if( x > (lcddev.width - size / 2) || y > (lcddev.height - size)) return; //超出LCD屏的宽高最大设定值if (*str > 0x80) //字符型表示范围0x00~0x7FbHz = 1; //中文 else //字符{ if (*str == 0x0D) //换行符号{ y += size;x = x0;str++; } else{if (size == 12 || size == 16){ LCD_ShowChar(x, y, fc, bc, *str, size, mode);x += size / 2; //字符,宽为全字的一半 }else //字库中没有集成16X32的英文字体,用8X16代替{LCD_ShowChar(x, y, fc, bc, *str, 16, mode);x += 8; //字符,为全字的一半 }} str++; }}else //中文 { if (x > (lcddev.width - size) || y > (lcddev.height - size)) return; bHz = 0; //清除标志if (size == 32)GUI_DrawFont32(x, y, fc, bc, str, mode); else if (size == 24)GUI_DrawFont24(x, y, fc, bc, str, mode);elseGUI_DrawFont16(x, y, fc, bc, str, mode);str += 2; //中文表示占两个字节x += size; //下一个汉字偏移 } }
}
- 显示单个英文字符函数原型:
void LCD_ShowChar(uint16_t x, uint16_t y, uint16_t fc, uint16_t bc, uint8_t num, uint8_t size,uint8_t mode);
/******************************************************************************* @fn LCD_ShowChar** @brief 显示单个英文字符** @param x,y - 起点坐标宽,高* @param fc - 前置画笔颜色* @param bc - 背景颜色* @param num - 数值* @param size - 字体大小* @param mode - 显示模式 0,填充模式;1,叠加模式** @return none*/
void LCD_ShowChar(uint16_t x, uint16_t y, uint16_t fc, uint16_t bc, uint8_t num, uint8_t size,uint8_t mode)
{ uint8_t temp;uint8_t pos, t;uint16_t colortemp = POINT_COLOR; num = num - ' '; //得到偏移后的值LCD_SetWindows(x, y, x + size / 2 - 1, y + size - 1); //设置单个文字显示窗口if (!mode) //非叠加方式{for (pos = 0; pos < size; pos++){if (size == 12)temp = asc2_1206[num][pos];//调用1206字体else temp = asc2_1608[num][pos]; //调用1608字体for (t = 0; t < size / 2; t++){ if (temp & 0x01)POINT_COLOR = fc; //非叠加方式时,像素点上描前置颜色,没有像素点描背景颜色else POINT_COLOR = bc; LCD_DrawPoint(x + t, y + pos); temp >>= 1; }}}else //叠加方式,不先清屏会存在花屏现象{for (pos = 0; pos < size; pos++){if (size == 12)temp = asc2_1206[num][pos];//调用1206字体else temp = asc2_1608[num][pos]; //调用1608字体for (t = 0; t < size / 2; t++){ POINT_COLOR = fc; if (temp & 0x01)LCD_DrawPoint(x + t, y + pos);//画一个点 temp >>= 1; }}}POINT_COLOR = colortemp;LCD_SetWindows(0, 0, lcddev.width - 1, lcddev.height - 1); //恢复窗口为全屏
}
- 显示单个16×16中文函数原型为:
void GUI_DrawFont16(uint16_t x, uint16_t y, uint16_t fc, uint16_t bc, uint8_t *s, uint8_t mode);
/******************************************************************************* @fn GUI_DrawFont16** @brief 显示单个16×16中文字体** @param x,y - 起点坐标宽,高* @param fc - 前置画笔颜色* @param bc - 背景颜色* @param s - 字符串地址* @param mode - 显示模式 0,填充模式;1,叠加模式** @return none*/
void GUI_DrawFont16(uint16_t x, uint16_t y, uint16_t fc, uint16_t bc, uint8_t *s, uint8_t mode)
{uint8_t i, j;uint16_t k;uint16_t HZnum;uint16_t x0 = x;HZnum = sizeof(tfont16) / sizeof(typFNT_GB16); //自动统计汉字数目for (k = 0; k < HZnum; k++) {if ((tfont16[k].Index[0] == *(s)) && (tfont16[k].Index[1] == *(s + 1))) //遍历确定汉字{ LCD_SetWindows(x, y, x + 16 - 1, y + 16 - 1);for (i = 0; i < 16 * 2; i++) //16×16字体,16 * (16 / 8) = 32个字节{for (j = 0; j < 8; j++){if (!mode) //非叠加方式{if (tfont16[k].Msk[i] & (0x80 >> j))LCD_WR_DATA_16Bit(fc);else LCD_WR_DATA_16Bit(bc);}else //叠加方式{POINT_COLOR = fc;if (tfont16[k].Msk[i] & (0x80 >> j))LCD_DrawPoint(x, y);//画一个点x++;if ((x - x0) == 16){x = x0;y++;break;}}}}} continue; //查找到对应点阵字库立即退出,防止多个汉字重复取模带来影响}LCD_SetWindows(0, 0, lcddev.width - 1, lcddev.height - 1);//恢复窗口为全屏
}
TFT液晶屏显示中英文相关推荐
- 树莓派GPIO驱动ST7735S主控TFT液晶屏显示图片和文字
本文使用1.8''128*160RGB_TFT ST7735S主控的液晶屏来操作 参考blog:http://blog.mangolovecarrot.net/2017/03/05/raspi-stu ...
- 全志H616开发板Orange Pi Zero2连接香橙派5寸TFT液晶屏的测试说明
香橙派Zero2开发板采用全志H616 四核 64位处理器,拥有512MB/1GB 内存可选,集成千兆以太网卡.蓝牙5.0+双频WiFi(2.4GHz和5GHz).USB2.0.Micro-HDMI( ...
- ZYNQ7020(黑金)纯verilog驱动4.3寸RGB接口TFT液晶屏(AN430)显示彩条
ZYNQ7020(黑金)纯verilog驱动4.3寸RGB接口TFT液晶屏(AN430)显示彩条 简介 像素(Pixel):像素是指由图像的小方格组成的,这些小方快都有一个明确的位置和被分配的色彩数值 ...
- 【ZYNQ Ultrascale+ MPSOC FPGA教程】第十六章 7寸液晶屏显示实验
原创声明: 本原创教程由芯驿电子科技(上海)有限公司(ALINX)创作,版权归本公司所有,如需转载,需授权并注明出处. 适用于板卡型号: AXU2CGA/AXU2CGB/AXU3EG/AXU4EV-E ...
- 超声波传感器与液晶屏显示实验
实验二 超声波传感器与液晶屏显示实验 一.实验目的 了解液晶屏显示的基本原理以及电路连接. 二.实验内容 了解液晶屏的工作原理和工作情况. 三.实验仪器 导线若干,1602液晶显示屏,LY-F2 ...
- c语言52单片机液晶屏显示,[手把手教你学51单片机C语言教程]22 LCD12864液晶屏显示.pdf...
您所在位置:网站首页 > 海量文档  > 计算机 > C/C++资料 [手把手教你学51单片机C语言教程]22 LCD ...
- nokia5110液晶屏显示汉字,图形,…
nokia5110液晶屏显示汉字,图形,字符,字符串 从网上看到的文章,感觉很好,顾转载收藏啦 #include #include #define uchar unsigned char #defin ...
- 液晶屏显示的对讲机?还是手咪?
美国大片中经常看到警车里面出现这样的场景:某一辆警车发现犯罪嫌疑人,警察拿起一个类似话筒的玩意儿,呼叫指挥中心,以便其余警车的人可以知道.包括现在国产电影也会经常出现警察随身携带这类产品呼叫中心的画面 ...
- Wemos D1 R32 ESP32开发板OLED液晶屏显示
目录 一.实验准备 二.实验代码 1.OLED液晶屏显示"Hello World" 2. OLED液晶满屏显示字符 3.OLED屏显示时钟 4.OLED屏显示矢量图片 5 OLED ...
- Arduino配合电位计和oled液晶屏显示波形 Processing联动
Arduino配合电位计和oled液晶屏显示波形 Processing联动 公众号:STCode Arduino配合电位计和oled液晶屏显示波形 Processing联动 1)描述 本作品使用Ard ...
最新文章
- mongodb java 日志分析_记一次log4j与mongodb集成引发的问题分析
- python 打开网页、封装自己的浏览器、制作浏览器、打开麦克风和摄像头、忽略ssl证书错误、置顶、无边框
- Java实现文件的预览
- AutoGL:浅谈未来非常有前景的自动图机器学习相关概念
- spring框架做全局异常捕获_@ControllerAdvice注解(全局异常捕获)
- Eclipse 远程调试
- Verilog hdl 宏定义编译报错
- Android字数限制的EditText实现方案研究
- TCP/IP协议详解内容总结(怒喷一口老血)
- CakePHP中文手册【翻译】-ACL
- 规划以及安装Exchange2007
- install google test on ubuntu
- progressbar使用方法:进度画面大小,进度画面背景,进度百分比
- SpringBoot使用thymefeal出现No mapping for GET /xxx的解决办法
- mobomarket android,MoboMarket
- 撰写项目的解决方案要点解析
- 分享一些视频加密播放技术业内知识
- python3.8.3安装时提示Detected Windows 7 SP1 without KB2533623
- 统计学习导论(ISLR)(二):统计学习概述
- 蓝牙键鼠 HID Reports