?? 找漢字點陣的子程序.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 + -