LED点阵字模提取学习
一、字模提取原理
无非就是从字库文件中读取出字模数据。
以常用的HZK16字库文件为例:该字库文件是符合GB2312国家标准的16×16点阵字库,HZK16的GB2312-80支持的汉字有6763个,符号682个。其中一级汉字有 3755个,按声序排列,二级汉字有3008个,按偏旁部首排列。
一个字节为8bit,用一个bit位来表示点阵中的一个点的话,16×16点阵需要16*16/8 = 32个字节才能达到显示一个普通汉字的目的。
GBK码也称为区位码,在字库文件中分为94个区。GB2312汉字都是由2字节组成的,第一个字节则是区码,第二个字节则是位码。HZK16字库文件中,汉字区码和位码的起始偏移量都为0xA1(不同的字库偏移量可能不同),故有如下计算公式:
偏移量 = (94*(区码-0xA1)+(位码-0xA1))*32;
以ASC16字库文件为例:在ASC16字库文件中,没有区位的说法,其偏移量就是ASCII码值。由于是ASCII字符,只占1个字节,其宽度只有8。故一个ASCII字符占用16*8/8=16个字节数据。故有如下公式:
偏移量 = ASCII码值*16;
二、图示
汉字 "强" (0x7CBF)
ASCII值 "2" (0x32)
三、LED扫描方式、顺序、方向、阴阳码
得到字模数据后大多数情况不能直接使用,因为LED屏幕大部分情况下是以动态刷新的方式来显示的,字模数据需要根据LED显示屏的扫描方式进行调整,才能满足不同系统的要求,其实无非就是调换字模数据的排列顺序或者对字模数据取反。
四、示例代码
1、汉字 HZK16 字模提取 16*16
#include<stdio.h>
#include <string.h>void Bytes_Read_from_HZK( unsigned char *s, char * chs)
{FILE *fp;unsigned long offset;int ret = 0;int i = 0;int j = 0;int k = 0;unsigned char key[8] = {0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};//offset = ((s[0] - 0xb0) * 94 + (s[1] - 0xa1)) * 32; //根据内码找出汉字在HZK中的偏移位置,不同的字库可能偏移位置不同offset = (94*(unsigned int)(s[0]-0xA1)+(s[1]-0xA1))*32;if ((fp = fopen("HZK16", "rb+")) == NULL)return; //打开字库文件fseek(fp, offset, SEEK_SET); //文件指针偏移到要找的汉字处ret = fread(chs, 32, 1, fp); //读取该汉字32个字节的字模数据printf("ret = %d\n",ret);for(k=0; k<16; k++){for(j=0; j<2; j++){for(i=0; i<8; i++){int flag = chs[k*2+j]&key[i];printf("%s", flag?"● ":"○ ");//将单个字节每个bit位的状态显示出来}}printf("\n");}fclose(fp);
}
int main(int argc,char *argv[])
{char s[2]={0xC7,0xBF};//强char chs[32]={0};char table1[16]={0};char table2[16]={0};// memset(chs,0,32);int i = 0;int k = 0;int j = 0;Bytes_Read_from_HZK( s, chs );for(i = 0; i<32; i++){ if( i % 2 == 0 )table1[j++] = chs[i]; //由于LED扫描方式的需要,故对数据分组进行处理,调换排列顺序并取反elsetable2[k++] = chs[i];}for(i = 0; i<16 ;i++) {printf("0x%02X,", (unsigned char)(~table1[i])); //数据取反}printf("\n");for(i = 0; i<16 ;i++){printf("0x%02X,", (unsigned char)(~table2[i]));}printf("\n");return 0;
}
2、数字、字母 ASC16 字模提取 16*8
#include<stdio.h>
#include <string.h>void Bytes_Read_from_HZK( unsigned char *s, char * chs)
{FILE *fp;unsigned long offset;int ret = 0;int i = 0;int j = 0;int k = 0;unsigned char key[8] = {0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};offset = (*s) * 16; //找出在字库中的偏移位置if ((fp = fopen("ASC16", "r+")) == NULL){printf("open fail!!\n");return; //打开字库文件}fseek(fp, offset, SEEK_SET); //文件指针偏移到要找的字符处ret = fread(chs, 16, 1, fp); //读取该字符的字模printf("ret = %d\n",ret);for(k=0; k<16; k++){for(i=0; i<8; i++){int flag = chs[k]&key[i];printf("%s", flag?"● ":"○ ");}printf("\n");}fclose(fp);
}int main(int argc,char *argv[])
{char s[1]={0x32};//数字 "2"char chs[16]={0};int i = 0;int k = 0;int j = 0;Bytes_Read_from_HZK(s, chs);for(i = 0; i<16; i++){printf("0x%02X,", (unsigned char)(~chs[i]));}printf("\n");return 0;
}
五、相关参考资料传送门:
汉字GBK码查询:
http://www.mytju.com/classCode/tools/encode_gb2312.asp
字模提取参考示例:
https://blog.twofei.com/embedded/hzk.html
字模提取原理:
https://wenku.baidu.com/view/c2b10f1eb7360b4c2e3f6443.html
字模提取软件:
http://www.eeworld.com.cn/mcu/article_2016121532319.html
字库文件下载:
https://pan.baidu.com/s/1He74KkqMl5aqsXY51Ttq_g
LED点阵字模提取学习相关推荐
- 基于ArduinoNano的LED点阵时钟探索(1)四合一MAX7219+DS3231
基于ArduinoNano的LED点阵时钟探索(1)四合一MAX7219+DS3231 这篇文章是自己打算做一个LED点阵时钟记录学习进度的,刚完成第一次点亮MAX7219四合一模块,所以先做好学习记 ...
- 51单片机学习笔记(清翔版)(13)——LED点阵、74HC595
如图3,点阵屏分单色和彩色,点阵屏是由许多点组成的,在一个点上,只有一颗一种颜色的灯珠,这就是单色点阵屏,彩色的在一个点上有三颗灯珠,分别是RGB三原色. 图4你可能没看出来,那么大块黄色的就是点阵屏 ...
- 51单片机学习:LED点阵实验(显示图像)
实验名称:LED点阵实验(显示图像) 接线说明: 实验现象:下载程序后,8*8LED点阵显示心形 注意事项:LED点阵旁的J24黄色跳线帽短接到GND一端 ...
- C# 提取字体点阵字模数据
MCU 项目的 GUI 需要显示文字,没找到合适的,于是 , 用 Visual C# 2008 写了一个字模提取程序. 目前能导出数据,但还没来得及测试数据正确性. 项目托管地址:https://gi ...
- Arduino小项目设计(蜂鸣器与呼吸流水灯结合,以及led点阵)
这还是在禹州那边弄的,应该是在10月8日的时候,怀念一下当初的设计. 我们的蜂鸣器弄的音乐是自己在乐谱上扣的,如果想要学习请点击以下, 学习怎样Arduino蜂鸣器演奏音乐 目录 1.led8*8点阵 ...
- 51单片机开发:通过74HC595控制LED点阵
1.LED点阵介绍 (1)LED点阵就是多个LED发光二极管的集合,在单个LED的发光原理上没有任何区别: (2)上面是16x16的LED点阵,总共有16x16=256个LED灯,由32个引脚来控制, ...
- led动态显示 c语言,单片机LED点阵的纵向移动(动态显示)
点阵的动画显示,说到底就是对多张图片分别进行取模,使用程序算法巧妙的切换图片,多张图片组合起来就成了一段动画了,我们所看到的动画片.游戏等等,它们的基本原理也都是这样的. 上一节我们学了如何在点阵上画 ...
- LED点阵-第1季第8部分-朱有鹏-专题视频课程
LED点阵-第1季第8部分-1818人已学习 课程介绍 本课程是<朱有鹏老师单片机完全学习系列课程>第1季第8个课程,讲解了16*16LED点阵的驱动方式和文字显示.本课程 ...
- 【Proteus仿真】【51单片机】LED点阵广告牌设计
文章目录 一.功能简介 二.软件设计 三.实验现象 联系作者 一.功能简介 本项目使用Proteus8仿真51单片机控制器,使用16*16LED点阵.按键.74HC595D等. 系统运行后,默认以静态 ...
- 「雕爷学编程」Arduino动手做(22)——8X8 LED点阵MAX7219屏
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里 ...
最新文章
- 【Codeforces】716B Complete the Word (26个字母)
- OpenCV识别形状
- 怎样做网络推广浅析怎样优化网站的导航栏?
- 二维LIS(CDQ分治)
- 【深度学习】PyTorch深度学习技术生态
- 下载离线插件包 谷歌浏览器的方法
- html遮罩实例,给原生html中添加水印遮罩层的实现示例
- CentOS 安装 php
- 简单七步,快速入门 JMeter原生压测
- Bootstrap 按钮菜单的尺寸
- 在Word中使用Quick Parts功能
- 【note】软件体系结构(6-10章)
- 【Vue】Nodejs下载与安装
- Red Hat Enterprise Linux 8.0 安装(全网最详细版)
- python第六周项目答案_Python语言程序设计-课后练习-第6周.pdf
- ZUC加密算法实现-软件版本Java
- java jdom_Java JDOM解析器
- R语言安装ccgarch_R语言ARMA-EGARCH模型、集成预测算法对SPX实际波动率进行预测
- win7安装打印机 计算机,win7添加网络打印机的详细步骤【图解】
- vm linux安装增强功能,VirtualBox虚拟机CentOS安装增强功能Guest Additions