Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2675681
  • 博文数量: 877
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 5921
  • 用 户 组: 普通用户
  • 注册时间: 2013-12-05 12:25
个人简介

技术的乐趣在于分享,欢迎多多交流,多多沟通。

文章分类

全部博文(877)

文章存档

2021年(2)

2016年(20)

2015年(471)

2014年(358)

2013年(26)

分类: LINUX

2014-08-21 17:00:20


http://blog.csdn.net/boygrass/article/details/6824352

无OS的课程基本都完成了。有之前C/C++的基础,完成得还是比较轻松的。

刚刚完成了 从uC/OS中提取字库,并移植到无OS的环境下。

理解了:

点阵字库实际上就是点阵的二进制表示,通常英文字符用16*8的点阵,中文字符用16*16的点阵。

比如一个英文字符,在字库中就是用16个8位的数来表示,每个数代表点阵的一行。

类似地,汉字在字库中就是用16个16位的数来表示。如下图中,每个点,黑色为1,白色为0,就组成了点阵字库

   

几个关键的函数

  1. //在显示上显示一个英文字符(ASCII码)  
  2. void Lcd_PutASCII(unsigned int x,unsigned int y,unsigned char ch,unsigned int  
  3. c,unsigned int bk_c,unsigned int st)  
  4. {  
  5.     unsigned short int i,j;  
  6.     unsigned char *pZK,mask,buf;  
  7.     pZK = &__VGA[ch*16];  
  8.     for( i = 0 ; i < 16 ; i++ )  
  9.     {  
  10.         mask = 0x80;  
  11.         buf = pZK[i];  
  12.         for( j = 0 ; j < 8 ; j++ )  
  13.         {  
  14.             if( buf & mask )  
  15.             {  
  16.                 PutPixel(x+j,y+i,c);  
  17.             }  
  18.             else  
  19.             {  
  20.                 if( !st )  
  21.                 {  
  22.                     PutPixel(x+j,y+i,bk_c);  
  23.                 }  
  24.             }  
  25.             mask = mask >> 1;  
  26.         }  
  27.     }  
  28. }  
  29.   
  30. /************************************************************** 
  31. 在LCD屏幕上指定坐标点写汉字 
  32. **************************************************************/  
  33. void Lcd_PutHZ(unsigned int x,unsigned int y,unsigned short int QW,unsigned int c,unsigned int bk_c,unsigned int st)  
  34. {  
  35.    unsigned short int i,j;  
  36.    unsigned char *pZK,mask,buf;  
  37.   
  38.    pZK = &__CHS[ (  ( (QW >> 8) - 1 )*94 + (QW & 0x00FF)- 1 )*32 ];  
  39.    for( i = 0 ; i < 16 ; i++ )  
  40.    {  
  41.       //左  
  42.       mask = 0x80;  
  43.       buf = pZK[i*2];  
  44.       for( j = 0 ; j < 8 ; j++ )  
  45.       {  
  46.          if( buf & mask )  
  47.          {  
  48.             PutPixel(x+j,y+i,c);  
  49.          }  
  50.          else  
  51.          {  
  52.             if( st )//去掉叹号  
  53.             {  
  54.                    PutPixel(x+j,y+i,bk_c);  
  55.             }  
  56.          }  
  57.          mask = mask >> 1;  
  58.       }   
  59.   
  60.       //右  
  61.       mask = 0x80;  
  62.       buf = pZK[i*2 + 1];  
  63.       for( j = 0 ; j < 8 ; j++ )  
  64.       {  
  65.          if( buf & mask )  
  66.          {  
  67.              PutPixel(x+j + 8,y+i,c);  
  68.          }  
  69.          else  
  70.          {  
  71.             if( st )//去掉叹号  
  72.             {  
  73.                    PutPixel(x+j + 8,y+i,bk_c);  
  74.             }  
  75.          }  
  76.          mask = mask >> 1;  
  77.       }                   
  78.    }  
  79. }  
  80.   
  81. //打印一串汉字  
  82. void Lcd_printf(unsigned int x,unsigned int y,unsigned int c,unsigned int bk_c,unsigned int st,char *fmt,...)  
  83. {  
  84.    char __LCD_Printf_Buf[256];  
  85.    va_list ap;  
  86.    unsigned char *pStr = (unsigned char *)__LCD_Printf_Buf;  
  87.    unsigned int i = 0;  
  88.   
  89.    va_start(ap,fmt);  
  90.    vsprintf(__LCD_Printf_Buf,fmt,ap);  
  91.    va_end(ap);  
  92.    
  93.    while(*pStr != 0 )  
  94.    {  
  95.       switch(*pStr)  
  96.       {  
  97.          case '\n' :  
  98.                 {  
  99.   
  100.                     break;  
  101.                 }  
  102.   
  103.          default:  
  104.                 {  
  105.                    if( *pStr > 0xA0 & *(pStr+1) > 0xA0 )  //中文输出  
  106.                    {  
  107.                           Lcd_PutHZ( x , y , (*pStr - 0xA0)*0x0100 + *(pStr+1) - 0xA0 , c , bk_c , st);  
  108.   
  109.                           pStr++;  
  110.                           i++;  
  111.   
  112.                           x += 16;  
  113.                    }  
  114.                    else               //英文输出  
  115.                    {  
  116.                           Lcd_PutASCII( x , y , *pStr , c , bk_c , st );  
  117.   
  118.                           x += 8;  
  119.   
  120.                    }  
  121.   
  122.                    break;  
  123.                 }  
  124.       }  
  125.   
  126.       pStr++;  
  127.       i++;        
  128.   
  129.       if( i > 256 ) break;  
  130.    }  
  131.   
  132. }  
  133. //void Lcd_TFT_Test( void )   
阅读(536) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~