TFT-LCD显示中英文

在前面编写了屏幕显示ASCII字符和字符串后,本次实现屏幕显示中文字符和中文字符串

中文字符取模

阴码,逐行式,逆向,十六进制数,C51格式,

输入要显示的中文字符,字体选择宋体,字宽x字高为16x16,也可以选择其他大一点的格式,字体大小不同,后续代码中要进行相应的修改

代码

font_CHN.h

用一个头文件存放字模数据,因为中文数据不同于ASCII码,ASCII码字符是有规律的,在代码中减去首个字符就能得到想要的ASCII码字符,但中文没有,所以要解决的就是当参数传入要显示的中文字符指针时,该怎么去字模数组中找到对应中文字符的字模数据

方法:定义一个结构体类型,里面有两个数组,第一个数组是中文字符的索引,后续代码中就通过这个索引查找中文字符的位置,第二个数组就是对应中文字符的字模数据,这个数组的大小要根据中文字符的字模数据的个数来定,比如16x16大小的字符的字模数据有32个(一个一个数),所以该数组大小就为32,如果是24x24的大小,则该数组大小要为72

用该结构体类型定义一个数组,存放字符索引和字模数据,用const修饰,放到芯片的内部Flash区

/*** 16号中文字符集* 宽x高:16x16* 字体:宋体* 逐行式(从第一行开始向右每取8个点作为一个字节,不足8个点就补0)* 逆向(取模顺序从低到高,即第一个点作为最低位)*/
typedef struct
{uint8_t ucIndex[2];uint8_t ucCHN_Code[32];     //该数组要根据一个中文字符的字模数据有多少个,来定义大小
}FONT_CHN16_t;const FONT_CHN16_t ucCHN_CHN16[] = {{{"时"},{0x00,0x10,0x00,0x10,0x3E,0x10,0x22,0x10,0xA2,0x7F,0x22,0x10,0x22,0x10,0x3E,0x10,0x22,0x11,0x22,0x12,0x22,0x12,0x22,0x10,0x3E,0x10,0x22,0x10,0x00,0x14,0x00,0x08}},/*"时",0*/
{{"间"},{0x04,0x00,0xC8,0x3F,0x08,0x20,0x02,0x20,0xE2,0x23,0x22,0x22,0x22,0x22,0x22,0x22,0xE2,0x23,0x22,0x22,0x22,0x22,0x22,0x22,0xE2,0x23,0x02,0x20,0x02,0x28,0x02,0x10}},/*"间",1*/
{{"不"},{0x00,0x00,0xFE,0x3F,0x00,0x01,0x00,0x01,0x80,0x00,0x80,0x00,0xC0,0x02,0xA0,0x04,0x90,0x08,0x88,0x10,0x84,0x20,0x82,0x20,0x81,0x00,0x80,0x00,0x80,0x00,0x80,0x00}},/*"不",2*/
{{"在"},{0x40,0x00,0x40,0x00,0x20,0x00,0xFF,0x7F,0x10,0x00,0x10,0x02,0x08,0x02,0x0C,0x02,0xEA,0x3F,0x09,0x02,0x08,0x02,0x08,0x02,0x08,0x02,0x08,0x02,0xF8,0x7F,0x08,0x00}},/*"在",3*/
{{"于"},{0x00,0x00,0xFC,0x1F,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0xFF,0x7F,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0xA0,0x00,0x40,0x00}},/*"于",4*/
{{"你"},{0x10,0x01,0x10,0x01,0x10,0x01,0x88,0x7F,0x88,0x40,0x4C,0x20,0x2C,0x04,0x0A,0x04,0x89,0x14,0x88,0x24,0x48,0x24,0x48,0x44,0x28,0x44,0x08,0x04,0x08,0x05,0x08,0x02}},/*"你",5*/
{{"拥"},{0x04,0x00,0xE4,0x3F,0x24,0x22,0x24,0x22,0x3F,0x22,0xE4,0x3F,0x24,0x22,0x34,0x22,0x2C,0x22,0xE7,0x3F,0x24,0x22,0x24,0x22,0x24,0x22,0x14,0x22,0x15,0x2A,0x0A,0x10}},/*"拥",6*/
{{"有"},{0x40,0x00,0x40,0x00,0xFF,0x7F,0x20,0x00,0x20,0x00,0xF0,0x0F,0x10,0x08,0x18,0x08,0xF4,0x0F,0x12,0x08,0x11,0x08,0xF0,0x0F,0x10,0x08,0x10,0x08,0x10,0x0A,0x10,0x04}},/*"有",7*/
{{"多"},{0x40,0x00,0x40,0x00,0xE0,0x0F,0x10,0x04,0x1C,0x02,0x20,0x01,0xC0,0x02,0x30,0x01,0x8E,0x1F,0x40,0x10,0x30,0x08,0x4C,0x04,0x80,0x02,0x80,0x01,0x70,0x00,0x0E,0x00}},/*"多",8*/
{{"少"},{0x80,0x00,0x80,0x00,0x80,0x00,0x90,0x04,0x90,0x08,0x88,0x10,0x88,0x20,0x84,0x28,0x82,0x08,0x80,0x04,0x00,0x02,0x00,0x01,0x80,0x00,0x40,0x00,0x30,0x00,0x0E,0x00}},/*"少",9*/
{{"而"},{0x00,0x00,0xFE,0x3F,0x80,0x00,0x80,0x00,0x40,0x00,0xFC,0x1F,0x24,0x11,0x24,0x11,0x24,0x11,0x24,0x11,0x24,0x11,0x24,0x11,0x24,0x11,0x24,0x11,0x04,0x14,0x04,0x08}},/*"而",10*/
{{"怎"},{0x10,0x00,0x10,0x00,0xF0,0x3F,0x28,0x00,0x24,0x00,0xE2,0x0F,0x20,0x00,0x20,0x00,0xE0,0x1F,0x20,0x00,0x80,0x00,0x10,0x21,0x12,0x49,0x12,0x48,0xE1,0x0F,0x00,0x00}},/*"怎",11*/
{{"么"},{0x80,0x00,0x80,0x00,0x40,0x00,0x40,0x00,0x20,0x02,0x10,0x02,0x08,0x01,0x04,0x01,0x82,0x00,0x40,0x00,0x20,0x04,0x10,0x08,0x08,0x10,0xFC,0x3F,0x08,0x20,0x00,0x00}},/*"么",12*/
{{"使"},{0x08,0x02,0x08,0x02,0xF8,0x7F,0x04,0x02,0x04,0x02,0xE6,0x3F,0x26,0x22,0x25,0x22,0xE4,0x3F,0x04,0x02,0x44,0x02,0x84,0x02,0x04,0x01,0x84,0x02,0x44,0x0C,0x34,0x70}},/*"使",13*/
{{"用"},{0x00,0x00,0xFC,0x1F,0x84,0x10,0x84,0x10,0x84,0x10,0xFC,0x1F,0x84,0x10,0x84,0x10,0x84,0x10,0xFC,0x1F,0x84,0x10,0x84,0x10,0x84,0x10,0x82,0x10,0x82,0x14,0x01,0x08}}/*"用",14*/
};

TFT_LCD.h

在LCD的头文件中定义中文字符大小的枚举类型

//定义汉字字体枚举类型
typedef enum
{CHN_font_16 = 16,CHN_font_24 = 24
}CHN_font_t;//断言宏定义
#define IS_CHN_FONT(font)   (((font) == CHN_font_16) || ((font) == CHN_font_24))

TFT_LCD.c

编写显示一个中文字符的函数,原理与显示一个ASCII码字符一样,都是找到对应的字符,然后遍历该字符的字模数据,为1则显示字体颜色,为0则显示背景颜色

/*** @name   LCD_ShowCHN* @brief  LCD屏幕显示一个中文字符* @param  usXstar:窗口起点x轴坐标*             usYstar:窗口起点y轴坐标*            pcStr:要显示的英文字符串*             usColor_Background:选择英文字符的背景色*           usColor_Foreground:选择英文字符的前景色*           font:字体选择        参数:CHN_font_16 :16号字体;CHN_font_24 :24号字体 * @retval None  */
static void LCD_ShowCHN(uint16_t usXstar,uint16_t usYstar,const char* pcStr,uint16_t usColor_Background,uint16_t usColor_Foreground,CHN_font_t font)
{uint8_t ucTemp,ucPage,ucColumn;uint16_t usIndex;       //字库中汉字的索引uint16_t usCHN_Num;       //字库中汉字数量//检查参数是否合法assert_param(IS_CHN_FONT(font));//判断字体-16号字体if(font == CHN_font_16){//统计汉字数量usCHN_Num = sizeof(ucCHN_CHN16)/sizeof(FONT_CHN16_t);     //字模数组大小除以结构体大小,得到汉字的个数//for循环判断汉字位置for(usIndex=0;usIndex<usCHN_Num;usIndex++){//判断结构体数组的汉字索引数组是否与要显示的中文字符一致,中文字符占两个字节,先判断第一个字符,再判断第二个字符if((ucCHN_CHN16[usIndex].ucIndex[0] == *pcStr)&&(ucCHN_CHN16[usIndex].ucIndex[1] == *(pcStr+1))){//设置窗口,大小为16x16LCD_SetWindows(usXstar,usYstar,16,16);//逐行写入数据,共16行,每行16个像素点for(ucPage=0;ucPage<32;ucPage++){//从ASCII字符集数组获取像素数据  //像素点数据为1时,写入字符颜色,为0时,写入背景颜色ucTemp = ucCHN_CHN16[usIndex].ucCHN_Code[ucPage];for(ucColumn=0;ucColumn<8;ucColumn++){if((ucTemp & BIT0) == BIT0){LCD_WRITE_DATA(usColor_Foreground);}else{LCD_WRITE_DATA(usColor_Background);}ucTemp >>= 1;}}break;      //已经找到并显示了字符,退出循环}}}//判断字体-24号字体if(font == CHN_font_24){//统计汉字数量usCHN_Num = sizeof(ucCHN_CHN24)/sizeof(FONT_CHN24_t);     //字模数组大小除以结构体大小,得到汉字的个数//for循环判断汉字位置for(usIndex=0;usIndex<usCHN_Num;usIndex++){//判断结构体数组的汉字索引数组是否与要显示的中文字符一致,中文字符占两个字节,先判断第一个字符,再判断第二个字符if((ucCHN_CHN24[usIndex].ucIndex[0] == *pcStr)&&(ucCHN_CHN24[usIndex].ucIndex[1] == *(pcStr+1))){//设置窗口,大小为24x24LCD_SetWindows(usXstar,usYstar,24,24);//逐行写入数据,共24行,每行72个像素点for(ucPage=0;ucPage<72;ucPage++){//从ASCII字符集数组获取像素数据  //像素点数据为1时,写入字符颜色,为0时,写入背景颜色ucTemp = ucCHN_CHN24[usIndex].ucCHN_Code[ucPage];for(ucColumn=0;ucColumn<8;ucColumn++){if((ucTemp & BIT0) == BIT0){LCD_WRITE_DATA(usColor_Foreground);}else{LCD_WRITE_DATA(usColor_Background);}ucTemp >>= 1;}}break;      //已经找到并显示了字符,退出循环}}}
}

通过结构体类型的第一个索引数组找到对应的中文字符就是下面这一条语句

//判断结构体数组的汉字索引数组是否与要显示的中文字符一致,中文字符占两个字节,先判断第一个字符,再判断第二个字符
if((ucCHN_CHN24[usIndex].ucIndex[0] == *pcStr)&&(ucCHN_CHN24[usIndex].ucIndex[1] == *(pcStr+1)))

编写一个显示中英文字符串的函数

如何区分ASCII码字符和中文字符?

ASCII码取模范围一般是32 - 126,即空格到~,最后一个ASCII码字符为del,其十进制为127,所以编码在127之前的都属于ASCII码字符,汉字占两个字节,而汉字为了与ASCII码区分开,第一个字节的最高位是为1的,十进制肯定大于127,所以区分ASCII码和汉字就可以判断字符是否小于0x80,小于的就为ASCII码,大于或等于的就为汉字

/*** @name   LCD_ShowCHNandENGString* @brief  LCD屏幕显示中英文字符串* @param  usXstar:窗口起点x轴坐标*             usYstar:窗口起点y轴坐标*            pcStr:要显示的英文字符串*             usColor_Background:选择英文字符的背景色*           usColor_Foreground:选择英文字符的前景色*           CHN_font:中文字体        参数:CHN_font_16 :16号字体;CHN_font_24 :24号字体 *          ASCII_font:英文字体  参数:ASCII_font_16 :16号字体;ASCII_font_24 :24号字体 * @retval None  */
static void LCD_ShowCHNandENGString(uint16_t usXstar,uint16_t usYstar,const char* pcStr,uint16_t usColor_Background,uint16_t usColor_Foreground,CHN_font_t CHN_font,ASCII_font_t ASCII_font)
{while(*pcStr != '\0'){//中文字符if(*(pcStr) > 127){//自动换行if((usXstar+CHN_font) > LCD_WIGHT){usXstar = 0;usYstar += CHN_font;}//自动换页if((usYstar+CHN_font) > LCD_HIGHT){usXstar = 0;usYstar = 0;}//显示中文字符TFT_LCD.LCD_ShowCHN(usXstar,usYstar,pcStr,usColor_Background,usColor_Foreground,CHN_font);//更新位置pcStr += 2;                    //下一个中文字符usXstar += CHN_font;     //坐标位置加上一个字符间隔}//英文字符else{if((*pcStr == '\r') || (*pcStr == '\n')){//前面的字符为中文if(*(pcStr-1) > 127){//换行usXstar = 0;usYstar += CHN_font;}//前面的字符为英文else{//换行usXstar = 0;usYstar += ASCII_font;}}else{//自动换行if((usXstar+ASCII_font/2) > LCD_WIGHT){usXstar = 0;usYstar += ASCII_font;}//自动换页if((usYstar+ASCII_font) > LCD_HIGHT){usXstar = 0;usYstar = 0;}//显示英文字符TFT_LCD.LCD_ShowChar(usXstar,usYstar,*pcStr,usColor_Background,usColor_Foreground,ASCII_font);//更新位置usXstar += ASCII_font/2;     //坐标位置加上一个字符间隔}pcStr++;       //指向下一个字符}}
}

System.c

系统运行函数中调用显示中英文字符串显示中文,这次并没有显示英文,而且中文字体大小为24x24

/*
* @name   Run
* @brief  系统运行
* @param  None
* @retval None
*/
static void Run()
{TFT_LCD.LCD_ShowCHNandENGString(25,70,"时间",Color_BLACK,Color_WHITE,CHN_font_24,ASCII_font_16);TFT_LCD.LCD_ShowCHNandENGString(25,120,"不在于你拥有多少",Color_BLACK,Color_WHITE,CHN_font_24,ASCII_font_16);TFT_LCD.LCD_ShowCHNandENGString(25,170,"而在于你怎么使用",Color_BLACK,Color_WHITE,CHN_font_24,ASCII_font_16);
}

显示效果

TFT-LCD显示中英文相关推荐

  1. TFT LCD显示原理详解

    <什么是液晶> 我们一般认为物体有三态:固态.液态.气态,其实这只是针对水而言,有一些有机化和物 还有介于固态和液态中间的状态 就是液晶态,如下图(一):                 ...

  2. AT32驱动TFT LCD显示示例

    1.1 案例 TFT LCD显示 1.1.1 简介 TFT LCD液晶显示屏是薄膜晶体管型液晶显示屏,TFT液晶每个像素都可以单独控制,因而每个节点都相对独立,并可以连续控制,这不仅提高了显示的反应速 ...

  3. ESP8266-Arduino编程实例-二维码(QR Code)生成与TFT LCD显示

    二维码(QR Code)生成与TFT LCD显示 QR 码(快速响应码的缩写)是一种矩阵条码(或二维条码,由日本汽车公司 Denso Wave 于 1994 年发明.条形码是一种机器可读的光学标签,可 ...

  4. S3C2440A驱动RGB接口TFT LCD的研究(转载)

    S3C2440A驱动RGB接口TFT LCD的研究 时间: 2009-02-25 11:29:50 来源:嵌入式在线 作者:纪宁宁,孙灵燕 1 引言     随着科技的进步,TFT LCD作为显示器件 ...

  5. 温湿度(DHT11)+雨滴检测——LCD显示(TFT液晶)

    温湿度(DHT11)+雨滴检测--LCD显示(TFT液晶) 效果展示: 一.硬件连接 二.代码 1.DHT11 2.雨滴传感器 3.LCD 4.main.c 三.完整工程 链接: 效果展示: 视频: ...

  6. 初试树莓派在2.2寸QVGA SPI TFT LCD上显示图片

    春节前整理抽屉翻出来一块2.2寸的240x320 SPI的TFT LCD.想起来这是当初做完Arduino搭配176x220的实验(http://blog.csdn.net/ki1381/articl ...

  7. DDR200T TFT - LCD 显示屏 显示图片 NucleiStudio 蜂鸟E203 详细教程 RISC-V

    DDR200T TFT - LCD 显示屏 显示图片 NucleiStudio 蜂鸟E203 详细教程 RISC-V 前言 IMG2LCD软件生成RGB565格式图片 使用取模软件对图片取模 实验结果 ...

  8. DC/DC升压转换器AAT1118 贴片TSSOP16 可调式三通道TFT LCD液晶屏显示IC芯片

    概述 AAT1118是一个可调节的三重沟道TFT液晶的DC-DC转换器,它提供一个电流模式PWM ,一个正电荷泵和一负电荷泵.内置功能包括:软启动和电源排序.当电源接通时,软启动避免了浪涌电流.上电排 ...

  9. 【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验二十七:TFT模块 - 显示

    实验二十七:TFT模块 - 显示 所谓TFT(Thin Film Transistor)就是众多LCD当中,其中一种支持颜色的LCD,相较古老的点阵LCD(12864笑),它可谓高级了.黑金的TFT ...

  10. u-boot支持LCD显示(基于TQ2440)

    平台简介 Linux版本:Linux-3.14 u-boot版本:u-boot-2015.04 硬件:TQ2440(内存:64MB  NandFlash:256MB) 作者:彭东林 邮箱:pengdo ...

最新文章

  1. 豪取4个SOTA,谷歌魔改Transformer登NeurIPS 2021!一层8个token比1024个还好用
  2. xgboost防止过拟合
  3. 概率分布的熵归一化(Entropy Normalization)
  4. 1. 各种虚拟机的发展历史
  5. php用go做跳转翻页,go.php跳转不输出权重的跳转方式真的有用么?
  6. gwt格式_使用Spring Security保护GWT应用程序的安全
  7. 最专业的业余数学家!
  8. python 表示图论_Python 图论工具 | 学步园
  9. UIAlertController 大坑
  10. 哪吒:猪八戒十年DevOps演进之路
  11. java 删除指定文件夹和下面所有文件_java——File IO流
  12. 此男因为什么被送进医院?
  13. 量子化学计算机理,量子化学(理论化学的分支学科)_百度百科
  14. dwg转换pdf怎么转换?
  15. 使用Python-Flask框架开发Web网站系列课程(四)构建前端
  16. 黑鲨装机大师计算机产品密钥,黑鲨装机大师U盘重装win10系统详细教程
  17. 转载ios开发如何使用Xcode的Targets来管理开发和生产版本的构建
  18. 人工智能的发展对生活有什么影响?
  19. 推荐一个程序员必备官方 App ,名字叫:力扣
  20. 我们建议您在Google的sellers.json文件中公开您的卖方信息

热门文章

  1. HTML局部打印,区域打印的两种实现方法总结
  2. Docker 来点好玩的
  3. 一文读懂<explain>索引优化
  4. java 包名、类名命名规则
  5. CC00002.CloudJenkins——|CI/CDGit部署.V01|——|Git.Server部署|
  6. 【C++每日一练】13.最小的k个数
  7. access重复数据累计_在 Access 中查找并删除重复记录
  8. 简单好用的截流软件推荐
  9. 17个C语言字符串处理函数
  10. maven项目多模块