自制汉字取模软件,学嵌入式的要看

发布者:uioo9158最新更新时间:2012-08-10 来源: 51hei关键字:汉字编码  点阵  区位码 手机看文章 扫描二维码
随时随地手机看文章

学嵌入式开发这么长时间来一直都在使用别人的取模软件,很希望有自己的取模软件。

今天晚上读了一下汉字编码和点阵的文章做程序如下。希望对无协嵌入式开发有帮助

在计算机中英文一般使用 ASCII 码来表示,而汉字编码使用的是扩展 ASCII 码,用两个ASCII码来表示一个汉字。一个ASCII码占用一个字节,所有在存储时英文是占用一个字节,而汉字占用两个字节。

扩展 ASCII 码:也就是 ASCII 码的最高位是1的 ASCII 码,一个汉字由两个扩展 ASCII 码组成,第一个扩展 ASCII 码用来存放区码,第二个扩展 ASCII 码用来存放位码。

区位码:在 GB2312-80 标准中,将所有的汉字分为94个区,每个区有94个位可以存放94个汉字,形成了人们常说的区位码,这样总共就有 94*94=8836 个汉字。

点阵字库:汉字点阵数据就是按照这个区位的顺序来存放的,也就是最先存放的是第一个区的汉字阵数据,在每一个区中有是按照位的顺序来存放的。

汉字机内码、国标码和区位码三者之间的关系为:区位码(十进制)的两个字节分别转换为十六进制后加20H得到对应的国标码;机内码是汉字交换码(国标码)两个字节的最高位分别加1,即汉字交换码(国标码)的两个字节分别加80H得到对应的机内码;区位码(十进制)的两个字节分别转换为十六进制后加A0H得到对应的机内码

国标码 由两个扩展ascii码组成

汉字区位码的存放实在扩展 ASCII 基础上存放的,并且将区码和位码都加上了32,然后存放在两个扩展 ASCII 码中。具体的说就是:
汉字的  
    第一个扩展ASCII码 = 128+32 + 汉字区码
    第二个扩展ASCII吗 = 128+32 + 汉字位码
 
程序要用的字库HZK16

点击浏览下一页

程序如下
#include "stdio.h"
#include
using namespace std;

void getCode(unsigned char str[],unsigned char data[]);

void  main()
{

 unsigned char str[] = {"王挺帅"};
 unsigned char data[32];
 for(int m = 0;m <1;m++){
  getCode(str+m*2,data);[page]
 
  for (int j=0 ;j<32;j+=2)
  {
   // char 转换成二进制输出
   for(int t = 7;t>=0;t--)
   {
    if((data[j]>>t)&1)
     printf("%d ",(data[j]>>t)&1);
    else
     printf("  ",(data[j]>>t)&1);
   }
  
   for(int t = 7;t>=0;t--)
   {
    if((data[j+1]>>t)&1)
     printf("%d ",(data[j+1]>>t)&1);
    else
     printf("  ",(data[j+1]>>t)&1);
   }
   cout<  }
 }
 getchar();
}

//返回点阵数组
 void getCode(unsigned char str[],unsigned char data[]){
 
  char font_file_name[]   = "HZK16"; // 点阵字库文件名
 int font_width       = 16;  // 单字宽度
 int font_height      = 16;  // 单字高度
 int start_offset     = 0; // 偏移
 long offset;

 FILE *fp;
 fp = fopen(font_file_name, "rb");
 int offset_size = font_width * font_height / 8;
 int string_size = font_width * font_height;
 int i=0;
 if (str[i] > 160)
 {
  // 先求区位码,然后再计算其在区位码二维表中的位置,进而得出此字符在文件中的偏移
  offset = ((str[i] - 0xa1) * 94 + str[i+1] - 0xa1) * offset_size;
  i++;
 }
 else
 {
  offset = (str[i] + 156 - 1) * offset_size;      
 }
 // 读取其点阵数据
 fseek(fp, start_offset + offset, SEEK_SET);
 fread(data,sizeof(char), offset_size,fp);
 fclose(fp);
 }

关键字:汉字编码  点阵  区位码 引用地址:自制汉字取模软件,学嵌入式的要看

上一篇:什么是单片机仿真器
下一篇:基于555设计的声控灯

推荐阅读最新更新时间:2024-03-16 13:05

串行接口中文图形点阵液晶显示模块的应用
摘要:介绍一种具有4位/8位并行、2线/3线串行多种接口方式,内部含有国标一级、二极简体中文字库的图形点阵液晶显示模块;利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。介绍模块的性能特点、操作指令及接口方式;以AT89C2051单片机及2线串行接口方式为例,给出相应的硬件电路及显示子程序。 关键词:串/并接口 液晶模块 中文字库 引言 液晶显示器件由于具有显示信息丰富、功耗低、体积小、质量小、无辐射等优点,得到了广泛的应用;但液晶显示模块复杂的硬件接口和软件编程却令产品设计人员生畏,因而限制了该模块在某些领域的应用。本文介绍一种具有串/并多种接口方式,且内部含有GB2312一级、二级简体中文字库
[电源管理]
51单片机+74HC138驱动16*96点阵显示汉字的Proteus仿真+源代码
1 6*96点阵仿真原理图如下 单片机源码如下: #include reg52.h #define uchar unsigned char #define uint unsigned int #define ulong unsigned long #define CTRL_PORT P2 #define DATA_PORT P0 #define ADDR_PORT P1 uchar code *p; uchar code zifu ={ {0x00,0x01,0x00,0x01,0x3F,0x01,0xA0,0x7F,0xA1,0x20,0x52,0x12,0x14,0x02,0x08,0
[单片机]
51单片机+74HC138驱动16*96<font color='red'>点阵</font>显示汉字的Proteus仿真+源代码
手把手教你学51单片机:变量进阶与点阵LED
一、变量的作用域 作用域:变量的有效范围。分为:局部变量和全局变量。 1.1局部变量 在函数内部声明的变量,只在本函数内部可以使用。 1.2全局变量 在函数外声明的变量就是全局变量。 二、变量的存储类别 变量的存储类别分为自动、静态、寄存器和外部四种。 局部变量如果不加static修饰都属于自动变量。关键词为auto,可以省略。 全局变量均为静态变量。 局部变量加 static 关键字也为静态局部变量。特点是,只赋一次初值,在之后使用中,可以保存前次的执行结果。 eg: static unsigned char i=0; i 为静态局部变量,初始化 i=0 只执行一次。 三、点阵的初步认识 8*
[单片机]
HZK16点阵字库程序
/******************************************************************************* ** 程序名称:演示使用HZK16点阵字库的程序 ** 程序描述:使用HZK16实现显示16*16点阵汉字 ** 性能提升: ** 程序版本:V1.0 ** 程序作者:syrchina ** 最后修改:2011年8月16日 *******************************************************************************/ #include stdio.h /**************
[单片机]
点阵式LED简单图形显示技术
1.   实验任务 在 8X8 点阵式 LED 显示“ ★”、“●”和心形图,通过按键来选择要显示的图形。 2. 电路原理图 图 4.26.1 3. 硬件系统连线 (1).   把“单片机系统”区域中的 P1 端口用 8 芯排芯连接到“点阵模块”区域中的“ DR1 - DR8 ”端口上; (2).   把“单片机系统”区域中的 P3 端口用 8 芯排芯连接到“点阵模块”区域中的“ DC1 - DC8 ”端口上; (3).   把“单片机系统”区域中的 P2.0/A8 端子用导线连接到“独立式键盘”区域中的 SP1 端子上; 4. 程序设计内容
[单片机]
8*8LED点阵显示爱心的Arduino实现
七夕前用树莓派实验了下8*8 LED点阵显示一颗爱心图案。其实这个功能用Arduino更为合适。撇开成本因素,树莓派实现是依赖一个死循环的,我关注了一下CPU使用率,运行期间可能会升到27%的样子,摸了一下CPU散热片,发热还是有一点的。所以决定在Arduino上再来一次。 原理不变,可以继续参考树莓派的那篇。地址:http://blog.csdn.net/ki1381/article/details/52134935 源代码如下,接线方法在头部的定义中。loop中顺便加了一点循环和延时,实现了闪烁效果。 /* BOTH COL & ROW CHIPS ARE 74HC595 */ #define RowDa
[单片机]
基于CPLD和Embedded System的LED点阵显示
摘要:采用自顶向下的设计思想,综合运用EDA 技术、CPLD技术和共享式双口RAM,解决了大屏幕LED点阵显示屏无闪烁显示的技术难题。给出了系统设计方法及实际电路。 LED点阵显示屏是显示公共信息的一种重要显示终端,其中大屏幕LED点阵显示屏在许多场合得以应用。大屏幕显示所采用的技术比中小屏幕显示难度更大,因为其屏幕大、LED点数多,要求在极短的时间内刷新每个点,使得其扫描速率必须非常高,所以只有设计合理的控制电路才能达到这个要求。本文着重解决大屏幕LED点阵显示这一技术难题。通过采用自顶向下的设计思想,综合运用高速CPLD、双口RAM等技术和芯片,设计出了大、小屏幕皆适合的显示控制电路。特别是利用单片机、CPLD与双口
[工业控制]
基于CPLD和Embedded System的LED<font color='red'>点阵</font>显示
采用PIC单片机的LED点阵手写屏设计
  本文采用PIC 16F877A单片机为主要核心控制元件,设计了一个32×32 LED点阵模块的书写显示屏。它主要由光笔模块和点阵显示模块组成,光笔模块利用光敏电阻的光电特性,实现微亮检测功能。光笔反馈信号经放大器LM324比较后,送给单片机处理。32×32点阵显示模块、驱动模块由74HC595外设驱动阵列和8位串行输入/输出移位寄存器ULN2803A组成。光笔通过显示屏微亮扫描寻找坐标值,按键和LED指示灯可实现“点亮、划亮、反显、整屏擦除、笔画擦除、连写多字、对象拖移”等书写显示功能。   系统系统总体构成   本系统设计包括三大部分:PIC 16F877A单片机主控器、光笔控制器、点阵显示屏。系统的结构如图1所示。
[单片机]
采用PIC单片机的LED<font color='red'>点阵</font>手写屏设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved