ASCII码字库的显示

20 篇文章 0 订阅
5 篇文章 0 订阅
tslib源代码时就注意到里面有font_8x8.c和font_8x16.c两个文件(它们来自Linux内核,具体目录是./drivers/video),它们包含了在屏幕上显示所需的所有字符(可打印字符),由此也看了一下tslib显示字符的代码。字符当然是ASCII码了,通过ASCII码字库文件(网上有下载)和在终端上显示ASCII字符。
使用的字库是8x16,每个字符占用内存空间为16字节,文中显示字符所做工作有下面几步(显示汉字也差不多):
1、打开字库文件;
2、计算出要打印的字符在字库文件中的偏移量(亦“寻址”);
3、将这个偏移地址的数据(16字节)读取缓冲区中;
4、显示这个缓冲区,为1者打印,为0者留空。(由于是在终端上显示,因此,可以使用如“#”、“*”等字符代替。)

如何找到某个字符在字库文件中的偏移量。字库里的字符排序是符合ASCII码顺序的,而每个字符占16字节,因此,将要打印的字符与16相乘,便得到这个字符在字库中的位置了大笑,这个位置之后的16个字节的数据,就是这个字符了。比如大写字母“A”,十六进制是0x41(“A”还是十进制的65、八进制的101),它与0x10(十进制的16)相乘,得到0x410。

所谓的字库,里面就是一些二进制数据。将十六进制数据按二进制输出,一个字节一行,共占16行。

代码实现如下{在终端中输出}:

#define FONTDATAMAX 4096
static  char ascii_code[FONTDATAMAX]= {};//数据是8X16 {8bit 16byte}
void display_font_ascii(char *asc)
   {
   	int i, j;
   	printf("=================\n");
   	for(i=0;i<16;i++)
   	{
   		for(j=0;j<8;j++)
   		{
   			/* 逐位相与,为1打印*,为0打印空格*/
   			if(asc[i] & (0x80 >> j))
   				printf("*");
   			else
   				printf(" ");
   		}
   		printf("\n");
   	}
   	printf("=================\n");
   }
  
  /************************************************
   功能:显示某一个ASCII码字符串
   *************************************************/
  void DisplayAscii(){
  	int i;
  	char *p;//获得某个字符串在字库文件的偏移地址
  	char asciicode[] = "AB?";//要显示的字符串
      	long offset;
  	char ascii[16];
  	/* ASCII字库的相关文件 
  	ascii_code是放字库中数据的数组	*/
  	for (i = 0; i < sizeof(asciicode)-1; i++)
  	{
  		printf("%c %x\n", asciicode[i], asciicode[i]);
  		offset = asciicode[i]* 16; // 寻址
  		p = ascii_code + offset;    // 查找字符在ascii_code 数组中的偏移量
  		printf("offset: %x\n", offset);
  		display_font_ascii(p);
      	}
  }



 


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值