注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

快乐的机器猫 大桥加加网易分站

要有更宽广的视野和胸怀

 
 
 

日志

 
 

NOKIA5110 LCD使用心得之坐标与字模(多原理少代码版)  

2010-05-30 09:31:37|  分类: 嵌入式技术 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
  有时沉在别人太多代码里,看得云里雾里, 不如先知道原理,代码一看就懂。

   在点阵屏上写英文或汉字(各种字符也归类于特殊汉字),总有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[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 LCD使用心得之坐标与字模(多原理少代码版) - huasoft - 快乐的机器猫 小桥加加网易分站
 
  
HZK16汉字存储方式 (原文件名:33.jpg) 


运行结果:
NOKIA5110 LCD使用心得之坐标与字模(多原理少代码版) - huasoft - 快乐的机器猫 小桥加加网易分站
  
HZK一字运行结果 (原文件名:一字运行结果.jpg) 


我们可以再到WINHEX里面打开HZK16.BIN来看一下读到的字模,也正是“一”字的字模
NOKIA5110 LCD使用心得之坐标与字模(多原理少代码版) - huasoft - 快乐的机器猫 小桥加加网易分站
  
一字的字模在WINHEX里打开HZK16.BIN (原文件名:一字的字模在WINHEX里.jpg) 


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

液晶5110的规格书上是这样描述它的写入坐标概念的,首先,每次写入命令是写一个竖着的8个bit即一个字节,这是它的一个最基本的写入元单元。(写入时先写高位,这一点对掌握整体概念不重要,先不讨论)。以这样的元单元为计数,屏幕整个被分成了84*6 个这样的元单元。
NOKIA5110 LCD使用心得之坐标与字模(多原理少代码版) - huasoft - 快乐的机器猫 小桥加加网易分站
  
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);
}
写入示意图如下:

NOKIA5110 LCD使用心得之坐标与字模(多原理少代码版) - huasoft - 快乐的机器猫 小桥加加网易分站
 
  
NOKIA5110LCD写入汉字一的过程 (原文件名:22.jpg) 



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


继续完善
  评论这张
 
阅读(1162)| 评论(3)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017