今天在写智能灯光的界面,用的是STM32和3.2寸TFT 彩屏。
我们在设计一个显示界面时,常常需要考虑一下汉字字体的大小,常见的字体有像素值为16*16、24*24、32*32的,而有时候我们界面用的汉字也不是很多,或者没有SD卡,没有保存相应的汉字字库,这时候就可以自己用取模软件,取相应的几个汉字即可,我用的下面这款取模软件

下面就是各个大小字体对应的参数:
16*16:宋体12,即小四,实际大小16*16,刚刚好
24*24:宋体18,即小二,实际大小24*24,刚刚好
32*32:宋体24,即小一,实际大小32*33,所以多出来32个二进制,即四个字节,删去最后面四个字节即可(因为一般都是零,影响不大)

注意:选择横向取模,C51方式取模。

接下来就是相关底层驱动函数的编写,我们需要将汉字及相应而二进制编码存到一个头文件中,我是分别命名了以下三个头文件,用来存储不同字体,hz16x16.h、hz16x16.h、hz16x16.h
具体代码如下:

#ifndef HZ16x16_H
#define HZ16x16_H// ------------------  汉字字模的数据结构定义 ------------------------ //
struct  typFNT_HZ16                 // 汉字字模数据结构
{unsigned char  Index[3];               // 汉字内码索引        存放内码  如"硕"  但是一个字要两个字节表示unsigned char   Msk[32];                        // 点阵码数据       存放内码后对应的 点阵序列  每个字需要32个字节的点阵序列
};/////////////////////////////////////////////////////////////////////////
// 汉字字模表                                                          //
// 汉字库: 宋体16.dot,横向取模左高位,数据排列:从左到右从上到下         //
/////////////////////////////////////////////////////////////////////////
/*这个结构,很简单的:一个是内码,一个点阵序列,
以前的点阵库是按内码顺序放的,不需要内码索引的,
如果只放部分汉字,就需要内码索引了。
一般内码两个字节就行了,多用1个字节是加了个尾0而已,
这样,汉字内码处直接放汉字字符淳涂桑?  */struct  typFNT_HZ16 codeHZ_16[] =          // 数据表
{
/*--  文字:  云  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
"云",0x00,0x00,0x00,0x30,0x3F,0xF8,0x00,0x00,0x00,0x00,0x00,0x0C,0xFF,0xFE,0x03,0x00,
0x07,0x00,0x06,0x40,0x0C,0x20,0x18,0x10,0x31,0xF8,0x7F,0x0C,0x20,0x08,0x00,0x00,};#endif

程序很简单,可见汉字及相关二进制编码是用的结构体来存储的,
成员如下:
unsigned char Index[3]; // 汉字内码索引, 存放内码 如”硕” 但是一个字要两个字节表示,这里多了一个,就是加了零
unsigned char Msk[32]; // // 点阵码数据 存放内码后对应的 点阵序列 每个字需要32个字节的点阵序列(24*24字体和32*32字体,有所区别,自己算出即可)

接下来就是在TFT彩屏显示的程序编写,代码如下:


//写入单个汉字 16*16
//x,y:起点坐标
//  c[2]  汉字
//dcolor  字体颜色
//bgcolor  背景颜色
void PutHZ1616(unsigned short x, unsigned short  y, unsigned char c[2], unsigned int dcolor,unsigned int bgcolor)
{unsigned int i,j,k;//c[2] 把要显示的字 以两个字节的形式放入 数组c中LCD_Set_Window(x,y,16,16);LCD_SetCursor(x,y);LCD_WriteRAM_Prepare();for (k=0;k<64;k++) { //64标示自建汉字库中的个数,循环查询内码          一个汉字需要两个字节if ((codeHZ_16[k].Index[0]==c[0])&&(codeHZ_16[k].Index[1]==c[1]))     //寻找对应汉字{ for(i=0;i<32;i++) {unsigned short m=codeHZ_16[k].Msk[i];for(j=0;j<8;j++) {if((m&0x80)==0x80) {LCD_WR_DATA(dcolor);}else {LCD_WR_DATA(bgcolor);}m<<=1;} }}  }
}

关键代码分析:
第一个for循环,就是查询自己编写的字库里的汉字,可以根据自己汉字多少改写。
if ((codeHZ_16[k].Index[0]==c[0])&&(codeHZ_16[k].Index[1]==c[1])) 这句代码意思就是对应于前面头文件里的编码,寻找对应汉字
再接下来一个循环——for(i=0;i<32;i++) ,总共32个char型数据,即32个字节,循环。
for(j=0;j<8;j++) ——这句代码以后,就是将1处写前景色,0处写背景色。

还有就是显示多个汉字函数


//显示多个汉字或字符 16*16
//在指定位置显示一个字符大小16*16)
//dcolor为内容颜色,gbcolor为背静颜色   !='\0'
void showhz16str(unsigned int x1,unsigned int y1,unsigned char *str,unsigned int dcolor,unsigned int bgcolor)
{  unsigned char l=0;while(*str){   if(*str<0x80){LCD_ShowString1(x1,y1,16,(unsigned char*)str);x1+=7;str++;}else{PutHZ1616(x1+l*8,y1,(unsigned char*)str,dcolor, bgcolor);str+=2;l+=2;}}
}

TFT彩屏常见汉字取模方式及相关驱动函数相关推荐

  1. 正点原子探索者开发板自定义汉字显示取模方式及底层函数

    汉字显示底层驱动函数 //在LCD上的(x,y)处画点 //color:点的颜色 void LCD_Draw_Point(u16 x,u16 y,u16 color) {u16 temp;temp=P ...

  2. 【工具】TFT彩屏图片点阵取模工具,Img2Lcd图片取模软件,图片生成c语言头文件...

    微信关注 "DLGG创客DIY" 设为"星标",重磅干货,第一时间送达. 最近玩童心派,上边有个128x128的彩屏,当然也是必须玩的,如何让彩屏显示图片呢?方 ...

  3. c语言 字体点阵取模,[汉字取模软件怎么用]单片机点阵汉字显示需要用

    [汉字取模软件怎么用]单片机点阵汉字显示需要用汉字取模软件吗 通常,用汉字取模软件生成工程所需所有汉字点阵信息.也可利用字库芯片,根据汉字内码计算字模地址,并从字库芯片中导出相关汉字的点阵信息.前者容 ...

  4. 普中tft彩屏驱动程序下载_51单片机 彩屏TFT-SD例程及资料下载 有FAT 红外遥控显示图片...

    EDA365欢迎您登录! 您需要 登录 才可以下载或查看,没有帐号?注册 x 51单片机 彩屏TFT-SD例程及资料下载 有FAT 红外遥控显示图片 9 `  b( o4 r- D. g" ...

  5. STM32F103以SPI 驱动128*128的TFT彩屏,LCD驱动为ST7735s,程序使用CubeMX的HAL库开发方式,另外也做了标准库的程序移植

    0.  关于本文: 其实我一直都比较懒,不喜欢写博客.但网上关于详细讲解SPI驱动LCD的文章比较少,虽然也能下载到一些案例程序,但对于初学者来说,如果不懂LCD驱动的原理,不懂如何对文字和图片取模, ...

  6. 常见汉字Unicode编码

    常见汉字: 1 的一是了我不人在他有这个上们来到时大地为子中你说生国年着就那和要她出也得里后自以会家可下而过天去能对小多然于心学么之都好看起发当没成只如事把还用第样道想作种开美总从无情己面最女但现前些 ...

  7. (网页的缓存控制)HTML配置no-cache(备忘) “Cache-control”常见的取值

    HTML配置no-cache(备忘) No-cache配置 html表头如下 <meta http-equiv="Content-Type" content="te ...

  8. php cache-control,网页缓存控制 Cache-control 常见的取值有private、no-cache、max-age、must-revalidate 介绍...

    网页的缓存是由HTTP消息头中的"Cache-control"来控制的,常见的取值有private.no-cache.max-age.must-revalidate等,默认为pri ...

  9. 基于STM32F103单片机的生理监控心率脉搏监控TFT彩屏显示

    系统功能设计 STM32单片机生理监控心率脉搏TFT彩屏波形曲线65 本系统由STM32F103C8T6单片机核心板.心率传感器.TFT屏显示.按键.蜂鸣器组成. 1.TFT液晶实时显示心率值. 2. ...

最新文章

  1. 数牍科技完成超3亿元A轮融资,隐私工程守护数据全生命周期流通协作
  2. 配置交换机端口聚合(思科)
  3. CentOS 7.6 MySQL 8.0 RPM包方式安装及新特性介绍
  4. mysql 存储过程 select 循环_简简单单储存过程——循环一个select结果集
  5. hadoop—集群配置历史服务器及访问历史服务器日志
  6. 64位CentOS6.2安装erlang及rabbitmqServer
  7. Python实现本机网络流量监视器
  8. 关于IE透明度失效的问题
  9. 删除Flex中TREE组建里的文件夹图标.
  10. 提取assemblyinfo.cs文件里的guid值
  11. System.IndexOutOfRangeException: 无法找到表 0解决办法
  12. xcode,cocoa开发:如何使用第三方的dylib
  13. VMware中安装linux系统(可视化界面centOS 7)
  14. Linux常用命令大全(非常全!!!)
  15. 为Windows 7的winsxs文件夹瘦身,慎重。
  16. Java堆内存Heap与非堆内存Non-Heap
  17. mysql中数据表null什么意思_MySQL 中NULL和空值的区别是什么?
  18. Idea 2022.1.3版本显示内存使用情况的方法
  19. user guide 说明
  20. PC微信协议 小程序数据接收处理

热门文章

  1. 聊一聊AI发展的过去现在与未来-由OpenAI之ChatGPT想到的
  2. matlab susan,SUSAN算法的matlab代码
  3. 爬虫实战1——校园官网内容爬取
  4. 完善发现、培养、激励机制 全面增强科技人才活力|方格教育
  5. 产业分析:充电桩行业深度报告
  6. 胭脂冷、碎玉楚碟烟花散
  7. Matlab固定随机数
  8. 北上广深杭30K试题:JVM内存模型如何分配的?
  9. c语言模拟量算法,常见模拟量信号检测方法-20210323031040.ppt-原创力文档
  10. python把一堆图片分成n份_用Python实现将一张图片分成9宫格的示例