📄 字模提取程序.txt
字号:
初学者:请问一个汉字可由区码、位码2个字节确定,若是汉字或字符,采用ucdos下asc16库,一个数字或字符需几个字节? [aprilwind] [12次] 01-9-19 16:19:24
关于汉字回答 [方塘] [29次] 01-9-19 16:35:10
asc16 是16点阵的,也是由区码和位码两个字节确实,是在前面几区,汉字是在16区以后,
一级字库总共有1~55区,二级字库是56~87(57H)区,一级字库和二级字库每区都是94(5EH)
个,所以汉字的内码:区码最大 57H + 0A0H = 0F7H ,位码最大: 5EH + 0A0H = 0FEH
谢谢!另请问若汉字采用ucdos下的hzk16,字符数字采用ucdos下的asc16,字符数字的首地址是否为offset=(区码-a1)*94*16+(位码-a1)*16. [aprilwind] [4次] 01-9-19 17:02:24
更正 [方塘] [19次] 01-9-19 下午 05:19:01
asc16 用Ultraedit 看了一下,好象不是16x16点阵,是8x16点阵。
如果是8x16 点阵,取法就不是这样了,到<a href=http://www.gzmcu.com target=_blank>http://www.gzmcu.com </a>的项目开发里VFD驱动有
关于汉字及数字了读取程序,汇编写的。
谢谢方塘,请问用ultraedit可以看到点阵信息吗?我用source insight 只看到乱码.谢谢你了 [aprilwind] [3次] 01-9-19 17:24:44
为什么http://www.gzmcu.com?上不去哪? [aprilwind] [10次] 01-9-19 17:28:43
找汉字点阵的子程序 [方塘] [12次] 01-9-20 8:20:50
一个试验程序
/*********************************************************************/
/* 字模提取程序 */
/*程序设计:zhaojunjie 日期:2001-06-08 */
/*********************************************************************/
/****************************************************************
内码转换成区位码方法:qm = nm1 - 0xa0 wm = nm2 - 0xa0
区位码是: qw = qm && 0xff + wm
该汉字在字库中位置: offset =(94 * (qm - 1) + (wm - 1)) * 32
*****************************************************************/
#include "stdio.h"
#define uchar unsigned char
FILE *fp;
void hanzzk(char *hz); /*提取汉字字模*/
void WriteFile(uchar dot[]);
/********************************************************************
*
* 名称: hanzzk
* 说明:
* 功能: 提取汉字字模
* 调用:
* 输入:
* 返回值: 无
***********************************************************************/
void hanzzk(uchar *s) /*提取汉字字模*/
{
unsigned long offset;
int i;
uchar qm, wm; /*汉字区位码*/
uchar rbuff[32];
if((fp=fopen("e:\\zhaoC\\tc20\\hzk16","rb"))==0)
{
printf("不能打开文件。\n");
exit(1);
}
while(*s!='\0')
{
qm = *(s) - 0xa0; /*汉字区位码*/
wm = *(s+1) - 0xa0;
offset =(long)(94 * (qm - 1) + (wm - 1)) * 32;/*计算该汉字在字库中偏
移量*/
fseek(fp,offset,SEEK_SET); /*取得 fp 文件位置指示器 */
fread(rbuff, 32, 1, fp); /*取出32位字节的点阵字模存入rbuff中
*/
/* 增加字模转换 */
WriteFile(rbuff); /* 保存到文件中 */
s +=2; /*因为一个汉字内码占用两个字节,故s=s+2*/
}
fclose(fp);
}
/********************************************************************
*
* 名称: WriteFile
* 说明:
* 功能: 汉字字模写入文件
* 调用:
* 输入:
* 返回值: 无
***********************************************************************/
void WriteFile(uchar dot[32])
{
char i,a,b,c;
if((fp = fopen("hzzk.asm","aw"))==0)
{
printf("不能打开文件。\n");
exit(1);
}
/*-------------------------------------------------*/
for (i = 0; i< 32; i++)
{
if(i%16==0)
{
c='D';
fwrite(&c,sizeof(char),1,fp);
c='B';
fwrite(&c,sizeof(char),1,fp);
c=0x20;
fwrite(&c,sizeof(char),1,fp);
}
a = dot[i] / 0x10;
b = dot[i] % 0x10;
if(a < 10)
a = a + 0x30; /* 0~9 */
else
a = a + 55; /* A~F */
if (b < 10)
b = b + 0x30; /* 0~9 */
else
b = b + 55; /* A~F */
/*---------------------------------------------------*/
if(a >= 0x41) /* a>='A' */
{
c = '0';
fwrite(&c,sizeof(char),1,fp);
}
if(a != '0')
fwrite(&a,sizeof(char),1,fp);
else
{
if(b >= 0x41) /* b>='A' */
{
c = '0';
fwrite(&c,sizeof(char),1,fp);
}
}
fwrite(&b,sizeof(char),1,fp);
/*-------------------------------------------------------*/
c='H';
fwrite(&c,sizeof(char),1,fp);
if(i%16==15)
c=0x0a;
else
c=',';
fwrite(&c,sizeof(char),1,fp);
}
fclose(fp);
}
/*********************************************************/
main()
{
uchar *hz; /*= "啊"; */
uchar ch[100];
printf("请输入汉字:\n");
scanf("%s",ch);
hz = ch;
hanzzk(hz);
}
找汉字点阵 [方塘] [11次] 01-9-20 上午 08:28:01
;==========================================================
;通过汉字的机内码转化为区位码来找其点阵
;入口参数: R2,R3 其中 R2:机内码的高字节,R3:机内码的低字节
; R5,R6 点阵缓冲区地址
;出口信息: 点阵送 #DOT_BUF 为首地址的缓冲区
;**********************************************************
HZ_QWM: MOV A, R3 ;汉字内码的低字节
CLR C
SUBB A, #0A0H ;汉字的位码
MOV R3, A
MOV A, R2 ;汉字内码的高字节
CLR C
SUBB A, #0B0H ;汉字的区码
MOV B, #64H ;每区100个汉字
MUL AB ;(区码 X 100)-->(BA)
ADD A, R3 ;(区码 X 100 + 位码)-->(BA)
JNC WM_C0
INC B
WM_C0: MOV R2, B ;高字节送 R2
MOV B, #20H
MUL AB ;低字节 X 32
MOV R3, A ;部分积的低字节送 R3
MOV R4, B ;部分积的高字节送 R4
MOV A, R2
MOV B, #20H
MUL AB ;高字节 X 32
ADD A, R4 ;( 区码 X 100 + 位码 ) X 32 = 偏移量
MOV R4, A
MOV DPTR, #HZ_DA ;#HZ_DA汉字库首地址
CLR C ;所要汉字地址 = 偏移量 + 汉字库首地址
MOV A, R3
ADD A, DPL
MOV DPL, A ;该汉字地址的低字节
MOV A, R4
ADDC A, DPH
MOV DPH, A ;该汉字地址的高字节
MOV R4, #32 ;每个汉字32个字节
HZ_DOT: CLR A
MOVC A, @A+DPTR ;DPTR+A-->汉字在字库中点阵地址
MOV R2, DPH ;偏移量保存在 (R5R6) 中
MOV R3, DPL
MOV DPH, R5 ;
MOV DPL, R6 ;
MOVX @DPTR,A ;字库的点阵送缓冲区 #DOT_BUF
INC DPTR
MOV R5, DPH
MOV R6, DPL
MOV DPH, R2
MOV DPL, R3
INC DPTR
DJNZ R4, HZ_DOT
RET
SZ_ASCII: MOV A, R2 ;通过数字或字母的ASCII码找其地址
CLR C
SUBB A, #30H ;
MOV B, #10H ;每个数字或字母的ASCII码点阵数据16个字节
MUL AB
MOV DPTR, #SHU_DA ;#SHU_DA数字字母字库首地址
CLR C
ADD A, DPL ;所寻地址 = 偏移量 + 首地址
MOV DPL, A
MOV A, B
ADDC A, DPH
MOV DPH, A
MOV R4, #16 ;每个ASCII码16个字节点阵
SZ_DOT: CLR A
MOVC A, @A+DPTR ;把该数字或字母的点阵数据送内部RAM
MOV R2, DPH ;偏移量保存在 (R5R6) 中
MOV R3, DPL
MOV DPH, R5
MOV DPL, R6
MOVX @DPTR,A ;字库的点阵送缓冲区 #DOT_BUF
INC DPTR
MOV R5, DPH
MOV R6, DPL
MOV DPH, R2
MOV DPL, R3
INC DPTR
DJNZ R4, HZ_DOT
RET
;****************************************************
我从网上下了ultraedit,多谢方塘的指点! [aprilwind] [2次] 01-9-20 上午 08:49:40
点击这里回复这篇贴子>>
_____________________________________________________________________________
Copyright?,C51BBS论坛 2000-2001
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -