0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

单片机上常用GB2312、GBK汉字取模与字库

DS小龙哥-嵌入式威廉希尔官方网站 2022-09-17 15:56 次阅读

【摘要】 使用单片机开发程序时,经常需要使用LCD显示屏显示一些文字、数字。单片机因为配置不高,很多场合也不需要显示很多文字或者说只是显示一种大小、或者固定几种大小的文字,或者显示一些固定的文字或者一些英文字母、数字。如果只是显示固定文字,这时可以直接将要显示的文字提前取模存放到程序中,在通过LCD屏画点函数将数据画在LCD屏幕上去。如果显示固定大小的文字,可以制作点阵字库。

一、 GB2312编码

GB2312 码是中华人民共和国国家汉字信息交换用编码,全称《信息交换用汉字编码字符集–基本集》, 由国家标准总局发布, 1981 年 5 月 1 日 实施,通行于大陆。新加坡等地也使用此编码。GB2312 收录简化汉字及符号、字母、 日文假名等共 7445 个图形字符,其中汉字占 6763 个。GB2312 规定<对任意一个图形字符都采用两个字节表示,每个字节均采用七位编码表示>,习惯上称第一个字节为<高字节>, 第二个字节为<低字节>。GB2312-80 包含了大部分常用的一、二级汉字, 和 9 区的符号。该字符集是几乎所有的中文系统和国际化的软件都支持的中文字符集,这也是最基本的中文字符集。其编码范围是高位 0xa1- 0xfe, 低位也是 0xa1-0xfe;汉字从 0xb0a1 开始,结束于 0xf7fe。GB2312 将代码表分为 94 个区,对应第一字节( 0xa1 -0xfe);每个区 94 个位(0xa1-0xfe),对应第二字节,两个字节的值分别为区号值和位号值加 32(20H), 因此也称为区位码。01-09 区为符号、数字区, 16-87 区为汉字区(0xb0-0xf7),10-15 区、88-94 区是有待进一步标准化的空白区。 GB2312 将收录的汉字分成两级: 第一级是常用汉字计 3755 个,置于 1 6-55 区, 按汉语拼音字母/笔形顺序排列;第二级汉字是次常用汉字计 3008 个,置于 56-87 区,按部首/笔画顺序排列。

故而 GB2312 最多能表示 6763 个汉字。

二、GBK编码

全国信息威廉希尔官方网站 化威廉希尔官方网站 委员会于 1995 年 12 月 1 日《汉字内码扩展规范》。GBK 向下与 GB2312 完全兼容,向上支持 ISO 10646 国际标准,在前者向后者过渡过程中起到的承上启下的作用。GBK 亦采用双字节表示,总体编码范围为 8140-FEFE 之间,首字节在 81-FE 之间,尾字节在 40-FE 之间,剔除 XX7F 一条线。

GBK 共收入 21886 个汉字和图形符号,包括:

GB2312 中的全部汉字、非汉字符号。

BIG5 中的全部汉字。

与 ISO 10646 相应的国家标准 GB13000 中的其它 CJK 汉字,以上合计 20902 个汉字。

其它汉字、部首、符号,共计 984 个。

GBK 编码区分三部分:

  1. 汉字区,包括:

GBK/2:OXBOA1-F7FE, 收录 GB2312 汉字 6763 个,按原序排列;

GBK/3:OX8140-AOFE,收录 CJK 汉字 6080 个;

GBK/4:OXAA40-FEAO,收录 CJK 汉字和增补的汉字 8160 个。

  1. 图形符号区,包括:

GBK/1:OXA1A1-A9FE,除 GB2312 的符号外,还增补了其它符号

GBK/5:OXA840-A9AO,扩除非汉字区。

  1. 用户自定义区:

即 GBK 区域中的空白区,用户可以自己定义字符

每个 GBK 码由 2 个字节组成:

第一个字节为 0X81~0XFE

第二个字节分为两部分:

  1. 0X40~0X7E

2.0X80~0XFE。

其中与 GB2312 相同的区域,字完全相同。

我们把第一个字节代表的意义称为区,那么 GBK 里面总共有 126 个区( 0XFE-0X81+1),

每个区内有 190 个汉字( 0XFE-0X80+0X7E-0X40+2),总共就有 126190=23940 个汉字。我们的点阵库只要按照这个编码规则从 0X8140 开始,逐一建立, 每个区的点阵大小为每个汉字所用的字节数190。这样,我们就可以得到在这个字库里面定位汉字的方法:

当 GBKL<0X7F 时: Hp=((GBKH-0x81)190+GBKL-0X40)(size*2);

当 GBKL>0X80 时: Hp=((GBKH-0x81)190+GBKL-0X41)(size*2);

其中 GBKH、 GBKL 分别代表 GBK 的第一个字节和第二个字节(也就是高位和低位), size

代表汉字字体的大小(比如 16 字体, 12 字体等), Hp 则为对应汉字点阵数据在字库里面的起始地址(假设是从 0 开始存放)。

这样我们只要得到了汉字的 GBK 码,就可以显示这个汉字了。从而实现汉字在液晶上的显示。

简化公式:

if(L<0x7f)L=L-0x40;
else L=L-0x41;
H=H-0x81;   
Addr=(190*H+L)*size;

L 是汉字的低字节,H是汉字的高字节。

Addr 是该汉字在字库里的偏移量。

Size 是该汉字的应点阵集所占的字节数量。

汉字的高字节大于0x80 ,才是汉字。高字节小于0X80就是英文字符。

字库在FLASH寻址过程:

首先得到该汉字点阵码在FLASH里的存储偏移量,然后在加上该汉字库在FLASH里的存放起始地址,就得到了该汉字的点阵数据位置。

得到绝对位置之后,就可以读出点阵码,进行打点显示。

BIG5 编码

BIG5 是通行于台湾、香港地区的一个繁体字编码方案。虽然存在一些瑕疵,但广泛应用于电脑行业,尤其是互联网中,从而成为一种事实上的行业标准。

1983 年 10 月,***科学委员会、教育部国语推行委员会、中央标准局、行政院共同制定了《通用汉字标准交换码》,后经修订于 1992 年 5 月公布,更名为《中文标准交换码》,BIG5 是台湾资讯工业策进会根据以上标准制定的编码方案。

BIG5 码是双字节编码方案,其中第一个字节的值在 OXAO-OXFE 之间,第二个字节在 OX40-OX7E 和

OXA1-OXFE 之间。

BIG5 收录 13461 个汉字和符号,包括:

  1. 符号 408 个,编码位置 A140-A3BE
  2. 常用字 5401 个,编码位置 A440-C67E,包括台湾教育部颁布的《常用国字标准字体表》的全部汉字 4808 个,台湾教科书常用字 587 个,异体字 6 个。
  3. 次常用字 7652 个,编码位置 C940-F9D5,包括台湾教育部颁布的《次常用国字标准字体表》的全部汉字 6341 个,《罕用国字标准字体表》中使用频率较高的字 1311 个。

GB13000 编码

GB13000 等同于国际标准的《通用多八位编码字符集 (UCS)》 ISO10646.1,就是等同于 Unicode 的标准,代码页等等的都使用 UTF 的一套标准。

从 ASCII、GB2312、GBK 到 GB18030,这些编码方法是向下兼容的,即同一个字符在这些方案中总是有相同的编码,后面的标准支持更多的字符。在这些编码中,英文和中文可以统一地处理。区分中文编码的方

法是高字节的最高位不为 0。按照程序员的称呼,GB2312、GBK 到 GB18030 都属于双字节字符集 (DBCS)。

三、偏移量计算

GB2312收录简化汉字及符号、字母、日文假名等共7445 个图形字符,其中汉字占6763 个。GB2312 规定“对任意一个图形字符都采用两个字节表示,每个字节均采用七位编码表示”,习惯上称第一个字节为“高字节”,即所谓的区码。第二个字节为“低字节”,即所谓的位码。GB2312―80包含了大部分常用的一、二级汉字,和9区的符号。该字符集是几乎所有的中文系统和国际化的软件都支持的中文字符集,这也是最基本的中文字符集。其编码范围是高位0xa1~0xfe,低位也是0xa1~0xfe;汉字从0xb0a1开始,结束于0xf7fe。GB2312将代码表分为94个区,对应第一字节(0xa1~0xfe);每个区94 个位(0xa1~0xfe),对应第二字节。两个字节的值分别为区号值和位号值加32(20H),因此也称为区位码。01~09区为符号、数字区,16~87区为汉字区(0xb0~0xf7),10~15区、88~94区是有待进一步标准化的空白区。GB2312将收录的汉字分成两级:第一级是常用汉字计3755个,置于16~55区,按汉语拼音字母/笔形顺序排列:第二级汉字是次常用汉字计3008 个,置于56~87 区,按部首/笔画顺序排列。故而GB2312 最多能表示6763 个汉字。

而GBK内码完全兼容GB2312,同时支持繁体字,总汉字数有2万多个,编码格式如下,每个GBK 码由2 个字节组成,第一个字节为0X81~0XFE,第二个字节分为两部分,一是0X40~0X7E,二是0X80~0XFE。其中与GB2312相同的区域,字完全相同。把第一个字节代表的意义称为区,那么GBK里面总共有126个区(0XFE~0X81+1),每个区内有190 个汉字(0XFE~0X80+0X7E~0X40+2),总共就有126x190=23940 个汉字。点阵库只要按照这个编码规则从0X8140开始,逐一建立,每个区的点阵大小为每个汉字所用的字节数乘以190。这样,就可以得到在这个字库里面定位汉字的方法:

当GBKL<0X7F 时:Hp=((GBKH-0x81)×190+GBKL-0X40)×(sizex2);

当GBKL>0X80 时:Hp=((GBKH-0x81)×190+GBKL-0X41)×(sizex2);

其中GBKH、GBKLL 分别代表GBK 的第一个字节和第二个字节(也就是高位和低位),size 代表汉字字体的大小(比如16 字体,12 字体等),Hp 则为对应汉字点阵数据在字库里面的起始地址。

对于GBK 字库和GB2312 字库,他们的解码部分部分略有不同,这个区别主要是由于他们的编码方式不同引起的,对于GBK 字库,解码的方式如下:

qh=*code;

ql=*(++code);

if(ql<0x7f)

    ql -= 0x40;

else

    ql -= 0x41;

qh -= 0x81;

foffset = ((unsigned long)190*qh + ql)*(size * 2);

对于GB2312 字库,解码的方式如下:

qh=*code;

ql=*(++code);

ql -= 0xa1;

qh -= 0xa1;

foffset = ((unsigned long)94*qh + ql)*(size * 2);

其中qh、ql 分别代表GBK 的第一个字节和第二个字节(也就是高位和低位),size代表汉字字体的大小(比如16字体,12字体等),foffset 则为对应汉字点阵数据在字库里面的起始地址。

四、ASCII字符集取模方式

  • 需要使用的工具软件:PCtoLCD2002.exe
  • ASCII字符集:
 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

注意:前面第一个字符是空格。

每个字符点阵码所占用的字节数为:(size/8+((size%8)?1:0))*(size/2),其中size:是字库生成时的点阵大小(12/16/24…)

  • PC2LCD2002取模方式设置:阴码+逐列式+顺向+C51格式
imgimgimgimg
  • 以下是16*16的字模示例

将取出的ASCII字模使用二维数组保存,方便访问。

//16*16 ASCII字符集点阵
const unsigned char asc2_1608[95][16]={	  
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xCC,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00},/*"!",1*/
{0x00,0x00,0x08,0x00,0x30,0x00,0x60,0x00,0x08,0x00,0x30,0x00,0x60,0x00,0x00,0x00},/*""",2*/
{0x02,0x20,0x03,0xFC,0x1E,0x20,0x02,0x20,0x03,0xFC,0x1E,0x20,0x02,0x20,0x00,0x00},/*"#",3*/
{0x00,0x00,0x0E,0x18,0x11,0x04,0x3F,0xFF,0x10,0x84,0x0C,0x78,0x00,0x00,0x00,0x00},/*"$",4*/
{0x0F,0x00,0x10,0x84,0x0F,0x38,0x00,0xC0,0x07,0x78,0x18,0x84,0x00,0x78,0x00,0x00},/*"%",5*/
{0x00,0x78,0x0F,0x84,0x10,0xC4,0x11,0x24,0x0E,0x98,0x00,0xE4,0x00,0x84,0x00,0x08},/*"&",6*/
{0x08,0x00,0x68,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"'",7*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xE0,0x18,0x18,0x20,0x04,0x40,0x02,0x00,0x00},/*"(",8*/
{0x00,0x00,0x40,0x02,0x20,0x04,0x18,0x18,0x07,0xE0,0x00,0x00,0x00,0x00,0x00,0x00},/*")",9*/
{0x02,0x40,0x02,0x40,0x01,0x80,0x0F,0xF0,0x01,0x80,0x02,0x40,0x02,0x40,0x00,0x00},/*"*",10*/
{0x00,0x80,0x00,0x80,0x00,0x80,0x0F,0xF8,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x00},/*"+",11*/
{0x00,0x01,0x00,0x0D,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*",",12*/
{0x00,0x00,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80},/*"-",13*/
{0x00,0x00,0x00,0x0C,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*".",14*/
{0x00,0x00,0x00,0x06,0x00,0x18,0x00,0x60,0x01,0x80,0x06,0x00,0x18,0x00,0x20,0x00},/*"/",15*/
{0x00,0x00,0x07,0xF0,0x08,0x08,0x10,0x04,0x10,0x04,0x08,0x08,0x07,0xF0,0x00,0x00},/*"0",16*/
{0x00,0x00,0x08,0x04,0x08,0x04,0x1F,0xFC,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00},/*"1",17*/
{0x00,0x00,0x0E,0x0C,0x10,0x14,0x10,0x24,0x10,0x44,0x11,0x84,0x0E,0x0C,0x00,0x00},/*"2",18*/
{0x00,0x00,0x0C,0x18,0x10,0x04,0x11,0x04,0x11,0x04,0x12,0x88,0x0C,0x70,0x00,0x00},/*"3",19*/
{0x00,0x00,0x00,0xE0,0x03,0x20,0x04,0x24,0x08,0x24,0x1F,0xFC,0x00,0x24,0x00,0x00},/*"4",20*/
{0x00,0x00,0x1F,0x98,0x10,0x84,0x11,0x04,0x11,0x04,0x10,0x88,0x10,0x70,0x00,0x00},/*"5",21*/
{0x00,0x00,0x07,0xF0,0x08,0x88,0x11,0x04,0x11,0x04,0x18,0x88,0x00,0x70,0x00,0x00},/*"6",22*/
{0x00,0x00,0x1C,0x00,0x10,0x00,0x10,0xFC,0x13,0x00,0x1C,0x00,0x10,0x00,0x00,0x00},/*"7",23*/
{0x00,0x00,0x0E,0x38,0x11,0x44,0x10,0x84,0x10,0x84,0x11,0x44,0x0E,0x38,0x00,0x00},/*"8",24*/
{0x00,0x00,0x07,0x00,0x08,0x8C,0x10,0x44,0x10,0x44,0x08,0x88,0x07,0xF0,0x00,0x00},/*"9",25*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x0C,0x03,0x0C,0x00,0x00,0x00,0x00,0x00,0x00},/*":",26*/
{0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*";",27*/
{0x00,0x00,0x00,0x80,0x01,0x40,0x02,0x20,0x04,0x10,0x08,0x08,0x10,0x04,0x00,0x00},/*"<",28*/
{0x02,0x20,0x02,0x20,0x02,0x20,0x02,0x20,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00},/*"=",29*/
{0x00,0x00,0x10,0x04,0x08,0x08,0x04,0x10,0x02,0x20,0x01,0x40,0x00,0x80,0x00,0x00},/*">",30*/
{0x00,0x00,0x0E,0x00,0x12,0x00,0x10,0x0C,0x10,0x6C,0x10,0x80,0x0F,0x00,0x00,0x00},/*"?",31*/
{0x03,0xE0,0x0C,0x18,0x13,0xE4,0x14,0x24,0x17,0xC4,0x08,0x28,0x07,0xD0,0x00,0x00},/*"@",32*/
{0x00,0x04,0x00,0x3C,0x03,0xC4,0x1C,0x40,0x07,0x40,0x00,0xE4,0x00,0x1C,0x00,0x04},/*"A",33*/
{0x10,0x04,0x1F,0xFC,0x11,0x04,0x11,0x04,0x11,0x04,0x0E,0x88,0x00,0x70,0x00,0x00},/*"B",34*/
{0x03,0xE0,0x0C,0x18,0x10,0x04,0x10,0x04,0x10,0x04,0x10,0x08,0x1C,0x10,0x00,0x00},/*"C",35*/
{0x10,0x04,0x1F,0xFC,0x10,0x04,0x10,0x04,0x10,0x04,0x08,0x08,0x07,0xF0,0x00,0x00},/*"D",36*/
{0x10,0x04,0x1F,0xFC,0x11,0x04,0x11,0x04,0x17,0xC4,0x10,0x04,0x08,0x18,0x00,0x00},/*"E",37*/
{0x10,0x04,0x1F,0xFC,0x11,0x04,0x11,0x00,0x17,0xC0,0x10,0x00,0x08,0x00,0x00,0x00},/*"F",38*/
{0x03,0xE0,0x0C,0x18,0x10,0x04,0x10,0x04,0x10,0x44,0x1C,0x78,0x00,0x40,0x00,0x00},/*"G",39*/
{0x10,0x04,0x1F,0xFC,0x10,0x84,0x00,0x80,0x00,0x80,0x10,0x84,0x1F,0xFC,0x10,0x04},/*"H",40*/
{0x00,0x00,0x10,0x04,0x10,0x04,0x1F,0xFC,0x10,0x04,0x10,0x04,0x00,0x00,0x00,0x00},/*"I",41*/
{0x00,0x03,0x00,0x01,0x10,0x01,0x10,0x01,0x1F,0xFE,0x10,0x00,0x10,0x00,0x00,0x00},/*"J",42*/
{0x10,0x04,0x1F,0xFC,0x11,0x04,0x03,0x80,0x14,0x64,0x18,0x1C,0x10,0x04,0x00,0x00},/*"K",43*/
{0x10,0x04,0x1F,0xFC,0x10,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x0C,0x00,0x00},/*"L",44*/
{0x10,0x04,0x1F,0xFC,0x1F,0x00,0x00,0xFC,0x1F,0x00,0x1F,0xFC,0x10,0x04,0x00,0x00},/*"M",45*/
{0x10,0x04,0x1F,0xFC,0x0C,0x04,0x03,0x00,0x00,0xE0,0x10,0x18,0x1F,0xFC,0x10,0x00},/*"N",46*/
{0x07,0xF0,0x08,0x08,0x10,0x04,0x10,0x04,0x10,0x04,0x08,0x08,0x07,0xF0,0x00,0x00},/*"O",47*/
{0x10,0x04,0x1F,0xFC,0x10,0x84,0x10,0x80,0x10,0x80,0x10,0x80,0x0F,0x00,0x00,0x00},/*"P",48*/
{0x07,0xF0,0x08,0x18,0x10,0x24,0x10,0x24,0x10,0x1C,0x08,0x0A,0x07,0xF2,0x00,0x00},/*"Q",49*/
{0x10,0x04,0x1F,0xFC,0x11,0x04,0x11,0x00,0x11,0xC0,0x11,0x30,0x0E,0x0C,0x00,0x04},/*"R",50*/
{0x00,0x00,0x0E,0x1C,0x11,0x04,0x10,0x84,0x10,0x84,0x10,0x44,0x1C,0x38,0x00,0x00},/*"S",51*/
{0x18,0x00,0x10,0x00,0x10,0x04,0x1F,0xFC,0x10,0x04,0x10,0x00,0x18,0x00,0x00,0x00},/*"T",52*/
{0x10,0x00,0x1F,0xF8,0x10,0x04,0x00,0x04,0x00,0x04,0x10,0x04,0x1F,0xF8,0x10,0x00},/*"U",53*/
{0x10,0x00,0x1E,0x00,0x11,0xE0,0x00,0x1C,0x00,0x70,0x13,0x80,0x1C,0x00,0x10,0x00},/*"V",54*/
{0x1F,0xC0,0x10,0x3C,0x00,0xE0,0x1F,0x00,0x00,0xE0,0x10,0x3C,0x1F,0xC0,0x00,0x00},/*"W",55*/
{0x10,0x04,0x18,0x0C,0x16,0x34,0x01,0xC0,0x01,0xC0,0x16,0x34,0x18,0x0C,0x10,0x04},/*"X",56*/
{0x10,0x00,0x1C,0x00,0x13,0x04,0x00,0xFC,0x13,0x04,0x1C,0x00,0x10,0x00,0x00,0x00},/*"Y",57*/
{0x08,0x04,0x10,0x1C,0x10,0x64,0x10,0x84,0x13,0x04,0x1C,0x04,0x10,0x18,0x00,0x00},/*"Z",58*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xFE,0x40,0x02,0x40,0x02,0x40,0x02,0x00,0x00},/*"[",59*/
{0x00,0x00,0x30,0x00,0x0C,0x00,0x03,0x80,0x00,0x60,0x00,0x1C,0x00,0x03,0x00,0x00},/*"",60*/
{0x00,0x00,0x40,0x02,0x40,0x02,0x40,0x02,0x7F,0xFE,0x00,0x00,0x00,0x00,0x00,0x00},/*"]",61*/
{0x00,0x00,0x00,0x00,0x20,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x20,0x00,0x00,0x00},/*"^",62*/
{0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01},/*"_",63*/
{0x00,0x00,0x40,0x00,0x40,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"`",64*/
{0x00,0x00,0x00,0x98,0x01,0x24,0x01,0x44,0x01,0x44,0x01,0x44,0x00,0xFC,0x00,0x04},/*"a",65*/
{0x10,0x00,0x1F,0xFC,0x00,0x88,0x01,0x04,0x01,0x04,0x00,0x88,0x00,0x70,0x00,0x00},/*"b",66*/
{0x00,0x00,0x00,0x70,0x00,0x88,0x01,0x04,0x01,0x04,0x01,0x04,0x00,0x88,0x00,0x00},/*"c",67*/
{0x00,0x00,0x00,0x70,0x00,0x88,0x01,0x04,0x01,0x04,0x11,0x08,0x1F,0xFC,0x00,0x04},/*"d",68*/
{0x00,0x00,0x00,0xF8,0x01,0x44,0x01,0x44,0x01,0x44,0x01,0x44,0x00,0xC8,0x00,0x00},/*"e",69*/
{0x00,0x00,0x01,0x04,0x01,0x04,0x0F,0xFC,0x11,0x04,0x11,0x04,0x11,0x00,0x18,0x00},/*"f",70*/
{0x00,0x00,0x00,0xD6,0x01,0x29,0x01,0x29,0x01,0x29,0x01,0xC9,0x01,0x06,0x00,0x00},/*"g",71*/
{0x10,0x04,0x1F,0xFC,0x00,0x84,0x01,0x00,0x01,0x00,0x01,0x04,0x00,0xFC,0x00,0x04},/*"h",72*/
{0x00,0x00,0x01,0x04,0x19,0x04,0x19,0xFC,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00},/*"i",73*/
{0x00,0x00,0x00,0x03,0x00,0x01,0x01,0x01,0x19,0x01,0x19,0xFE,0x00,0x00,0x00,0x00},/*"j",74*/
{0x10,0x04,0x1F,0xFC,0x00,0x24,0x00,0x40,0x01,0xB4,0x01,0x0C,0x01,0x04,0x00,0x00},/*"k",75*/
{0x00,0x00,0x10,0x04,0x10,0x04,0x1F,0xFC,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00},/*"l",76*/
{0x01,0x04,0x01,0xFC,0x01,0x04,0x01,0x00,0x01,0xFC,0x01,0x04,0x01,0x00,0x00,0xFC},/*"m",77*/
{0x01,0x04,0x01,0xFC,0x00,0x84,0x01,0x00,0x01,0x00,0x01,0x04,0x00,0xFC,0x00,0x04},/*"n",78*/
{0x00,0x00,0x00,0xF8,0x01,0x04,0x01,0x04,0x01,0x04,0x01,0x04,0x00,0xF8,0x00,0x00},/*"o",79*/
{0x01,0x01,0x01,0xFF,0x00,0x85,0x01,0x04,0x01,0x04,0x00,0x88,0x00,0x70,0x00,0x00},/*"p",80*/
{0x00,0x00,0x00,0x70,0x00,0x88,0x01,0x04,0x01,0x04,0x01,0x05,0x01,0xFF,0x00,0x01},/*"q",81*/
{0x01,0x04,0x01,0x04,0x01,0xFC,0x00,0x84,0x01,0x04,0x01,0x00,0x01,0x80,0x00,0x00},/*"r",82*/
{0x00,0x00,0x00,0xCC,0x01,0x24,0x01,0x24,0x01,0x24,0x01,0x24,0x01,0x98,0x00,0x00},/*"s",83*/
{0x00,0x00,0x01,0x00,0x01,0x00,0x07,0xF8,0x01,0x04,0x01,0x04,0x00,0x00,0x00,0x00},/*"t",84*/
{0x01,0x00,0x01,0xF8,0x00,0x04,0x00,0x04,0x00,0x04,0x01,0x08,0x01,0xFC,0x00,0x04},/*"u",85*/
{0x01,0x00,0x01,0x80,0x01,0x70,0x00,0x0C,0x00,0x10,0x01,0x60,0x01,0x80,0x01,0x00},/*"v",86*/
{0x01,0xF0,0x01,0x0C,0x00,0x30,0x01,0xC0,0x00,0x30,0x01,0x0C,0x01,0xF0,0x01,0x00},/*"w",87*/
{0x00,0x00,0x01,0x04,0x01,0x8C,0x00,0x74,0x01,0x70,0x01,0x8C,0x01,0x04,0x00,0x00},/*"x",88*/
{0x01,0x01,0x01,0x81,0x01,0x71,0x00,0x0E,0x00,0x18,0x01,0x60,0x01,0x80,0x01,0x00},/*"y",89*/
{0x00,0x00,0x01,0x84,0x01,0x0C,0x01,0x34,0x01,0x44,0x01,0x84,0x01,0x0C,0x00,0x00},/*"z",90*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x3E,0xFC,0x40,0x02,0x40,0x02},/*"{",91*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00},/*"|",92*/
{0x00,0x00,0x40,0x02,0x40,0x02,0x3E,0xFC,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"}",93*/
{0x00,0x00,0x60,0x00,0x80,0x00,0x80,0x00,0x40,0x00,0x40,0x00,0x20,0x00,0x20,0x00},/*"~",94*/
};  
  • 显示一个字符:
void LcdShowChar(u16 x,u16 y,u8 num,u8 size)
{  							  
  u8 temp,t1,t;
	u16 y0=y;
	u8 csize=size/8+((size%8)?1:0))*(size/2);		//得到字体一个字符对应点阵集所占的字节数	
 	num=num-' ';   //得到偏移后的值(ASCII字库是从空格开始取模,所以-' '就是对应字符的字库)
	for(t=0;t;t++)>

五、封装文字描点函数

void DisplayData(u32 x,u32 y,u32 w,u32 h,u8 *p,u16 c1,u16 c2)
{
   u16 i,j,x0=x;
   u8 data;
    u16 colortemp=POINT_COLOR;    
   for(i=0;i0x80) //判断是否是中文-编码规则从 0X8140 开始
        {
            if(x+size>239)
            {
                    x=0; //横坐归0
                    y+=size; //换行
                    if(y+size>319)return;
            }
            //LCD_ShowChar2(x,y,size,*p,c1,c2);//显示一个中文
            x+=size;
            p+=2; //偏移两个字节
        }
        else if(*p>=' ' && *p<='~')  //常用的ASCII码
        {
                if(x+size/2>239)
                {
                        x=0; //横坐归0
                        y+=size; //换行
                        if(y+size>319)return;
                }
                if(size==16)
                {
                    //显示英文字母
                    DisplayData(x,y,size/2,size,(u8*)ASCII_8_16[*p-' '],c1,c2); 
                }
                else if(size==24)
                {
                    DisplayData(x,y,size/2,size,(u8*)ASCII_8_16[*p-' '],c1,c2); 
                }
            
                p+=1;
                x+=size/2;
        }
        else if(*p=='\n')
        {
                x=0;
                y+=size;
                p+=1; //偏移指针
        }
        else 
        {
                p+=1; //偏移指针
        }
    }
}
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6036

    文章

    44554

    浏览量

    634934
  • lcd
    lcd
    +关注

    关注

    34

    文章

    4426

    浏览量

    167439
  • GBK
    GBK
    +关注

    关注

    0

    文章

    2

    浏览量

    7167
  • GB2312
    +关注

    关注

    0

    文章

    6

    浏览量

    1772
收藏 人收藏

    评论

    相关推荐

    单片机Debug工具性能对比 单片机调试常用命令

    。以下是对单片机调试工具性能的简要对比以及一些常用的调试命令。 单片机Debug工具性能对比 Keil uVision 性能 :Keil uVision 是一款功能强大的集成开发环境(IDE),支持多种
    的头像 发表于 12-19 09:56 185次阅读

    单片机编程语言有哪些选择

    常用单片机编程语言,以及它们的特点和应用场景: 1. C语言 特点 :C语言是一种通用的编程语言,以其高效性和灵活性而闻名。它提供了丰富的库函数和直接的硬件访问能力,非常适合用于单片机编程。 应用 :C语言是
    的头像 发表于 11-01 14:13 523次阅读

    请问TPA3112D1的datasheet上的control system要连在单片机上吗?

    请问TPA3112D1的datasheet上的control system 要连在单片机上吗?AVCC是连在单片机上的某个引脚吗?PVCC是连接电源吗?附件是datasheet上给的参考电路图。
    发表于 10-31 08:32

    TAS5711用GDE生成的EQ cfg配置文件怎么加载到单片机上

    TAS5711 的用GDE 生成的EQcfg配置文件怎么加载到单片机上
    发表于 10-25 13:48

    Genitop高通字库标准点阵字库芯片选型手册

    G1--GB2312G2--GBKG3--GB18030B1--BIG5基本集(5401汉字)B2--BIG5全集(13060汉字)U1-外文Unicode (英语、法语、德语、西班牙语、葡萄牙语
    发表于 10-22 14:11 0次下载

    几种常用的共电感磁芯类型

    电子发烧友网站提供《几种常用的共电感磁芯类型.docx》资料免费下载
    发表于 09-20 11:27 0次下载

    单片机烧录程序的线比单片机上的少还能烧录吗

    单片机烧录原理 单片机烧录是指将编写好的程序代码通过一定的方式传输到单片机的存储器中,使其能够按照程序的指令运行。这个过程通常需要使用烧录器或者编程器等设备,通过一定的接口与单片机进行
    的头像 发表于 09-02 09:54 490次阅读

    单片机驱动彩屏最简方案:单片机_RA8889最小开发板驱动控制TFT彩屏介绍(一)

    本文介绍使用单片机+RA8889来驱动和控制彩屏的最小方案。文章从RA8889的架构功能、硬件电路设计及软件设计三个方面来说明。 小编已发布多篇文章介绍了 单片机+RA8889来驱动控制彩屏 ,但是
    发表于 08-22 17:31

    电数电单片机的基本概念及应用领域

    电数电单片机是电子威廉希尔官方网站 领域中的一个非常重要的分支,它涉及到模拟电路、数字电路和单片机威廉希尔官方网站 。 一、电数电单片机的基本概念 模拟电路 模拟电
    的头像 发表于 07-19 09:49 881次阅读

    通过视频帧提取及批量转换实现基于STC32的点阵LED动画播放

    通过视频帧提取及批量转换实现基于STC32的点阵LED动画播放
    的头像 发表于 06-27 02:16 383次阅读
    通过视频帧提取及批量<b class='flag-5'>取</b><b class='flag-5'>模</b>转换实现基于STC32的点阵LED动画播放

    单片机上位机软件用什么开发

    在开发单片机上位机软件时,选择合适的开发工具和编程语言至关重要。本文将详细介绍单片机上位机软件开发的各个方面,包括开发环境、编程语言、界面设计、通信协议、调试与测试等。 1. 开发环境选择 开发单片机上
    的头像 发表于 06-07 09:17 1359次阅读

    12864B 带汉字库的液晶屏 与 arduino 连接 ,你是否顺利显示

    arduino 驱动带汉字库的12864B
    的头像 发表于 05-20 14:16 1754次阅读
    12864B 带<b class='flag-5'>汉字库</b>的液晶屏 与 arduino 连接 ,你是否顺利显示

    请问stm8单片机上电后PC的变化是怎样的?

    请问一下stm8单片机上电后,PC的变化是怎样的?
    发表于 05-15 08:04

    【RTC程序设计:实时音视频权威指南】计算机知识基础篇

    之上在。我们国家的标准为GB 2312,这个标准能编码6763个简体汉字GBK编码是在GB2312基准上推出,其可以表示21886个字符。
    发表于 04-23 09:02

    几种常用单片机的在线升级能力比较

    电子发烧友网站提供《几种常用单片机的在线升级能力比较.pdf》资料免费下载
    发表于 03-24 09:39 2次下载