stm32 SPFD5420A TFT液晶屏调试字体旋转

 stm32   SPFD5420A TFT液晶屏调试字体旋转   

使用安富莱开发板自带液晶屏让字体像手机屏幕字体旋转似的让字体随着屏幕的转动而转动
在安富莱开发板液晶屏驱动代码里修改算法得到的

下面代码是修改后的算法:

/*
*********************************************************************************************************
* 函 数 名: LCD_DispStr
* 功能说明: 在LCD指定坐标(左上角)显示一个字符串
* 形    参:
*  _usX : X坐标,对于3.0寸宽屏,范围为【0 - 399】
*  _usY : Y坐标,对于3.0寸宽屏,范围为 【0 - 239】
*  _ptr  : 字符串指针
*  _tFont : 字体结构体,包含颜色、背景色(支持透明)、字体代码、文字间距等参数
* 返 回 值: 无
*********************************************************************************************************
*/
void LCD_DispStr(uint16_t _usX, uint16_t _usY, char *_ptr, FONT_T *_tFont,uint8_t direction_flag)
{
 uint8_t num = 1;
 uint32_t i;
 uint8_t code1;
 uint8_t code2;
 uint32_t address;
 uint8_t buf[24 * 24 / 8]; /* 最大支持24点阵汉字 */
 uint8_t m, width, height;
 uint16_t x, y;
 /* 暂时只支持16点阵宋体汉字 */
 if (_tFont->usFontCode == FC_ST_16X16)
 {
  height = 16;
  while (*_ptr != 0)
  {
   code1 = *_ptr; /* ascii代码 或者汉字代码的高字节 */
   if (code1 < 0x80)
   {
    /* 将ascii字符点阵复制到buf */
    memcpy(buf, &g_Ascii16[code1 * 16], 16);
    width = 8;
   }
   else
   {
    code2 = *++_ptr;
    if (code2 == 0)
    {
     break;
    }
    /* 计算16点阵汉字点阵地址
     ADDRESS = [(code1-0xa1) * 94 + (code2-0xa1)] * 32
     ;
    */
    #ifdef USE_SMALL_FONT
     m = 0;
     while(1)
     {
      address = m* 34;
      m++;
      if(num == 0)
      {
       if ((code1 == g_Hz16_lie[address + 0]) && (code2 == g_Hz16_lie[address + 1]))
       {
        address += 2;
        memcpy(buf, &g_Hz16_lie[address], 32);
        break;
       }
       else if ((g_Hz16_lie[address + 0] == 0xFF) && (g_Hz16_lie[address + 1] == 0xFF))
       {
        /* 字库搜索完毕,未找到,则填充全FF */
        memset(buf, 0xFF, 32);
        break;
       }
      }
      else
      {
       if ((code1 == g_Hz16[address + 0]) && (code2 == g_Hz16[address + 1]))
       {
        address += 2;
        memcpy(buf, &g_Hz16[address], 32);
        break;
       }
       else if ((g_Hz16[address + 0] == 0xFF) && (g_Hz16[address + 1] == 0xFF))
       {
        /* 字库搜索完毕,未找到,则填充全FF */
        memset(buf, 0xFF, 32);
        break;
       }  
      }
     }
     width = 16;
    #else
     address = ((code1-0xa1) * 94 + (code2-0xa1)) * 32 + HZK16_ADDR;
     memcpy(buf, (const uint8_t *)address, 32);
    #endif
     width = 16;
   }
   
   if(direction_flag == 0)      //字的显示是从左往右显示
   {
    y = _usY;                //将y轴坐标给y
    /* 开始刷LCD */
    for (m = 0; m < height; m++) // 字符高度
    {
     x = _usX;
     for (i = 0; i < width; i++) // 字符宽度
     {
      if ((buf[m * (width / 8) + i / 8] & (0x80 >> (i % 8))) != 0x00)
      {
       LCD_PutPixel(x, y, _tFont->usTextColor); // 设置像素颜色为文字色 ,也就是往屏幕上打点
      }
      else if (_tFont->usBackColor != CL_MASK)  /* 如果是颜色掩码值,则做透明处理 */
      {
       LCD_PutPixel(x, y, _tFont->usBackColor); /* 设置像素颜色为文字背景色 */;
      }
      x++; //从左往右打点,打width个
     }
     y++;        //向下移一个坐标(x从左往右移16个,y从上往下移1个)
    }
   }
   
   if(direction_flag == 1)
   {
    x = _usX; //将x轴坐标给x
    /* 开始刷LCD */
    for (m = 0; m < height; m++) /* 字符高度 height*/
    {
     
     y = _usY;
     for (i = 0; i < width; i++) /* 字符宽度 */
     {  
      if ((buf[m * (width / 8) + i / 8] & (0x80 >> (i % 8))) != 0x00)
      {
       LCD_PutPixel(x, y, _tFont->usTextColor); /* 设置像素颜色为文字色 */
      }
      else if (_tFont->usBackColor != CL_MASK)  /* 如果是颜色掩码值,则做透明处理 */
      {
       LCD_PutPixel(x, y, _tFont->usBackColor); /* 设置像素颜色为文字背景色 */;
      }
      
      y++;//从上往下打点,打width个
     }
     x--; //向左移一个坐标(y从上往下16个,x从右往左1个)
    }
   }
   
   if(direction_flag == 2)
   {
    x = _usX;//将x轴坐标给x
    /* 开始刷LCD */
    for (m = 0; m < height; m++) /* 字符高度 */
    {
     y = _usY;
     for (i = 0; i < width; i++) /* 字符宽度 */
     {
      if ((buf[m * (width / 8) + i / 8] & (0x80 >> (i % 8))) != 0x00)
      {
       LCD_PutPixel(x, y, _tFont->usTextColor); /* 设置像素颜色为文字色 */
      }
      else if (_tFont->usBackColor != CL_MASK)  /* 如果是颜色掩码值,则做透明处理 */
      {
       LCD_PutPixel(x, y, _tFont->usBackColor); /* 设置像素颜色为文字背景色 */;
      }
      y--;  //y从下往上打点,打y个
     }
     x++;      //向右移一个坐标,(y从下往上16个,x从左往右1个)
    }
   }
   if (_tFont->usBackColor != CL_MASK && _tFont->usSpace > 0)
   {
    /* 如果文字底色按_tFont->usBackColor,并且字间距大于点阵的宽度,那么需要在文字之间填充(暂时未实现) */
   }
   
   if(direction_flag == 0)
   {
    _usX += width + _tFont->usSpace; //字体顺序从左往右显示
    _ptr++;        /* 指向下一个字符 */
   }
   if(direction_flag == 1)
   {
    _usY += width + _tFont->usSpace; //字体顺序从上往下显示
    _ptr++;        /* 指向下一个字符 */
   }
   
   if(direction_flag == 2)
   {
    _usY -= width - _tFont->usSpace; //字体顺序从下往上显示
    _ptr++;        /* 指向下一个字符 */
   }
   
  }
 }
 else
 {
  /* 暂时不支持其他字体 */
  return;
 }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值