LCD 显示文字与图片

本文详细介绍了在LCD屏幕上显示汉字和ASCII字符的两种方法。第一种方法涉及GB2312编码,通过计算汉字的区位码来定位字模并逐点绘制。第二种方法使用预先生成的字符数组进行输出。文中还提供了相关的代码示例,包括LCD初始化、延时函数以及串口通信的设置。
摘要由CSDN通过智能技术生成


第一种方法:直接输汉字或字母等 直接输出

在GB2312编码中对所收汉字进行了“分区”处理,94个区,每区含有94个汉字/符号
 * 汉字由两个ASCII码组成,第一个减去160就是区码,第二个减去160就是位码
 * 在C中处理时,如"啊"的代码是B0A0 +1,定义*pStr = "啊",则*pStr = 176(B0),*(pStr+1) = 161(A0+1)
 * 第一个ASC 176 - 160(0xA0) = 16 ,第二个 ASC 161 - 160(0xA0) = 1,所以区位码为:1601
 * 按GB2312表顺序,从第一行开始向右每取8个点作为一个字节,如果最后不足8个点就补满8位。
 * 8位逐行取模,第一点为高位.16X16汉字一行就有两个字节 X 16行
 * 因字模数字式从0开始,所以 起始位为 ( ( (*pStr - 0xA0) - 1 ) * 94 + ( *(pStr+1) - 0xA0 ) - 1 ) * 32                  
 */
  /* 左侧字模起始地址 */
   pZKL = &__CHS[ ( ( (*pStr - 0xA0) - 1 ) * 94 + ( *(pStr+1) - 0xA0 ) - 1 ) * 32];
   /* 右侧字模起始地址 */ 
   pZKR = &__CHS[ ( ( ( (*pStr - 0xA0) - 1 ) * 94 + ( *(pStr+1) - 0xA0 ) - 1 ) * 32 ) + 1];

/*******************************************************************************
* 函数名称: Lcd_Print_ZW
* 功能描述: 在LCD屏幕上指定坐标点写汉字 NETC-陈建长.
* 输入参数: (unsigned int x,unsigned int y坐标),(unsigned char *pStr 单个汉字 如 “啊”),
             (unsigned int c,unsigned int bk_c颜色和区域颜色),unsigned int st  区域颜色选择
     st = 1 有 st = 0 无,在动态变化的情况下,如果没有区域颜色则前后信息叠加.   
* 输出参数: None        
* 返回参数: None
*******************************************************************************/

void Lcd_Print_ZW(unsigned int x,unsigned int y,unsigned char *pStr,unsigned int c,unsigned int bk_c,unsigned int st)
{
    unsigned short int i,j;     
    unsigned char *pZKL,*pZKR,mask,buf;   
    pZKL = &__CHS[ ( ( (*pStr - 0xA0) - 1 ) * 94 + ( *(pStr+1) - 0xA0 ) - 1 ) * 32];
    pZKR = &__CHS[ ( ( ( (*pStr - 0xA0) - 1 ) * 94 + ( *(pStr+1) - 0xA0 ) - 1 ) * 32 ) + 1];
    for( i = 0 ; i < 16 ; i++ )
       {
              /* 处理左侧显示 */
              mask = 0x80;
              buf = *pZKL;
     *(pZKL += 2);
              for( j = 0 ; j < 8 ; j++ )
              {
                     if( buf & mask )
                     {
                            PutPixel(x+j,y+i,c);
                     }
      else
      {
       if( st )
                  {
                      PutPixel(x+j,y+j,bk_c);
                  }
      }
                    
                     mask = mask >> 1;
              }     
             /* 处理右侧显示 */
              mask = 0x80;
              buf = *pZKR;
     *(pZKR += 2);
              for( j = 0 ; j < 8 ; j++ )
              {
                     if( buf & mask )
                     {
                            PutPixel(x+j + 8,y+i,c);
                     }
      else
      {
      if( st )
                     {
                         PutPixel(x+j + 8,y+i,bk_c);
                     }
     }
                     mask = mask >> 1;
              }                
       }

}


eg : 输出:“啊”

Lcd_Print_ZW(100, 100, "啊", 0x0, 0x0, 0);


第二种方法:用字符取模软件生成字符数组,读取输出

代码如下:

  1. *************************************************
  2. file name     LCD_hanzi
  3. function    显示16*16汉字 和 16*8 ASCII码字符
  4. 硬件设备    mini2440开发板
  5.         索尼X-35 3.5寸液晶屏
  6. lcd参数    宽和高 240x320
  7.         TFT 16bpp显示
  8. 完成时间    2011-08-10
  9. 作者        周茂夫
  10. problem    暂无
  11. 修改记录    暂无
  12. *************************************************/
  13. #define    GLOBAL_CLK        1

  14. #include <stdlib.h>
  15. #include <string.h>
  16. #include "def.h"
  17. #include "option.h"
  18. #include "2440addr.h"
  19. #include "2440lib.h"
  20. #include "2440slib.h"
  21. #include "mmu.h"
  22. #include "profile.h"
  23. #include "memtest.h"
  24. #include "zifu.h"

  25. #define baudrate 115200

  26. #define    LCD_WIDTH    240
  27. #define    LCD_HEIGHT    320
  28. //#define LCD_CLKCAL    17    //这个我计算出来是17参考程序给的是4 测试俩个都可以
  29.                             //影响不大 测试25 30 都还可以
  30. #define LCD_CLKCAL    17        

  31. #define    LCD_RIGHT_MARGIN 25
  32. #define    LCD_LEFT_MARGIN 0
  33. #define    LCD_HSYNC_LEN 4

  34. #define    LCD_UPPER_MARGIN 0
  35. #define    LCD_LOWER_MARGIN 4
  36. #define    LCD_VSYNC_LEN 9

  37. #define    LCD_XSIZE    LCD_WIDTH
  38. #define    LCD_YSIZE    LCD_HEIGHT
  39. #define    SCR_XSIZE    LCD_WIDTH
  40. #define    SCR_YSIZE    LCD_HEIGHT

  41. extern const unsigned char sunflower_240x320[];
  42. extern const unsigned char GB2312Dot16X16[];
  43. volatile static unsigned short LCD_BUFFER[SCR_YSIZE][SCR_XSIZE];//LCD BUFFER

  44. #define M5D(n)        ((n)&0x1fffff)//设置显示缓存区时取地址的低21位
  45. #define    LCD_ADDR    ((U32)(LCD_BUFFER))    

  46. /********横向取模,字节不倒序,C51格式*******/
  47. unsigned char zhou[]=
  48. {
  49. 0x00,0x00,0x1F,0xFC,0x10,0x84,0x13,0xE4,0x10,0x84,0x10,0x84,0x17,0xF4,0x10,0x04,
  50. 0x13,0xE4,0x12,0x24,0x12,0x24,0x13,0xE4,0x22,0x24,0x20,0x04,0x40,0x14,0x80,0x08,
  51. } ;

  52. unsigned char mao[]=
  53. {
  54. 0x04,0x40,0x04,0x40,0xFF,0xFE,0x04,0x40,0x00,0xA0,0x00,0x90,0x3F,0xFE,0x20,0x80,
  55. 0x20,0x84,0x20,0x48,0x20,0x50,0x20,0x60,0x20,0xA0,0x43,0x12,0x4C,0x0A,0x80,0x04,
  56. } ;

  57. unsigned char Y[]=
  58. {
  59. 0x00,0x00,0x00,0xEE,0x44,0x44,0x28,0x28,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00,
  60. } ;

  61. unsigned char zhao[]=
  62. {
  63. 0x00,0x00, 0xF7,0x7E, 0x95,0x04, 0x95,0x04,
  64. 0x96,0x74, 0x96,0x54, 0x95,0x54, 0x95,0x54,
  65. 0x95,0x54, 0xF5,0x54, 0x97,0x74, 0x04,0x04,
  66. 0x04,0x04, 0x04,0x04, 0x04,0x14, 0x04,0x08,
  67. } ;

  68. /**********************************
  69. void delay(int times)
  70. {
  71.     int i = 1000;
  72.     while(times--)
  73.     {
  74.         for(; i>0;--i)
  75.             ;
  76.     }
  77. }
  78. ************************************/
  79. /***********************************
  80. UART_int初始化led IO端口GPBCON5-8
  81. 初始化GPBHCON为串口通信
  82. 配置串口通信寄存器
  83. 配置中断寄存器
  84. ************************************/
  85. void UART_int_init(void)
  86. {
  87.     /********configuration LED IO port**********/
  88.     rGPBCON &=~(0xff<<10);
  89.     rGPBCON |= 0x55<<10;
  90.     
  91.     /*******configuration GPHCON to UART*******/
  92.     rGPHCON &=~(0xf<<4);
  93.     rGPHCON |= 0xa
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在正式版中,用户可生成自己需要的各种小字库,也可以生成自定义的国标一二级汉字库。 0.生成自定义的小字库: 0.使用PCTOLCD的各种调整功能调整出您需要的文字样式,如字体,字样(下划,倾斜,加 粗),大小(各种点阵大小的字体,可锁定点阵本身大小(如16*16),然后在这个固定的点阵大小 内调节文字的大小(例如在16*16的点阵中居中显示12*12大小的汉字) 1.将您需要的汉字和符号集中形成一个文本文件 2.使用“导入文本”的按钮 3.确认“生成二进制字库”被选中(建议选中"生成索引文件"原因后析) 4.点“开始生成”按钮,选择生成的字库文件名 5.然后耐心等待一段时间(与处理文本大小有关),在此期间建议不要动键盘和鼠标。 6.字库生成完毕. 1.生成国标一二级汉字库 0.使用PCTOLCD的各种调整功能调整出您需要的文字样式,如字体,字样(下划,倾斜,加 粗),大小(各种点阵大小的字体,可锁定点阵本身大小(如16*16),然后在这个固定的点阵大小 内调节文字的大小(例如在16*16的点阵中居中显示12*12大小的汉字). 1.使用“导入文本”的按钮 2.点右下角"生成国标汉字库"按钮. 3.选择字库文件名后单击确定 4.耐心等待一段时间后既得到生成的汉字库(时间视具体机器而定). 生成汉字库结构介绍 本软件使用的汉字库采用与HZK16相近似的结构,即按照输入汉字的顺序依次排列各汉字的 点阵数据,以生成的16*16点阵汉字库举例介绍 16*16点阵汉字库 点阵大小16*16,所以每个汉字点阵数据占用32个字节.用户要使用生成的16*16点阵小字库中 的点阵数据,可以在程序中采用如下算法: 0.在生成的字库汉字列表中得到该汉字的偏移量,也就是汉字的记录号HzNum 1.将其*32(HzNum*32)即可得出该汉字点阵在字库中的偏移地址. 3.以这个偏移地址为起点,连续读取文件中的32个字节,既为该汉字的点阵信息. 实际上,对于本软件生成的16*16点阵的国标汉字库是采用区位码排列的,所以与标准的HZK16 结构是一样的,完全可以互换使用. 例如生成一个24*48点阵,楷体,倾斜的汉字库, 0.由于每个汉字占用24*48/8= 144个字节,所以用户可先读取生成的索引列表找到该汉 字的记录号. 1.将记录号*144即得到该汉字在字库中的偏移地址. 2.以这个偏移地址为起点,在字库文件中连续读取144个字节,即为该汉字的点阵信息. 对于其他点阵汉字库的使用方法,可以依次类推……
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值