|
有时沉在别人太多代码里,看得云里雾里, 不如先知道原理,代码一看就懂。
在点阵屏上写英文或汉字(各种字符也归类于特殊汉字),总有2个问题让我们经常揪心
1. 以指定的方式建立字库
2. 取出汉字字库向LCD写屏的方式
如果概念掌握不好,就会把字库的方式取错了,写出来了也不是汉字,是乱码了。
下面讨论:
1. 以指定的方式建立字库
字库分3类
(1) 常用可见ASCII字 0-9, A-Z及a-z,各种符号*#?()等 数字字库0-9 ,这是XY长度为6*8点的
(2) 半角字符 0-9,A-Z 也是我们常用的数字和英文字符显示方式,占半个汉字大小,是8*16点。半角字符,就是指占汉字一一半大小
(3) 汉字字库常用HZK16(6763个汉字) 显然这是16*16的, 标准的全角字符
一般应用不建议采用第(1)项来显示数字与字母,一是字体太小,二是不便于和汉字混排,不好对齐。
我们来看看标准的HZK16的存储方式和读取方式,贴一段代码(我亲自在VC6的console建个新工程,加入这些代码编译运行):
//hzk汉字点阵
#include <stdio.h>
#include <stdlib.h>
int main()
{
unsigned char incode[3]="一"; // 要读出的汉字,GB编码
unsigned char qh = 0, wh = 0;
unsigned long offset = 0;
char mat[16][2] = {0};
FILE *HZK = 0;
int i,j,k;
//每个汉字,占两个字节, 取其区位号
qh = incode[0] - 0xa0; //获得区码
wh = incode[1] - 0xa0; //获得位码
offset = (94*(qh-1)+(wh-1))*32; //得到偏移位置
if((HZK=fopen("hzk16.bin", "rb")) == NULL)
{
printf("Can't Open hzk16\n");
getchar();
return 0;
}
fseek(HZK, offset, SEEK_SET);
fread(mat, 32, 1, HZK);
fclose(HZK);
//显示
for(i=0; i<16; i++)
{
for(j=0; j<2; j++)
{
for(k=0; k<8; k++)
{
if(mat[j] & (0x80>>k))
{//测试为1的位则显示
printf("%c",'.');
}
else
{
printf("%c",' ');
}
}
}//for(j=0; j<2; j++)
printf("\n");
}//for(i=0; i<16; i++)
getchar();
return 1;
}
原理是这样:
HZK16汉字存储方式 (原文件名:33.jpg)
运行结果:
HZK一字运行结果 (原文件名:一字运行结果.jpg)
我们可以再到WINHEX里面打开HZK16.BIN来看一下读到的字模,也正是“一”字的字模
一字的字模在WINHEX里打开HZK16.BIN (原文件名:一字的字模在WINHEX里.jpg)
2. 取出汉字字库向LCD写屏的方式
液晶NOKIA5110的X,Y概念及写屏方式:
液晶5110由84点*48点组成。 可以看到,最多显示的半角字符是10*6个, 最多显示的汉字是5*3个
液晶5110的规格书上是这样描述它的写入坐标概念的,首先,每次写入命令是写一个竖着的8个bit即一个字节,这是它的一个最基本的写入元单元。(写入时先写高位,这一点对掌握整体概念不重要,先不讨论)。以这样的元单元为计数,屏幕整个被分成了84*6 个这样的元单元。
NOKIA5110的LCD的XY坐标概念 (原文件名:11.JPG)
写入一个汉字“一”,字模如下
/*-- 文字: 一 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xC0,0x80,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
写入过程的函数一般是这样的:
LCD_set_XY(row*8, page);// 列,页
for(i=0; i<16;i++)
{
LCD_write_byte(pgm_read_byte(hanzi+c*32+i),1);
}
LCD_set_XY(row*8, page+1);// 列,页
for(i=16; i<32;i++)
{
LCD_write_byte(pgm_read_byte(hanzi+c*32+i),1);
}
写入示意图如下:
NOKIA5110LCD写入汉字一的过程 (原文件名:22.jpg)
======================================================================================================================
好了,现在问题来了,HZK16和 我们在5110LCD上用的字库是不同的组织方式,一个先行后列, 一个先上半部后下半部。如何转换?
有朋友继续关注我就接着写,如果没朋友关注我就不写了
继续完善
小桥加加 于2010.5 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|