開發環境:
Win7,Eclipse,MinGW字體
一、生成ASCII字符文件
ASCII編碼的可打印字符是0x20~0x7E,先用運行下面這段代碼,生成一個包含所有可打印字符的txt文件:編碼
- #include <stdio.h>
- #include <stdlib.h>
-
- int main(int argc,char *argv[])
- {
- FILE * fp;
- unsigned char i = 0;
-
- fp = fopen("ascii.txt","w");
- if(fp == 0)
- {
- perror("open");
- return -1;
- }
- for(i=0x20;i<0x7F;i++)
- {
- fputc(i,fp);
- }
-
- return 0;
- }
運行後,用記事本打開ascii.txt文件,會看到以下文本:spa
二、生成字模數據
使用字模提取V2.1軟件,設置字體爲宋體、12,縱向取模,字節倒序(即高位在下)。這些設置能夠根據實際狀況設置。用C51格式生成字模,大小是8*16,每一個字符用16個字節表示。如字符A的顯示以下:.net
取模數據爲:指針
0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00,0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20,blog
而後將全部的字模數據複製到一個文本文件,刪除其中的空行,換行,註釋等與字模數據無關的內容,並將文件最後的一個逗號改成ASCII字符的句號,獲得一個純字模數據文件ascii_zk.txtip
三、將字模數據文件轉換爲二進制文件
將ascii_zk.txt文件中的每一個字模數據轉換爲佔一個字節的數,將全部的數據填充爲一個二進制文件ascii_zk.bin。這樣,按照ASCII碼的順序,ascii_zk.bin中每16個字節就能夠繪製一個字符。文件轉換的程序以下:ci
- #include <stdio.h>
- #include <stdlib.h>
- unsigned char c2x(char ch)
- {
- unsigned char temp=0;
- if(ch>=0x30 && ch<=0x39)
- temp = ch-0x30;
- else if(ch>=0x41 && ch<=0x46)
- temp = 0x0a+(ch-0x41);
- else if(ch>=0x61 && ch<=0x66)
- temp = 0x0a+(ch-0x61);
- else
- temp =0xff;
- return temp;
- }
- int main(void)
- {
- char buffer[5];
- unsigned char ch=0;
-
- int i=0;
-
- FILE *frp=0;
- FILE *fwp=0;
-
- for(i=0; i<5; i++)
- buffer[i] = 0;
-
- frp=fopen("ascii_zk.txt","r");
- fwp=fopen("ascii_zk.bin","w");
-
- while(buffer[4] != 0x2e)
- {
- for(i=0; i<5; i++)
- buffer[i]=fgetc(frp);
- ch = c2x(buffer[2]);
- ch = ch*16;
- ch = ch+c2x(buffer[3]);
-
- fputc(ch,fwp);
-
- }
-
- fclose(frp);
- fclose(fwp);
-
- return 0;
- }
字庫文件製做完畢。開發
四、字庫文件ascii_zk.bin的使用
ascii_zk.bin文件從ASCII碼的空格(0x20)開始,每16個字節表示一個字符的點陣字模。以字母A爲例,它的ASCII碼是0x41,那麼,它的字模數據的開始位置就是:get
(0x41-0x20)*16
從這個位置開始依次讀取16個字節,就是字母A的字模數據,將其顯示便可。
例:用Linux的終端模擬顯示點陣字符,終端屏幕中的每一個字符位置就是一個點,程序以下。
- #include <stdio.h>
- #include <unistd.h>
- #include <curses.h>
-
- #define START 0x20
- #define DATANUM 0x10
-
- int displaychar(FILE *fp,char dispch,char fillch,char start_x,char start_y);
-
- int main(void)
- {
- FILE* fp=0;
-
- int i = 0;
- const char * teststring="I love Julia";
-
- fp=fopen("ascii_zk.bin","r");
-
-
- initscr();
-
- for(i=0;(teststring[i]!=0);i++)
- {
- displaychar(fp,teststring[i],'*',0+(i*8),0);
- }
-
- refresh();
-
- while(1);
-
- endwin();
- fclose(fp);
- return 0;
- }
-
-
- int displaychar(FILE *fp,char dispch,char fillch,char start_x,char start_y)
- {
- int location = ((dispch-START) * DATANUM);
- char x=start_x;
- char y=start_y;
-
- int i=0;
- int j=0;
- char buf=0;
-
-
- fseek(fp,location,SEEK_SET);
-
- for(i=0;i<DATANUM;i++)
- {
- buf = fgetc(fp);
-
-
- for(j=0;j<8;j++)
- {
- move(y+j,x);
- if(buf & (0x01<<j))
- addch(fillch);
- }
-
- if(x == (start_x+7))
- {
- x = start_x;
- y = (start_y+8);
- }
- else
- {
- x++;
- }
- }
-
- return 0;
- }
該程序在Fedora12的終端中運行,效果以下:
下載:
ASCII點陣字庫文件