⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 字模提取程序.txt

📁 一种字模提取的思想及程序
💻 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 + -