NOKIA5110 LCD使用心得之坐标与字模(多原理少代码版)
来源:互联网 发布:JS删除disabled 编辑:程序博客网 时间:2024/05/17 07:22
有时沉在别人太多代码里,看得云里雾里, 不如先知道原理,代码一看就懂。
在点阵屏上写英文或汉字(各种字符也归类于特殊汉字),总有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;
}
原理是这样:
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上用的字库是不同的组织方式,一个先行后列, 一个先上半部后下半部。如何转换?
有朋友继续关注我就接着写,如果没朋友关注我就不写了
继续完善
在点阵屏上写英文或汉字(各种字符也归类于特殊汉字),总有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;
}
原理是这样:
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上用的字库是不同的组织方式,一个先行后列, 一个先上半部后下半部。如何转换?
有朋友继续关注我就接着写,如果没朋友关注我就不写了
继续完善
- NOKIA5110 LCD使用心得之坐标与字模(多原理少代码版)
- NOKIA5110 LCD使用心得之坐…
- 区分显示LCD汉字字模库中的中文与英文
- TFT LCD使用心得
- 点阵字模生成原理与方法
- LCD与触摸屏坐标转换
- 树莓派使用Nokia5110显示屏
- 对于两个月培训学习java与javaweb的心得,学习之路:说的少做的多胜过说的多做的少的
- LCD驱动程序之层次分析与硬件原理
- 字模生成原理
- NetBots5.5代码分析之套接字模型1
- NetBots5.5代码分析之套接字模型2
- FSMC与LCD连接原理
- LCD驱动之编写代码
- 字码与字模
- 字模bitmap使用实例
- LCD驱动原理及代码分析
- 单片机控制NOKIA5110液晶屏之模块化编程
- linux下的新的ftp工具lftp-支持文件名补全提示功能
- fedora或redhat linux下设置静态IP
- fedora12下配置Apache
- fedora12下配置Apache
- fedora12下启动SSH便于远程登录
- NOKIA5110 LCD使用心得之坐标与字模(多原理少代码版)
- [转]毕业后的五年拉开大家差距的原因在哪里?
- 初识Android笔记
- 【转】浅析C++中内存分配的方式
- C++ BUILDER应用程序与SQL SERVER2000在局域网的联接与常见问题
- 关于在嵌入式设备和服务器之间通信数据--不能用SQL,以后不用再讨论了
- tortoiseHG版本控制工具使用入门
- java里面泛型的学习心得
- PHP 中文乱码的问题解决方案,可解决80%的情况。