搜索
bottom↓
回复: 50

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

[复制链接]

出0入0汤圆

发表于 2010-5-29 11:48:43 | 显示全部楼层 |阅读模式
有时沉在别人太多代码里,看得云里雾里, 不如先知道原理,代码一看就懂。

   在点阵屏上写英文或汉字(各种字符也归类于特殊汉字),总有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周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2010-5-29 11:51:06 | 显示全部楼层
听课了.

出0入0汤圆

发表于 2010-5-29 12:01:32 | 显示全部楼层
等待。。。

出0入0汤圆

 楼主| 发表于 2010-5-29 14:12:41 | 显示全部楼层
谢谢大家支持,自己也占个位

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

出0入0汤圆

发表于 2010-5-29 20:06:54 | 显示全部楼层
mark.楼主要写。

出0入0汤圆

发表于 2010-5-29 21:01:37 | 显示全部楼层
写的不错,继续.
这样介绍比看程序好

出0入0汤圆

 楼主| 发表于 2010-5-31 19:23:07 | 显示全部楼层
纠正一点, 上面的图有一个小BUG, 一字字模的横最左面应该延伸到边的。

特此更正

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


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



-----------------------------------------------------------
为了让NOKIA5110直接用hzk16字库形式而不需要转换, 我们直接把hzk16转成适合Nokia5110的扫描方式,
关键代码段
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//2.将标准hzk16.bin的16*16的先行后列字模转换成NOKIA5110屏用的先刷汉字上半部分16列,再刷下半部分16列的方式(见文档)
        //add hzk16fornokia5110.bin write routine here
                FILE *HZK1 = 0, *HZK2 = 0;
        unsigned long offset1 = 0, offset2 =0;

        if((HZK1=fopen("hzk16.bin", "rb")) == NULL)  
        {  
                printf("Can't Open hzk16.bin\n");  
                getchar();
                return 0;
        }  
        if((HZK2=fopen("hzk16fornokia5110.bin", "wb")) == NULL)  
        {  
                printf("Can't Open hzk16fornokia5110.bin\n");  
                getchar();
                return 0;
        }  
       
        offset1=0;

        unsigned char mat1[2][16],mat2[2][16];
        //int i,j,k,m;
        while( !feof(HZK1) )
        {
                fseek(HZK1, offset1, SEEK_SET);
                fread(mat1, 32, 1, HZK1);
               
                //mat1-->mat2
          for(i=0;i<2;i++)
          {
                        for(j=0;j<8;j++)
                        {
                          for(k=0;k<8;k++) //bit
                          {
                                //mat2[0][j].bit[k]= mat1[0][j*2].bit[7-k];
                                if( bit_isset(mat1[k*2],(7-j))==1 )
                                {       
                                        bit_set(mat2[j],k);
                                }
                                else
                                {
                                        bit_clr(mat2[j],k);
                                }
                          }
                        }

               
                        for(j=0;j<8;j++)
                        {
                          for(k=0;k<8;k++) //bit       
                          {
                       
                                //mat2[0][j+8].bit[k]= mat1[0][j*2+1].bit[7-k];
                                if( bit_isset(mat1[k*2+1],(7-j))==1)
                                {       
                                        bit_set(mat2[j+8],k);
                                }
                                else
                                {       
                                        bit_clr(mat2[j+8],k);
                                }
                          }
                        }
               
          }//for(i=0;i<2;i++)

                //write mat2
                printf("write offset: %ld\n",offset1);
                fseek(HZK2, offset1, SEEK_SET);
                fwrite(mat2,32,1,HZK2);
                offset1+=32;
        }//while

        printf("I find the feof()!=0!\n");
       
        fclose(HZK1);
        fclose(HZK2);
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

源码包下载(VC6工程)

hzk16for_nokia5110_sourcecode_vc6.rar(hzk16.bin转成hzk16for_nokia5110.bin生成器源码)ourdev_558640.rar(文件大小:554K) (原文件名:hzk16for_nokia5110_sourcecode_vc6.rar)

出0入0汤圆

发表于 2010-6-6 23:58:26 | 显示全部楼层

出0入0汤圆

发表于 2010-6-9 21:06:34 | 显示全部楼层
不顶不行!

出0入0汤圆

发表于 2010-6-11 01:51:08 | 显示全部楼层
记号

出0入0汤圆

发表于 2010-6-11 08:03:51 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-10-31 10:33:43 | 显示全部楼层
很好

出0入0汤圆

发表于 2010-12-4 22:23:15 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-4 22:24:17 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-17 11:32:12 | 显示全部楼层
请问 HZK16.BIN 文件是系统中自带的嘛?怎么找到这个文件?

出0入0汤圆

发表于 2010-12-21 14:48:51 | 显示全部楼层
发现hzk16for_nokia5110.bin此文件用竖向扫描也有些问题,我在st7565上显示的字总是多出一些额外的点。

出0入0汤圆

发表于 2010-12-23 21:18:49 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-23 21:52:02 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-1-9 14:46:23 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-4-9 15:33:06 | 显示全部楼层
mark  顶一下

出0入0汤圆

发表于 2011-4-24 13:32:15 | 显示全部楼层
mark  顶一下

出0入0汤圆

发表于 2011-4-24 19:52:50 | 显示全部楼层
可以

出0入0汤圆

发表于 2011-4-24 21:25:18 | 显示全部楼层
好东西

出0入0汤圆

发表于 2011-5-31 21:38:04 | 显示全部楼层
mark

非常感谢!正在学这用呢。。。。

出0入0汤圆

发表于 2011-6-11 20:20:09 | 显示全部楼层
学习了,谢谢lz…………

出0入0汤圆

发表于 2011-6-11 20:35:47 | 显示全部楼层
mark!!!

出0入0汤圆

发表于 2011-6-11 21:23:04 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-9-8 12:23:09 | 显示全部楼层
mark  xuexile

出0入0汤圆

发表于 2011-10-8 12:55:55 | 显示全部楼层
顶,刚好在学,谢谢楼主了!

出0入0汤圆

发表于 2011-10-13 15:01:06 | 显示全部楼层
mark。。。。。
原理入手,有时候的确很快。

出0入0汤圆

发表于 2011-10-13 16:16:07 | 显示全部楼层
学习。

出0入0汤圆

发表于 2011-10-13 16:45:18 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-13 21:01:25 | 显示全部楼层
顶~~~~

出0入0汤圆

发表于 2012-1-2 16:39:21 | 显示全部楼层
Mark。。。

出0入0汤圆

发表于 2012-1-2 17:09:35 | 显示全部楼层
谢谢。。。学习了!Mark

出0入0汤圆

发表于 2012-1-2 22:44:25 | 显示全部楼层
回复【33楼】crazydtone
mark。。。
-----------------------------------------------------------------------

出0入0汤圆

发表于 2012-1-2 23:57:23 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-1-3 09:44:54 | 显示全部楼层
nokia5110 lcd .

出0入0汤圆

发表于 2012-1-3 13:33:05 | 显示全部楼层
很不错

出0入0汤圆

发表于 2012-2-22 20:13:30 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-29 23:50:29 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-3-1 17:01:06 | 显示全部楼层
记号

出0入0汤圆

发表于 2012-3-24 00:53:25 | 显示全部楼层
好好学习!

出0入0汤圆

发表于 2012-4-18 17:54:04 | 显示全部楼层
楼主讲的很不错,我当初自己摸索了两三天才想明白原理,楼主这样一目了然

出0入0汤圆

发表于 2012-4-19 00:45:34 | 显示全部楼层
好资料,收藏

出0入0汤圆

发表于 2012-4-19 07:44:02 | 显示全部楼层
学习了,不过我的买回来到现在还没有玩了。哈哈,,,,,一直放着了

出0入0汤圆

发表于 2012-4-19 08:26:47 | 显示全部楼层
我有一份比较详细的5110lcd介绍,包含驱动。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-5-5 16:20:45 | 显示全部楼层
虽然看不太懂,但还是顶一顶。(*^__^*) 嘻嘻……

出0入0汤圆

发表于 2012-5-7 15:03:40 | 显示全部楼层
MARK  前来学习。。。

出0入0汤圆

发表于 2013-7-29 10:36:35 | 显示全部楼层
还会继续么?

出0入0汤圆

发表于 2014-12-2 15:35:15 | 显示全部楼层
MARK  路过学习.
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 06:25

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表