你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【HAL库每天一例】第051例:LCD-显示汉字(字库在SD卡)

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

(硬石YS-F1Pro开发板HAL库例程持续更新\1. 软件设计之基本裸机例程(HAL库版本)\YSF1_HAL-051. LCD-显示汉字(字库在SD卡)

/**
  ******************************************************************************
  *                           硬石YS-F1Pro开发板例程功能说明
  *
  *  例程名称: YSF1_HAL-051. LCD-显示汉字(字库在SD卡)
  *   
  ******************************************************************************
  * 说明:
  * 本例程配套硬石stm32开发板YS-F1Pro使用。
  *
  * 淘宝:
  * 论坛:www ing10bbs com
  * 版权归硬石嵌入式开发团队所有,请勿商用。
  ******************************************************************************
  */

【1】例程简介
  FSMC:可变静态存储控制器,是STM32系列采用的一种新型的存储器扩展技术。一般可以用FSMC
接口与液晶驱动IC连接,实现数据交换。YS-F1Pro预留16bit的FSMC液晶接口,我们同时提供了
3.5寸TFT液晶模组供选购,该模组的液晶驱动IC型号为ILI9488。
  本例程实现液晶模组显示汉字和汉字串,提供16号和24号两种字体选择。
  
【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****/
CubeMX_1.jpg
CubeMX_2.jpg
CubeMX_3.jpg
CubeMX_4.jpg
CubeMX_5.jpg
CubeMX_6.jpg
CubeMX_7.jpg
CubeMX_8.jpg
CubeMX_9.jpg
CubeMX_10.jpg
CubeMX_11.jpg
CubeMX_12.jpg

bsp_lcd.c文件部分代码内容
  1. /**
  2.   * 函数功能: 从SD卡读取GBK码
  3.   * 输入参数: pBuffer:数据保存地址
  4.   *           gbk :汉字字符低字节码
  5.   *           font:字体选择
  6.   *           可选值:USB_FONT_16 :16号字体
  7.   *                   USB_FONT_24 :24号字体
  8.   * 返 回 值: uint8_t: 0:读取失败,1:读取成功
  9.   * 说    明:使用该函数之前确保已运行了f_mount(&fs,"0:",1);程序。
  10.   */
  11. static uint8_t GetGBKCode_SD(unsigned char* pBuffer,const uint8_t *pstr,USB_FONT_Typdef font)
  12. {
  13.   uint32_t pos;
  14.   uint8_t high8bit,low8bit;
  15.   FRESULT f_res;
  16.   UINT f_num;
  17.   
  18.   high8bit=*pstr;
  19.   low8bit=*(pstr+1);
  20.   if(font==USB_FONT_16)
  21.   {
  22.     // 16*16大小的汉字 其字模 占用16*16/8个字节
  23.     pos=((high8bit-0xa1)*94+low8bit-0xa1)*16*16/8;
  24.     f_res=f_open(&file,"0:/GBK_HZ1616.FON",FA_OPEN_EXISTING|FA_READ);
  25.   }
  26.   else
  27.   {
  28.     // 24*24大小的汉字 其字模 占用24*24/8个字节
  29.     pos=((high8bit-0xa1)*94+low8bit-0xa1)*24*24/8;
  30.     f_res=f_open(&file,"0:/GBK_HZ2424.FON",FA_OPEN_EXISTING|FA_READ);
  31.   }
  32.   if(f_res == FR_OK )
  33.   {
  34.     f_lseek (&file, pos);                //指针偏移
  35.     if(font==USB_FONT_16)
  36.     {
  37.       f_res=f_read(&file,pBuffer,32,&f_num);
  38.     }
  39.     else
  40.     {
  41.       f_res=f_read(&file,pBuffer,72,&f_num);
  42.     }
  43.     f_close(&file);      
  44.     return 1;  
  45.   }   
  46.   else
  47.     return 0;   
  48. }

  49. /**
  50.   * 函数功能: 在 LCD 显示器上显示一个中文
  51.   * 输入参数: usX:在特定扫描方向下字符的起始X坐标
  52.   *           usY :在特定扫描方向下该点的起始Y坐标
  53.   *           pstr: 汉字字符低字节码
  54.   *           usColor_Background :选择英文字符的背景色
  55.   *           usColor_Foreground :选择英文字符的前景色
  56.   *           font:字体选择
  57.   *           可选值:USB_FONT_16 :16号字体
  58.   *                   USB_FONT_24 :24号字体
  59.   * 返 回 值: 无
  60.   * 说    明:无
  61.   */
  62. 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)
  63. {
  64.         uint8_t ucTemp, ucPage, ucColumn;
  65.   uint8_t gbk_buffer[72];
  66.   
  67.   /* 检查输入参数是否合法 */
  68.   assert_param(IS_FONT(font));
  69.   
  70.         if(font==USB_FONT_16)
  71.   {
  72.     LCD_OpenWindow(usX,usY,16,16);
  73.     LCD_WRITE_CMD(0x2C);
  74.     GetGBKCode_SD(gbk_buffer,pstr,USB_FONT_16);
  75.    
  76.     for(ucPage=0;ucPage<32;ucPage++)
  77.     {
  78.       ucTemp=gbk_buffer[ucPage];               
  79.       for(ucColumn=0;ucColumn<8;ucColumn++)
  80.       {
  81.         if(ucTemp&0x01)
  82.           LCD_WRITE_DATA(usColor_Foreground);                       
  83.         else
  84.           LCD_WRITE_DATA(usColor_Background);                                                               
  85.         ucTemp >>= 1;                                       
  86.       }
  87.     }   
  88.   }
  89.   else
  90.   {
  91.     LCD_OpenWindow(usX,usY,24,24);
  92.     LCD_WRITE_CMD(0x2C);
  93.     GetGBKCode_SD(gbk_buffer,pstr,USB_FONT_24);
  94.    
  95.     for(ucPage=0;ucPage<72;ucPage++)
  96.     {
  97.       ucTemp=gbk_buffer[ucPage];               
  98.       for(ucColumn=0;ucColumn<8;ucColumn++)
  99.       {
  100.         if(ucTemp&0x01)
  101.           LCD_WRITE_DATA(usColor_Foreground);                       
  102.         else
  103.           LCD_WRITE_DATA(usColor_Background);                                                               
  104.         ucTemp >>= 1;                                       
  105.       }
  106.     }
  107.   }       
  108. }

  109. /**
  110.   * 函数功能: 在 LCD 显示器上显示一串中文
  111.   * 输入参数: usX:在特定扫描方向下字符的起始X坐标
  112.   *           usY :在特定扫描方向下该点的起始Y坐标
  113.   *           pstr: 汉字字符低字节码
  114.   *           usColor_Background :选择英文字符的背景色
  115.   *           usColor_Foreground :选择英文字符的前景色
  116.   *           font:字体选择
  117.   *           可选值:USB_FONT_16 :16号字体
  118.   *                   USB_FONT_24 :24号字体
  119.   * 返 回 值: 无
  120.   * 说    明:无
  121.   */
  122. 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)
  123. {
  124.   /* 检查输入参数是否合法 */
  125.   assert_param(IS_FONT(font));
  126.   
  127.   while(*pstr != '\0')
  128.         {
  129.     if(font==USB_FONT_16)
  130.     {
  131.       if((usX+16)>LCD_DEFAULT_WIDTH)
  132.       {
  133.         usX = 0;
  134.         usY += 16;
  135.       }      
  136.       if((usY+16)>LCD_DEFAULT_HEIGTH)
  137.       {
  138.         usX=0;
  139.         usY=0;
  140.       }      
  141.       LCD_DispCHAR_CH(usX,usY,pstr,usColor_Background,usColor_Foreground,USB_FONT_16);
  142.       pstr+=2;      
  143.       usX+=16;
  144.     }
  145.     else
  146.     {
  147.       if((usX+24)>LCD_DEFAULT_WIDTH)
  148.       {
  149.         usX = 0;
  150.         usY += 24;
  151.       }      
  152.       if((usY+24)>LCD_DEFAULT_HEIGTH)
  153.       {
  154.         usX=0;
  155.         usY=0;
  156.       }      
  157.       LCD_DispCHAR_CH(usX,usY,pstr,usColor_Background,usColor_Foreground,USB_FONT_24);
  158.       pstr+=2;      
  159.       usX+=24;
  160.     }
  161.         }  
  162. }

  163. /**
  164.   * 函数功能: 在 LCD 显示器上显示一串中英文
  165.   * 输入参数: usX:在特定扫描方向下字符的起始X坐标
  166.   *           usY :在特定扫描方向下该点的起始Y坐标
  167.   *           pstr: 汉字字符低字节码
  168.   *           usColor_Background :选择英文字符的背景色
  169.   *           usColor_Foreground :选择英文字符的前景色
  170.   *           font:字体选择
  171.   *           可选值:USB_FONT_16 :16号字体
  172.   *                   USB_FONT_24 :24号字体
  173.   * 返 回 值: 无
  174.   * 说    明:无
  175.   */
  176. 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)
  177. {
  178.   /* 检查输入参数是否合法 */
  179.   assert_param(IS_FONT(font));
  180.   
  181.   while(*pstr != '\0')
  182.         {
  183.     if(*pstr<=0x7f)
  184.     {
  185.       if(font==USB_FONT_16)
  186.       {
  187.         if((usX+8)>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_EN(usX,usY,*pstr,usColor_Background,usColor_Foreground,USB_FONT_16);
  198.         pstr++;      
  199.         usX+=8;
  200.       }
  201.       else
  202.       {
  203.         if((usX+12)>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_EN(usX,usY,*pstr,usColor_Background,usColor_Foreground,USB_FONT_24);
  214.         pstr++;      
  215.         usX+=12;
  216.       }
  217.     }
  218.     else
  219.     {
  220.       if(font==USB_FONT_16)
  221.       {
  222.         if((usX+16)>LCD_DEFAULT_WIDTH)
  223.         {
  224.           usX = 0;
  225.           usY += 16;
  226.         }      
  227.         if((usY+16)>LCD_DEFAULT_HEIGTH)
  228.         {
  229.           usX=0;
  230.           usY=0;
  231.         }      
  232.         LCD_DispCHAR_CH(usX,usY,pstr,usColor_Background,usColor_Foreground,USB_FONT_16);
  233.         pstr+=2;      
  234.         usX+=16;
  235.       }
  236.       else
  237.       {
  238.         if((usX+24)>LCD_DEFAULT_WIDTH)
  239.         {
  240.           usX = 0;
  241.           usY += 24;
  242.         }      
  243.         if((usY+24)>LCD_DEFAULT_HEIGTH)
  244.         {
  245.           usX=0;
  246.           usY=0;
  247.         }      
  248.         LCD_DispCHAR_CH(usX,usY,pstr,usColor_Background,usColor_Foreground,USB_FONT_24);
  249.         pstr+=2;      
  250.         usX+=24;
  251.       }
  252.     }
  253.         }  
  254. }
  255. /******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/
复制代码

液晶界面显示效果截图.jpg

收藏 评论6 发布时间:2016-6-25 08:57

举报

6个回答
stary666 回答时间:2016-6-27 09:40:35
lzts 回答时间:2016-6-27 09:48:37
谢谢分享
lufengwei2010 回答时间:2016-6-28 17:48:28
相对不错啊
yanhaijian 回答时间:2016-6-29 10:01:23
学习学习,STM32CubeMX会省不少事。
Ian-392967 回答时间:2016-7-1 22:23:44
谢谢分享
Ian-392967 回答时间:2016-7-1 22:24:31
多谢分享

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版