• ASCII字符点阵字库的制作和使用


    开发环境:

    Win7,Eclipse,MinGW

     

    1、生成ASCII字符文件

    ASCII编码的可打印字符是0x20~0x7E,先用运行下面这段代码,生成一个包含全部可打印字符的txt文件:

     

    [cpp] view plain copy
     
    1. #include <stdio.h>  
    2. #include <stdlib.h>  
    3.   
    4. int main(int argc,char *argv[])  
    5. {  
    6.     FILE * fp;  
    7.     unsigned char i = 0;  
    8.   
    9.     fp = fopen("ascii.txt","w");  
    10.     if(fp == 0)  
    11.     {  
    12.         perror("open");  
    13.         return -1;  
    14.     }  
    15.     for(i=0x20;i<0x7F;i++)  
    16.     {  
    17.         fputc(i,fp);  
    18.     }  
    19.   
    20.     return 0;  
    21. }  

    运行后,用记事本打开ascii.txt文件,会看到如下文本:

     

    2、生成字模数据

    使用字模提取V2.1软件,设置字体为宋体、12,纵向取模,字节倒序(即高位在下)。这些设置可以根据实际情况设置。用C51格式生成字模,大小是8*16,每个字符用16个字节表示。如字符A的显示如下:

     

    取模数据为:

    0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00,0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20,

    然后将所有的字模数据复制到一个文本文件,删除其中的空行,换行,注释等与字模数据无关的内容,并将文件最后的一个逗号改为ASCII字符的句号,得到一个纯字模数据文件ascii_zk.txt

     

    3、将字模数据文件转换为二进制文件

    将ascii_zk.txt文件中的每个字模数据转换为占一个字节的数,将所有的数据填充为一个二进制文件ascii_zk.bin。这样,按照ASCII码的顺序,ascii_zk.bin中每16个字节就可以绘制一个字符。文件转换的程序如下:

     

    [cpp] view plain copy
     
    1. #include <stdio.h>  
    2. #include <stdlib.h>  
    3. /* 
    4.  *将一个ascii字符转换为数 
    5.  */  
    6. unsigned char c2x(char ch)  
    7. {  
    8.     unsigned char temp=0;  
    9.     if(ch>=0x30 && ch<=0x39)  
    10.         temp = ch-0x30;  
    11.     else if(ch>=0x41 && ch<=0x46)  
    12.         temp = 0x0a+(ch-0x41);  
    13.     else if(ch>=0x61 && ch<=0x66)  
    14.         temp = 0x0a+(ch-0x61);  
    15.     else  
    16.         temp =0xff;  
    17.     return temp;  
    18. }  
    19. //将ascii_zk.txt转换为二进制文件  
    20. int main(void)  
    21. {  
    22.     char buffer[5];  
    23.     unsigned char ch=0;  
    24.   
    25.     int i=0;  
    26.   
    27.     FILE *frp=0;  
    28.     FILE *fwp=0;  
    29.   
    30.     for(i=0; i<5; i++)  
    31.         buffer[i] = 0;  
    32.   
    33.     frp=fopen("ascii_zk.txt","r");  
    34.     fwp=fopen("ascii_zk.bin","w");  
    35.   
    36.     while(buffer[4] != 0x2e) //全部数据以句号结尾  
    37.     {  
    38.         for(i=0; i<5; i++)  
    39.             buffer[i]=fgetc(frp);  
    40.         ch = c2x(buffer[2]);  
    41.         ch = ch*16;  
    42.         ch = ch+c2x(buffer[3]);  
    43.   
    44.         fputc(ch,fwp);  
    45.   
    46.     }  
    47.   
    48.     fclose(frp);  
    49.     fclose(fwp);  
    50.   
    51.     return 0;  
    52. }  

    字库文件制作完毕。

     

    4、字库文件ascii_zk.bin的使用

    ascii_zk.bin文件从ASCII码的空格(0x20)开始,每16个字节表示一个字符的点阵字模。以字母A为例,它的ASCII码是0x41,那么,它的字模数据的开始位置就是:

    (0x41-0x20)*16

    从这个位置开始依次读取16个字节,就是字母A的字模数据,将其显示即可。

    例:用Linux的终端模拟显示点阵字符,终端屏幕中的每个字符位置就是一个点,程序如下。

     

    [cpp] view plain copy
     
    1. #include <stdio.h>  
    2. #include <unistd.h>  
    3. #include <curses.h>  
    4.   
    5. #define START 0x20  
    6. #define DATANUM 0x10  
    7.   
    8. int displaychar(FILE *fp,char dispch,char fillch,char start_x,char start_y);  
    9.   
    10. int main(void)  
    11. {  
    12.     FILE* fp=0;  
    13.   
    14.     int i = 0;  
    15.     const char * teststring="I love Julia";  
    16.   
    17.     fp=fopen("ascii_zk.bin","r");  
    18.   
    19.   
    20.     initscr();  
    21.   
    22.     for(i=0;(teststring[i]!=0);i++)  
    23.     {  
    24.         displaychar(fp,teststring[i],'*',0+(i*8),0);  
    25.     }  
    26.   
    27.     refresh();  
    28.   
    29.     while(1);  
    30.   
    31.     endwin();  
    32.     fclose(fp);  
    33.     return 0;  
    34. }  
    35.   
    36. /* 
    37.  * 以点阵方式显示一个ASCII字符 
    38.  * dispch是要显示的字符,fillch是填充点阵的字符 
    39.  * start_x,start_y是显示的起始坐标 
    40.  */  
    41.   
    42. int displaychar(FILE *fp,char dispch,char fillch,char start_x,char start_y)  
    43. {  
    44.     int location = ((dispch-START) * DATANUM);  
    45.     char x=start_x;  
    46.     char y=start_y;  
    47.   
    48.     int i=0;  
    49.     int j=0;  
    50.     char buf=0;  
    51.   
    52.     //将文件流指针移到到dispch字符点阵数据的起始位置  
    53.     fseek(fp,location,SEEK_SET);  
    54.   
    55.     for(i=0;i<DATANUM;i++)  
    56.     {  
    57.         buf = fgetc(fp);  
    58.   
    59.         //显示一个字节  
    60.         for(j=0;j<8;j++)  
    61.         {  
    62.             move(y+j,x);  
    63.             if(buf & (0x01<<j))  
    64.                 addch(fillch);  
    65.         }  
    66.   
    67.         if(x == (start_x+7))  
    68.         {  
    69.             x = start_x;  
    70.             y = (start_y+8);  
    71.         }  
    72.         else  
    73.         {  
    74.             x++;  
    75.         }  
    76.     }  
    77.   
    78.     return 0;  
    79. }  

    该程序在Fedora12的终端中运行,效果如下:

     

     

    下载:

    ASCII点阵字库文件

  • 相关阅读:
    常用的正则表达式
    vue多页面应用
    webpack + jquery + bootstrap 环境配置
    Goroutine的几个例子
    设置css通用字体
    简单的gulpfile.js参数配置
    1:时间戳转换成年月日函数,2:url截取参数方法,3:弹窗自定义方法 4:点击按钮加入购物车
    github上比较全的知识
    秒杀倒计时
    正则校验手机号码并获取手机验证码倒计时的实例
  • 原文地址:https://www.cnblogs.com/cliuwei/p/6564588.html
Copyright © 2020-2023  润新知