| 【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****/
 
   
   
   
   
   
   
   
   
   
   
   
   
 bsp_lcd.c文件部分代码内容
 
 复制代码/**
  * 函数功能: 从SD卡读取GBK码
  * 输入参数: pBuffer:数据保存地址
  *           gbk :汉字字符低字节码
  *           font:字体选择
  *           可选值:USB_FONT_16 :16号字体
  *                   USB_FONT_24 :24号字体 
  * 返 回 值: uint8_t: 0:读取失败,1:读取成功
  * 说    明:使用该函数之前确保已运行了f_mount(&fs,"0:",1);程序。
  */
static uint8_t GetGBKCode_SD(unsigned char* pBuffer,const uint8_t *pstr,USB_FONT_Typdef font)
{
  uint32_t pos;
  uint8_t high8bit,low8bit;
  FRESULT f_res;
  UINT f_num;
  
  high8bit=*pstr;
  low8bit=*(pstr+1);
  if(font==USB_FONT_16)
  {
    // 16*16大小的汉字 其字模 占用16*16/8个字节
    pos=((high8bit-0xa1)*94+low8bit-0xa1)*16*16/8;
    f_res=f_open(&file,"0:/GBK_HZ1616.FON",FA_OPEN_EXISTING|FA_READ);
  }
  else
  {
    // 24*24大小的汉字 其字模 占用24*24/8个字节
    pos=((high8bit-0xa1)*94+low8bit-0xa1)*24*24/8; 
    f_res=f_open(&file,"0:/GBK_HZ2424.FON",FA_OPEN_EXISTING|FA_READ);
  } 
  if(f_res == FR_OK ) 
  {
    f_lseek (&file, pos);                //指针偏移
    if(font==USB_FONT_16)
    {
      f_res=f_read(&file,pBuffer,32,&f_num); 
    }
    else
    {
      f_res=f_read(&file,pBuffer,72,&f_num);
    }
    f_close(&file);      
    return 1;  
  }    
  else
    return 0;    
}
/**
  * 函数功能: 在 LCD 显示器上显示一个中文
  * 输入参数: usX:在特定扫描方向下字符的起始X坐标
  *           usY :在特定扫描方向下该点的起始Y坐标
  *           pstr: 汉字字符低字节码
  *           usColor_Background :选择英文字符的背景色
  *           usColor_Foreground :选择英文字符的前景色
  *           font:字体选择
  *           可选值:USB_FONT_16 :16号字体
  *                   USB_FONT_24 :24号字体 
  * 返 回 值: 无
  * 说    明:无
  */
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)
{
        uint8_t ucTemp, ucPage, ucColumn;
  uint8_t gbk_buffer[72];
  
  /* 检查输入参数是否合法 */
  assert_param(IS_FONT(font));
  
        if(font==USB_FONT_16)
  {
    LCD_OpenWindow(usX,usY,16,16);
    LCD_WRITE_CMD(0x2C);
    GetGBKCode_SD(gbk_buffer,pstr,USB_FONT_16);
    
    for(ucPage=0;ucPage<32;ucPage++)
    {
      ucTemp=gbk_buffer[ucPage];                
      for(ucColumn=0;ucColumn<8;ucColumn++)
      {
        if(ucTemp&0x01)
          LCD_WRITE_DATA(usColor_Foreground);                        
        else
          LCD_WRITE_DATA(usColor_Background);                                                                
        ucTemp >>= 1;                                        
      }
    }    
  }
  else
  {
    LCD_OpenWindow(usX,usY,24,24);
    LCD_WRITE_CMD(0x2C);
    GetGBKCode_SD(gbk_buffer,pstr,USB_FONT_24);
    
    for(ucPage=0;ucPage<72;ucPage++)
    {
      ucTemp=gbk_buffer[ucPage];                
      for(ucColumn=0;ucColumn<8;ucColumn++)
      {
        if(ucTemp&0x01)
          LCD_WRITE_DATA(usColor_Foreground);                        
        else
          LCD_WRITE_DATA(usColor_Background);                                                                
        ucTemp >>= 1;                                        
      }
    } 
  }        
}
/**
  * 函数功能: 在 LCD 显示器上显示一串中文
  * 输入参数: usX:在特定扫描方向下字符的起始X坐标
  *           usY :在特定扫描方向下该点的起始Y坐标
  *           pstr: 汉字字符低字节码
  *           usColor_Background :选择英文字符的背景色
  *           usColor_Foreground :选择英文字符的前景色
  *           font:字体选择
  *           可选值:USB_FONT_16 :16号字体
  *                   USB_FONT_24 :24号字体 
  * 返 回 值: 无
  * 说    明:无
  */
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)
{
  /* 检查输入参数是否合法 */
  assert_param(IS_FONT(font));
  
  while(*pstr != '\0')
        {
    if(font==USB_FONT_16)
    {
      if((usX+16)>LCD_DEFAULT_WIDTH)
      {
        usX = 0;
        usY += 16;
      }      
      if((usY+16)>LCD_DEFAULT_HEIGTH)
      {
        usX=0;
        usY=0;
      }      
      LCD_DispCHAR_CH(usX,usY,pstr,usColor_Background,usColor_Foreground,USB_FONT_16);
      pstr+=2;      
      usX+=16;
    }
    else
    {
      if((usX+24)>LCD_DEFAULT_WIDTH)
      {
        usX = 0;
        usY += 24;
      }      
      if((usY+24)>LCD_DEFAULT_HEIGTH)
      {
        usX=0;
        usY=0;
      }      
      LCD_DispCHAR_CH(usX,usY,pstr,usColor_Background,usColor_Foreground,USB_FONT_24);
      pstr+=2;      
      usX+=24;
    }
        }  
}
/**
  * 函数功能: 在 LCD 显示器上显示一串中英文
  * 输入参数: usX:在特定扫描方向下字符的起始X坐标
  *           usY :在特定扫描方向下该点的起始Y坐标
  *           pstr: 汉字字符低字节码
  *           usColor_Background :选择英文字符的背景色
  *           usColor_Foreground :选择英文字符的前景色
  *           font:字体选择
  *           可选值:USB_FONT_16 :16号字体
  *                   USB_FONT_24 :24号字体 
  * 返 回 值: 无
  * 说    明:无
  */
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)
{
  /* 检查输入参数是否合法 */
  assert_param(IS_FONT(font));
  
  while(*pstr != '\0')
        {
    if(*pstr<=0x7f)
    {
      if(font==USB_FONT_16)
      {
        if((usX+8)>LCD_DEFAULT_WIDTH)
        {
          usX = 0;
          usY += 16;
        }      
        if((usY+16)>LCD_DEFAULT_HEIGTH)
        {
          usX=0;
          usY=0;
        }      
        LCD_DispChar_EN(usX,usY,*pstr,usColor_Background,usColor_Foreground,USB_FONT_16);
        pstr++;      
        usX+=8;
      }
      else
      {
        if((usX+12)>LCD_DEFAULT_WIDTH)
        {
          usX=0;
          usY+=24;
        }      
        if((usY+24)>LCD_DEFAULT_HEIGTH)
        {
          usX=0;
          usY=0;
        }      
        LCD_DispChar_EN(usX,usY,*pstr,usColor_Background,usColor_Foreground,USB_FONT_24);
        pstr++;      
        usX+=12;
      }
    }
    else
    {
      if(font==USB_FONT_16)
      {
        if((usX+16)>LCD_DEFAULT_WIDTH)
        {
          usX = 0;
          usY += 16;
        }      
        if((usY+16)>LCD_DEFAULT_HEIGTH)
        {
          usX=0;
          usY=0;
        }      
        LCD_DispCHAR_CH(usX,usY,pstr,usColor_Background,usColor_Foreground,USB_FONT_16);
        pstr+=2;      
        usX+=16;
      }
      else
      {
        if((usX+24)>LCD_DEFAULT_WIDTH)
        {
          usX = 0;
          usY += 24;
        }      
        if((usY+24)>LCD_DEFAULT_HEIGTH)
        {
          usX=0;
          usY=0;
        }      
        LCD_DispCHAR_CH(usX,usY,pstr,usColor_Background,usColor_Foreground,USB_FONT_24);
        pstr+=2;      
        usX+=24;
      }
    }
        }  
}
/******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/
   
 
 |