打印
[STM32F1]

【HAL库每天一例】第076例:LCD-显示中文(透明效果)

[复制链接]
1147|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
亼亽|  楼主 | 2016-7-28 08:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
【HAL库每天一例】系列例程从今天开始持续更新。。。。。
我们将**每天至少发布一个基于YS-F1Pro开发板的HAL库例程,
该系列例程将带领大家从零开始使用HAL库,后面会持续添加模块应用例程。
同样的,我们还程序发布基于HAL库的指导文档和视频教程,欢迎持续关注,并提出改进意见。

例程下载:
资料包括程序、相关说明资料以及软件使用截图
百度云链接:http://pan.baidu.com/s/1i574oPv
密码:r3s3

(硬石YS-F1Pro开发板HAL库例程持续更新\2. 软件设计之高级裸机例程(HAL库版本)\YSF1_HAL-110. LCD-显示中文(透明效果)

/**
  ******************************************************************************
  *                           硬石YS-F1Pro开发板例程功能说明
  *
  *  例程名称: YSF1_HAL-110. LCD-显示中文(透明效果)
  *   
  ******************************************************************************
  * 说明:
  * 本例程配套硬石stm32开发板YS-F1Pro使用。
  *
  * 淘宝:
  * 论坛:http://www.ing10bbs.com
  * 版权归硬石嵌入式开发团队所有,请勿商用。
  ******************************************************************************
  */

【1】例程简介
  FSMC:可变静态存储控制器,是STM32系列采用的一种新型的存储器扩展技术。一般可以用FSMC
接口与液晶驱动IC连接,实现数据交换。YS-F1Pro预留16bit的FSMC液晶接口,我们同时提供了
3.5寸TFT液晶模组供选购,该模组的液晶驱动IC型号为ILI9488。
  本例程实现液晶模组显示24bit的bmp格式图片。
  
【2】跳线帽情况
******* 为保证例程正常运行,必须插入以下跳线帽 **********
丝印编号     IO端口      目标功能引脚        出厂默认设置
  JP1        PA10        TXD(CH340G)          已接入
  JP2        PA9         RXD(CH340G)          已接入
  
【3】操作及现象
将例程目录下的图片文件拷贝到SD卡中,并把SD卡插入到开发板上,把3.5寸TFT液晶模组插入开发
板中间液晶接口上,使用开发板配套的MINI USB线连接到开发板标示“调试串口”字样的MIMI USB
接口(需要安装驱动),在电脑端打开串口调试助手工具,设置参数为115200 8-N-1。下载完程序
之后,在串口调试助手窗口可接收到液晶模组ID信息,同时液晶屏幕亮起来,显示图片和一些文字,
部分文字是通透效果的。

/******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/


bsp_lcd.c部分函数

/**
  * 函数功能: 在 LCD 显示器上显示一个英文字符
  * 输入参数: usX:在特定扫描方向下字符的起始X坐标
  *           usY :在特定扫描方向下该点的起始Y坐标
  *           cChar :要显示的英文字符
  *           usColor_Background :选择英文字符的背景色
  *           usColor_Foreground :选择英文字符的前景色
  *           font:字体选择
  *           可选值:FONT_16 :16号字体
  *                   FONT_24 :24号字体
  * 返 回 值: 无
  * 说    明:该函数必须与ascii.h内容对应使用
  */
void LCD_DispChar_EN_Transparent(uint16_t usX,uint16_t usY,const char cChar,
                                 uint16_t usColor_Background,uint16_t usColor_Foreground,
                                 uint8_t transparent,USB_FONT_Typdef font)
{
        uint8_t ucTemp, ucRelativePositon, ucPage, ucColumn;
  uint16_t i,j;
  
  /* 检查输入参数是否合法 */
  assert_param(IS_FONT(font));
  
        ucRelativePositon = cChar - ' ';
  
        if(font==USB_FONT_16)
  {
    for(j=0;j<16;++j)
    {
      for(i=0;i<8;++i)
      {
        LCD_SetCursor(usX+i,usY+j);        
        bk_color[8*j+i]=LCD_Read_PixelData();
      }
    }
    LCD_OpenWindow(usX,usY,8,16);
    LCD_WRITE_CMD(0x2C);
   
    for(i=0,ucPage=0;ucPage<16;ucPage++)
    {
      ucTemp=ucAscii_1608[ucRelativePositon][ucPage];               
      for(ucColumn=0;ucColumn<8;ucColumn++)
      {
        if(ucTemp&0x01)
          LCD_WRITE_DATA(usColor_Foreground);                       
        else if(transparent)
          LCD_WRITE_DATA(bk_color[i]);       
        else            
          LCD_WRITE_DATA(usColor_Background);                                       
        ++i;        
        ucTemp >>= 1;                                       
      }
    }   
  }
  else
  {
    for(j=0;j<24;++j)
    {
      for(i=0;i<12;++i)
      {
        LCD_SetCursor(usX+i,usY+j);        
        bk_color[12*j+i]=LCD_Read_PixelData();
      }
    }
    LCD_OpenWindow(usX,usY,12,24);
    LCD_WRITE_CMD(0x2C);
   
    for(i=0,ucPage=0;ucPage<48;ucPage++)
    {
      ucTemp=ucAscii_2412[ucRelativePositon][ucPage];               
      for(ucColumn=0;ucColumn<8;ucColumn++)
      {
        if(ucTemp&0x01)
          LCD_WRITE_DATA(usColor_Foreground);       
        else if(transparent)
          LCD_WRITE_DATA(bk_color[i]);                
        else
          LCD_WRITE_DATA(usColor_Background);               
        ++i;        
        ucTemp >>= 1;                                       
      }       
      ucPage++;
      ucTemp=ucAscii_2412[ucRelativePositon][ucPage];
      /* 只显示前面4个位,与前面8位总共12位 */
      for(ucColumn=0;ucColumn<4;ucColumn++)
      {
        if(ucTemp&0x01)
          LCD_WRITE_DATA(usColor_Foreground);               
        else if(transparent)
          LCD_WRITE_DATA(bk_color[i]);                
        else         
          LCD_WRITE_DATA(usColor_Background);       
        ++i;        
        ucTemp >>= 1;                                       
      }       
    }
  }       
}

/**
  * 函数功能: 在 LCD 显示器上显示英文字符串
  * 输入参数: usX:在特定扫描方向下字符的起始X坐标
  *           usY :在特定扫描方向下该点的起始Y坐标
  *           pStr :要显示的英文字符串的首地址
  *           usColor_Background :选择英文字符的背景色
  *           usColor_Foreground :选择英文字符的前景色
  *           font:字体选择
  *           可选值:FONT_16 :16号字体
  *                   FONT_24 :24号字体
  * 返 回 值: 无
  * 说    明:该函数必须与ascii.h内容对应使用
  */
void LCD_DispString_EN_Transparent(uint16_t usX,uint16_t usY,const char * pstr,
                                   uint16_t usColor_Background, uint16_t usColor_Foreground,
                                   uint8_t transparent,USB_FONT_Typdef font)
{
  /* 检查输入参数是否合法 */
  assert_param(IS_FONT(font));
  
        while(*pstr != '\0')
        {
    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_Transparent(usX,usY,*pstr,usColor_Background,usColor_Foreground,transparent,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_Transparent(usX,usY,*pstr,usColor_Background,usColor_Foreground,transparent,USB_FONT_24);
      pstr++;      
      usX+=12;
    }
        }
}

/**
  * 函数功能: 在 LCD 显示器上显示一个中文
  * 输入参数: usX:在特定扫描方向下字符的起始X坐标
  *           usY :在特定扫描方向下该点的起始Y坐标
  *           pstr: 汉字字符低字节码
  *           usColor_Background :选择英文字符的背景色
  *           usColor_Foreground :选择英文字符的前景色
  *           font:字体选择
  *           可选值:FONT_16 :16号字体
  *                   FONT_24 :24号字体
  * 返 回 值: 无
  * 说    明:无
  */
void LCD_Disp_CH_Transparent(uint16_t usX,uint16_t usY,const uint8_t *pstr,
                             uint16_t usColor_Background, uint16_t usColor_Foreground,
                             uint8_t transparent,USB_FONT_Typdef font)
{
        uint8_t ucTemp, ucPage, ucColumn;
  uint8_t gbk_buffer[72];
  uint16_t i,j;
  
  /* 检查输入参数是否合法 */
  assert_param(IS_FONT(font));
  
        if(font==USB_FONT_16)
  {
    for(j=0;j<16;++j)
    {
      for(i=0;i<16;++i)
      {
        LCD_SetCursor(usX+i,usY+j);        
        bk_color[16*j+i]=LCD_Read_PixelData();
      }
    }
   
    LCD_OpenWindow(usX,usY,16,16);
    LCD_WRITE_CMD(0x2C);
#if USB_SPIFLASH_CH==1
    GetGBKCode_SPIFLASH(gbk_buffer,pstr,USB_FONT_16);
#else
    GetGBKCode_SD(gbk_buffer,pstr,FONT_16);
#endif
    for(i=0,ucPage=0;ucPage<32;ucPage++)
    {
      ucTemp=gbk_buffer[ucPage];               
      for(ucColumn=0;ucColumn<8;ucColumn++)
      {
        if(ucTemp&0x01)
          LCD_WRITE_DATA(usColor_Foreground);               
        else if(transparent)
          LCD_WRITE_DATA(bk_color[i]);       
        else
          LCD_WRITE_DATA(usColor_Background);       
        ++i;        
        ucTemp >>= 1;                                       
      }
    }   
  }
  else
  {
    for(j=0;j<24;++j)
    {
      for(i=0;i<24;++i)
      {
        LCD_SetCursor(usX+i,usY+j);        
        bk_color[24*j+i]=LCD_Read_PixelData();
      }
    }
   
    LCD_OpenWindow(usX,usY,24,24);
    LCD_WRITE_CMD(0x2C);
#if USB_SPIFLASH_CH==1
    GetGBKCode_SPIFLASH(gbk_buffer,pstr,USB_FONT_24);
#else
    GetGBKCode_SD(gbk_buffer,pstr,FONT_24);
#endif   
   
    for(i=0,ucPage=0;ucPage<72;ucPage++)
    {
      ucTemp=gbk_buffer[ucPage];               
      for(ucColumn=0;ucColumn<8;ucColumn++)
      {
        if(ucTemp&0x01)
          LCD_WRITE_DATA(usColor_Foreground);       
        else if(transparent)
          LCD_WRITE_DATA(bk_color[i]);       
        else
          LCD_WRITE_DATA(usColor_Background);                                                               
        ++i;
        ucTemp >>= 1;                                       
      }
    }
  }       
}

/**
  * 函数功能: 在 LCD 显示器上显示一串中文
  * 输入参数: usX:在特定扫描方向下字符的起始X坐标
  *           usY :在特定扫描方向下该点的起始Y坐标
  *           pstr: 汉字字符低字节码
  *           usColor_Background :选择英文字符的背景色
  *           usColor_Foreground :选择英文字符的前景色
  *           font:字体选择
  *           可选值:FONT_16 :16号字体
  *                   FONT_24 :24号字体
  * 返 回 值: 无
  * 说    明:无
  */
void LCD_DispString_CH_Transparent(uint16_t usX,uint16_t usY,const uint8_t *pstr,
                                   uint16_t usColor_Background, uint16_t usColor_Foreground,
                                   uint8_t transparent,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_Disp_CH_Transparent(usX,usY,pstr,usColor_Background,usColor_Foreground,transparent,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_Disp_CH_Transparent(usX,usY,pstr,usColor_Background,usColor_Foreground,transparent,USB_FONT_24);
      pstr+=2;      
      usX+=24;
    }
        }  
}

/**
  * 函数功能: 在 LCD 显示器上显示一串中英文
  * 输入参数: usX:在特定扫描方向下字符的起始X坐标
  *           usY :在特定扫描方向下该点的起始Y坐标
  *           pstr: 汉字字符低字节码
  *           usColor_Background :选择英文字符的背景色
  *           usColor_Foreground :选择英文字符的前景色
  *           font:字体选择
  *           可选值:FONT_16 :16号字体
  *                   FONT_24 :24号字体
  * 返 回 值: 无
  * 说    明:无
  */
void LCD_DispString_EN_CH_Transparent(uint16_t usX,uint16_t usY,const uint8_t *pstr,
                                      uint16_t usColor_Background, uint16_t usColor_Foreground,
                                      uint8_t transparent,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_Transparent(usX,usY,*pstr,usColor_Background,usColor_Foreground,transparent,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_Transparent(usX,usY,*pstr,usColor_Background,usColor_Foreground,transparent,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_Disp_CH_Transparent(usX,usY,pstr,usColor_Background,usColor_Foreground,transparent,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_Disp_CH_Transparent(usX,usY,pstr,usColor_Background,usColor_Foreground,transparent,USB_FONT_24);
        pstr+=2;      
        usX+=24;
      }
    }
        }  
}




沙发
mmuuss586| | 2016-7-28 09:19 | 只看该作者
谢谢分享;

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

122

主题

216

帖子

48

粉丝