NOKIA5110 LCD使用心得之坐…

    有时沉在别人太多代码里,看得云里雾里,  不如先知道原理,代码一看就懂。

      在点阵屏上写英文或汉字(各种字符也归类于特殊汉字),总有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  hzk16n");   
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[i][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; 
}
原理是这样:
[转载]NOKIA5110 <wbr>LCD使用心得之坐标与字模(多原理少代码版



 
HZK16汉字存储方式  (原文件名:33.jpg) 


运行结果:
[转载]NOKIA5110 <wbr>LCD使用心得之坐标与字模(多原理少代码版

 
HZK一字运行结果  (原文件名:一字运行结果.jpg) 


我们可以再到WINHEX里面打开HZK16.BIN来看一下读到的字模,也正是“一”字的字模
[转载]NOKIA5110 <wbr>LCD使用心得之坐标与字模(多原理少代码版

 
一字的字模在WINHEX里打开HZK16.BIN  (原文件名:一字的字模在WINHEX里.jpg) 


2.  取出汉字字库向LCD写屏的方式
液晶NOKIA5110的X,Y概念及写屏方式:
液晶5110由84点*48点组成。  可以看到,最多显示的半角字符是10*6个,  最多显示的汉字是5*3个

液晶5110的规格书上是这样描述它的写入坐标概念的,首先,每次写入命令是写一个竖着的8个bit即一个字节,这是它的一个最基本的写入元单元。(写入时先写高位,这一点对掌握整体概念不重要,先不讨论)。以这样的元单元为计数,屏幕整个被分成了84*6  个这样的元单元。
[转载]NOKIA5110 <wbr>LCD使用心得之坐标与字模(多原理少代码版

 
NOKIA5110的LCD的XY坐标概念  (原文件名:11.JPG) 


写入一个汉字“一”,字模如下


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);
}
写入示意图如下:

[转载]NOKIA5110 <wbr>LCD使用心得之坐标与字模(多原理少代码版



 
NOKIA5110LCD写入汉字一的过程  (原文件名:22.jpg) 



======================================================================================================================
        好了,现在问题来了,HZK16和  我们在5110LCD上用的字库是不同的组织方式,一个先行后列,  一个先上半部后下半部。如何转换?
        有朋友继续关注我就接着写,如果没朋友关注我就不写了


继续完善
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值