NOKIA5110 LCD使用心得之坐…

来源:互联网 发布:div模块滚动加载 js 编辑:程序博客网 时间:2024/05/16 05:13
原文地址:LCD使用心得之坐标与字模(多原理少代码版">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 0
原创粉丝点击