微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 第053例:LCD-显示汉字(字库在串行Flash)

第053例:LCD-显示汉字(字库在串行Flash)

时间:10-02 整理:3721RD 点击:
【HAL库每天一例】系列例程从今天开始持续更新。
我们将坚持每天至少发布一个基于YS-F1Pro开发板的HAL库例程,
该系列例程将带领大家从零开始使用HAL库,后面会持续添加模块应用例程。
同样的,我们还程序发布基于HAL库的指导文档和视频教程,欢迎持续关注,并提出改进意见。
例程下载:
资料包括程序、相关说明资料以及软件使用截图
链接:http://pan.baidu.com/s/1i574oPv
密码:r3s3

(硬石YS-F1Pro开发板HAL库例程持续更新\1. 软件设计之基本裸机例程(HAL库版本)\YSF1_HAL-053. LCD-显示汉字(字库在串行Flash))
/**
  ******************************************************************************
  *                           硬石YS-F1Pro开发板例程功能说明
  *
  *  例程名称: YSF1_HAL-053. LCD-显示汉字(字库在串行Flash)
  *   
  ******************************************************************************
  * 说明:
  * 本例程配套硬石stm32开发板YS-F1Pro使用。
  *
  * 淘宝:
  * 论坛:http://www.ing10bbs.com
  * 版权归硬石嵌入式开发团队所有,请勿商用。
  ******************************************************************************
  */
【1】例程简介
  FSMC:可变静态存储控制器,是STM32系列采用的一种新型的存储器扩展技术。一般可以用FSMC
接口与液晶驱动IC连接,实现数据交换。YS-F1Pro预留16bit的FSMC液晶接口,我们同时提供了
3.5寸TFT液晶模组供选购,该模组的液晶驱动IC型号为ILI9488。
  本例程实现液晶模组显示汉字和汉字串,提供16号和24号两种字体选择。汉字字库来源于串行
Flash,使用本例程之前需要先执行“YSF1-051. 烧写中文字库到串行Flash”例程。
  
【2】跳线帽情况
******* 为保证例程正常运行,必须插入以下跳线帽 **********
丝印编号     IO端口      目标功能引脚        出厂默认设置
  JP1        PA10        TXD(CH340G)          已接入
  JP2        PA9         RXD(CH340G)          已接入
  
【3】操作及现象
把3.5寸TFT液晶模组插入开发板中间液晶接口上,使用开发板配套的MINI USB线连接到开发板标
示“调试串口”字样的MIMI USB接口(需要安装驱动),在电脑端打开串口调试助手工具,设置参
数为115200 8-N-1。下载完程序之后,在串口调试助手窗口可接收到液晶模组ID信息,同时液晶屏
幕亮起来,背景为黑色,显示一些中文字符。
/******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/
中文显示函数实现

  1. #if USB_SPIFLASH_CH==1
  2. /**
  3.   * 函数功能: 从串行Flash读取GBK码
  4.   * 输入参数: pBuffer:数据保存地址
  5.   *           gbk :汉字字符低字节码
  6.   *           font:字体选择
  7.   *           可选值:FONT_16 :16号字体
  8.   *                   FONT_24 :24号字体
  9.   * 返 回 值: uint8_t: 0:读取失败,1:读取成功
  10.   * 说    明:无
  11.   */
  12. static uint8_t GetGBKCode_SPIFLASH(unsigned char* pBuffer,const uint8_t *pstr,USB_FONT_Typdef font)
  13. {
  14.   uint32_t pos;
  15.   uint8_t high8bit,low8bit;
  16.   static uint8_t startflag=1;
  17.   
  18.   /* 检查输入参数是否合法 */
  19.   assert_param(IS_FONT(font));
  20.   
  21.   if(startflag)
  22.   {
  23.     MX_SPIFlash_Init();
  24.     startflag=0;
  25.   }
  26.   
  27.   high8bit=*pstr;
  28.   low8bit=*(pstr+1);
  29.   if(font==USB_FONT_16)
  30.   {
  31.     // 16*16大小的汉字 其字模 占用16*16/8个字节
  32.     pos=((high8bit-0xa1)*94+low8bit-0xa1)*16*16/8;
  33.     SPI_FLASH_BufferRead(pBuffer,GBK_HZ1616_ADDR+pos,32);
  34.   }
  35.   else
  36.   {
  37.     // 24*24大小的汉字 其字模 占用24*24/8个字节
  38.     pos=((high8bit-0xa1)*94+low8bit-0xa1)*24*24/8;
  39.     SPI_FLASH_BufferRead(pBuffer,GBK_HZ2424_ADDR+pos,72);
  40.   }
  41.   if((pBuffer[0]==0xFF)&&(pBuffer[1]==0xFF))
  42.   {
  43.     return 0;
  44.   }  
  45.   return 1;  
  46. }

  47. #else

  48. /**
  49.   * 函数功能: 从SD卡读取GBK码
  50.   * 输入参数: pBuffer:数据保存地址
  51.   *           gbk :汉字字符低字节码
  52.   *           font:字体选择
  53.   *           可选值:USB_FONT_16 :16号字体
  54.   *                   USB_FONT_24 :24号字体
  55.   * 返 回 值: uint8_t: 0:读取失败,1:读取成功
  56.   * 说    明:使用该函数之前确保已运行了f_mount(&fs,"0:",1);程序。
  57.   */
  58. static uint8_t GetGBKCode_SD(unsigned char* pBuffer,const uint8_t *pstr,USB_FONT_Typdef font)
  59. {
  60.   uint32_t pos;
  61.   uint8_t high8bit,low8bit;
  62.   FRESULT f_res;
  63.   UINT f_num;
  64.   
  65.   high8bit=*pstr;
  66.   low8bit=*(pstr+1);
  67.   if(font==USB_FONT_16)
  68.   {
  69.     // 16*16大小的汉字 其字模 占用16*16/8个字节
  70.     pos=((high8bit-0xa1)*94+low8bit-0xa1)*16*16/8;
  71.     f_res=f_open(&file_ch,"0:/GBK_HZ1616.FON",FA_OPEN_EXISTING|FA_READ);
  72.   }
  73.   else
  74.   {
  75.     // 24*24大小的汉字 其字模 占用24*24/8个字节
  76.     pos=((high8bit-0xa1)*94+low8bit-0xa1)*24*24/8;
  77.     f_res=f_open(&file_ch,"0:/GBK_HZ2424.FON",FA_OPEN_EXISTING|FA_READ);
  78.   }
  79.   if(f_res == FR_OK )
  80.   {
  81.     f_lseek (&file_ch, pos);                //指针偏移
  82.     if(font==USB_FONT_16)
  83.     {
  84.       f_res=f_read(&file_ch,pBuffer,32,&f_num);
  85.     }
  86.     else
  87.     {
  88.       f_res=f_read(&file_ch,pBuffer,72,&f_num);
  89.     }
  90.     f_close(&file_ch);      
  91.     return 1;  
  92.   }   
  93.   else
  94.     return 0;   
  95. }
  96. #endif

  97. /**
  98.   * 函数功能: 在 LCD 显示器上显示一个中文
  99.   * 输入参数: usX:在特定扫描方向下字符的起始X坐标
  100.   *           usY :在特定扫描方向下该点的起始Y坐标
  101.   *           pstr: 汉字字符低字节码
  102.   *           usColor_Background :选择英文字符的背景色
  103.   *           usColor_Foreground :选择英文字符的前景色
  104.   *           font:字体选择
  105.   *           可选值:USB_FONT_16 :16号字体
  106.   *                   USB_FONT_24 :24号字体
  107.   * 返 回 值: 无
  108.   * 说    明:无
  109.   */
  110. void LCD_DispCHAR_CH(uint16_t usX,uint16_t usY,const uint8_t *pstr,uint16_t usColor_Background, uint16_t usColor_Foreground,USB_FONT_Typdef font)
  111. {
  112.         uint8_t ucTemp, ucPage, ucColumn;
  113.   uint8_t gbk_buffer[72];
  114.   
  115.   /* 检查输入参数是否合法 */
  116.   assert_param(IS_FONT(font));
  117.   
  118.         if(font==USB_FONT_16)
  119.   {
  120.     LCD_OpenWindow(usX,usY,16,16);
  121.     LCD_WRITE_CMD(0x2C);
  122. #if USB_SPIFLASH_CH==1
  123.     GetGBKCode_SPIFLASH(gbk_buffer,pstr,USB_FONT_16);
  124. #else
  125.     GetGBKCode_SD(gbk_buffer,pstr,USB_FONT_16);
  126. #endif
  127.    
  128.     for(ucPage=0;ucPage<32;ucPage++)
  129.     {
  130.       ucTemp=gbk_buffer[ucPage];               
  131.       for(ucColumn=0;ucColumn<8;ucColumn++)
  132.       {
  133.         if(ucTemp&0x01)
  134.           LCD_WRITE_DATA(usColor_Foreground);                       
  135.         else
  136.           LCD_WRITE_DATA(usColor_Background);                                                               
  137.         ucTemp >>= 1;                                       
  138.       }
  139.     }   
  140.   }
  141.   else
  142.   {
  143.     LCD_OpenWindow(usX,usY,24,24);
  144.     LCD_WRITE_CMD(0x2C);
  145. #if USB_SPIFLASH_CH==1
  146.     GetGBKCode_SPIFLASH(gbk_buffer,pstr,USB_FONT_24);
  147. #else
  148.     GetGBKCode_SD(gbk_buffer,pstr,USB_FONT_24);
  149. #endif   
  150.    
  151.     for(ucPage=0;ucPage<72;ucPage++)
  152.     {
  153.       ucTemp=gbk_buffer[ucPage];               
  154.       for(ucColumn=0;ucColumn<8;ucColumn++)
  155.       {
  156.         if(ucTemp&0x01)
  157.           LCD_WRITE_DATA(usColor_Foreground);                       
  158.         else
  159.           LCD_WRITE_DATA(usColor_Background);                                                               
  160.         ucTemp >>= 1;                                       
  161.       }
  162.     }
  163.   }       
  164. }

  165. /**
  166.   * 函数功能: 在 LCD 显示器上显示一串中文
  167.   * 输入参数: usX:在特定扫描方向下字符的起始X坐标
  168.   *           usY :在特定扫描方向下该点的起始Y坐标
  169.   *           pstr: 汉字字符低字节码
  170.   *           usColor_Background :选择英文字符的背景色
  171.   *           usColor_Foreground :选择英文字符的前景色
  172.   *           font:字体选择
  173.   *           可选值:USB_FONT_16 :16号字体
  174.   *                   USB_FONT_24 :24号字体
  175.   * 返 回 值: 无
  176.   * 说    明:无
  177.   */
  178. void LCD_DispString_CH(uint16_t usX,uint16_t usY,const uint8_t *pstr,uint16_t usColor_Background, uint16_t usColor_Foreground,USB_FONT_Typdef font)
  179. {
  180.   /* 检查输入参数是否合法 */
  181.   assert_param(IS_FONT(font));
  182.   
  183.   while(*pstr != '\0')
  184.         {
  185.     if(font==USB_FONT_16)
  186.     {
  187.       if((usX+16)>LCD_DEFAULT_WIDTH)
  188.       {
  189.         usX = 0;
  190.         usY += 16;
  191.       }      
  192.       if((usY+16)>LCD_DEFAULT_HEIGTH)
  193.       {
  194.         usX=0;
  195.         usY=0;
  196.       }      
  197.       LCD_DispCHAR_CH(usX,usY,pstr,usColor_Background,usColor_Foreground,USB_FONT_16);
  198.       pstr+=2;      
  199.       usX+=16;
  200.     }
  201.     else
  202.     {
  203.       if((usX+24)>LCD_DEFAULT_WIDTH)
  204.       {
  205.         usX = 0;
  206.         usY += 24;
  207.       }      
  208.       if((usY+24)>LCD_DEFAULT_HEIGTH)
  209.       {
  210.         usX=0;
  211.         usY=0;
  212.       }      
  213.       LCD_DispCHAR_CH(usX,usY,pstr,usColor_Background,usColor_Foreground,USB_FONT_24);
  214.       pstr+=2;      
  215.       usX+=24;
  216.     }
  217.         }  
  218. }

  219. /**
  220.   * 函数功能: 在 LCD 显示器上显示一串中英文
  221.   * 输入参数: usX:在特定扫描方向下字符的起始X坐标
  222.   *           usY :在特定扫描方向下该点的起始Y坐标
  223.   *           pstr: 汉字字符低字节码
  224.   *           usColor_Background :选择英文字符的背景色
  225.   *           usColor_Foreground :选择英文字符的前景色
  226.   *           font:字体选择
  227.   *           可选值:USB_FONT_16 :16号字体
  228.   *                   USB_FONT_24 :24号字体
  229.   * 返 回 值: 无
  230.   * 说    明:无
  231.   */
  232. void LCD_DispString_EN_CH(uint16_t usX,uint16_t usY,const uint8_t *pstr,uint16_t usColor_Background, uint16_t usColor_Foreground,USB_FONT_Typdef font)
  233. {
  234.   /* 检查输入参数是否合法 */
  235.   assert_param(IS_FONT(font));
  236.   
  237.   while(*pstr != '\0')
  238.         {
  239.     if(*pstr<=0x7f)
  240.     {
  241.       if(font==USB_FONT_16)
  242.       {
  243.         if((usX+8)>LCD_DEFAULT_WIDTH)
  244.         {
  245.           usX = 0;
  246.           usY += 16;
  247.         }      
  248.         if((usY+16)>LCD_DEFAULT_HEIGTH)
  249.         {
  250.           usX=0;
  251.           usY=0;
  252.         }      
  253.         LCD_DispChar_EN(usX,usY,*pstr,usColor_Background,usColor_Foreground,USB_FONT_16);
  254.         pstr++;      
  255.         usX+=8;
  256.       }
  257.       else
  258.       {
  259.         if((usX+12)>LCD_DEFAULT_WIDTH)
  260.         {
  261.           usX=0;
  262.           usY+=24;
  263.         }      
  264.         if((usY+24)>LCD_DEFAULT_HEIGTH)
  265.         {
  266.           usX=0;
  267.           usY=0;
  268.         }      
  269.         LCD_DispChar_EN(usX,usY,*pstr,usColor_Background,usColor_Foreground,USB_FONT_24);
  270.         pstr++;      
  271.         usX+=12;
  272.       }
  273.     }
  274.     else
  275.     {
  276.       if(font==USB_FONT_16)
  277.       {
  278.         if((usX+16)>LCD_DEFAULT_WIDTH)
  279.         {
  280.           usX = 0;
  281.           usY += 16;
  282.         }      
  283.         if((usY+16)>LCD_DEFAULT_HEIGTH)
  284.         {
  285.           usX=0;
  286.           usY=0;
  287.         }      
  288.         LCD_DispCHAR_CH(usX,usY,pstr,usColor_Background,usColor_Foreground,USB_FONT_16);
  289.         pstr+=2;      
  290.         usX+=16;
  291.       }
  292.       else
  293.       {
  294.         if((usX+24)>LCD_DEFAULT_WIDTH)
  295.         {
  296.           usX = 0;
  297.           usY += 24;
  298.         }      
  299.         if((usY+24)>LCD_DEFAULT_HEIGTH)
  300.         {
  301.           usX=0;
  302.           usY=0;
  303.         }      
  304.         LCD_DispCHAR_CH(usX,usY,pstr,usColor_Background,usColor_Foreground,USB_FONT_24);
  305.         pstr+=2;      
  306.         usX+=24;
  307.       }
  308.     }
  309.         }  
  310. }

复制代码





Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top