野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 15057|回复: 6

LCD语句问题

[复制链接]
发表于 2015-12-11 09:26:29 | 显示全部楼层 |阅读模式
HI 火哥在使用F4板子时,看到程序LCD里面有一断程序如下:
void LCD_DrawChar(uint16_t Xpos, uint16_t Ypos, const uint16_t *c)
{
  uint32_t index = 0, counter = 0, xpos =0;
  uint32_t  Xaddress = 0;
  
  xpos = Xpos*LCD_PIXEL_WIDTH*3;
  Xaddress += Ypos;
  
  for(index = 0; index < LCD_Currentfonts->Height; index++)
  {
   
    for(counter = 0; counter < LCD_Currentfonts->Width; counter++)
    {
         
      if((((c[index] & ((0x80 << ((LCD_Currentfonts->Width / 12 ) * 8 ) ) >> counter)) == 0x00) &&(LCD_Currentfonts->Width <= 12))||
        (((c[index] & (0x1 << counter)) == 0x00)&&(LCD_Currentfonts->Width > 12 )))
      {
        *(__IO uint16_t*)(CurrentFrameBuffer + (3*Xaddress) + xpos) = (0x00FFFF & CurrentBackColor);        //GB
        *(__IO uint8_t*)(CurrentFrameBuffer + (3*Xaddress) + xpos+2) = (0xFF0000 & CurrentBackColor) >> 16; //R
      }
      else
      {
        *(__IO uint16_t*)(CurrentFrameBuffer + (3*Xaddress) + xpos) = (0x00FFFF & CurrentTextColor);        //GB
        *(__IO uint8_t*)(CurrentFrameBuffer + (3*Xaddress) + xpos+2) = (0xFF0000 & CurrentTextColor) >> 16; //R
      }
      Xaddress++;
    }
     Xaddress += (LCD_PIXEL_WIDTH - LCD_Currentfonts->Width);




这个是一个点亮字符的小程序,只有最后这一句     Xaddress += (LCD_PIXEL_WIDTH - LCD_Currentfonts->Width);我没有看明白,按理说LCD_PIXEL_WIDTH应该是800,LCD_Currentfonts->Width是16。那么Xaddress为什么是这样的值?
我的解理是Xaddress 应该跳到此时Xpos+1的Ypos列。请指点下,谢谢!
回复

使用道具 举报

发表于 2015-12-11 09:58:16 | 显示全部楼层
因为字符的显示是这样的
*********||||||||****************
*********||||||||****************
*********||||||||****************
*********||||||||****************

上面的多行|||构成一个字符的像素,当显示字模的时候,
显示完一行,要切换到下一行的液晶地址,就需要用下面的语句来偏移了。
Xaddress += (LCD_PIXEL_WIDTH - LCD_Currentfonts->Width);


思路就是这样,这个语句的具体运算你要根据这个思路理解,自己算一算,就能体会到

回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-12-11 10:17:22 | 显示全部楼层
你说的这个字符显示形式我知道,也能理解,但我不知道为什么是 Xaddress += (LCD_PIXEL_WIDTH - LCD_Currentfonts->Width);
或者这么说吧 如果是上面这样的公式,那么LCD_PIXEL_WIDTH应该是800,LCD_Currentfonts->Width是16,这个时候Xaddress值在显示完第一行的时候值是不是应该为Xaddress=Xaddress(16)+800-16=800???
或者你说一下 如果显示第一小行后的 Xaddress += (LCD_PIXEL_WIDTH - LCD_Currentfonts->Width);值应该是多少?
回复 支持 反对

使用道具 举报

发表于 2015-12-11 11:01:42 | 显示全部楼层
linyl2010 发表于 2015-12-11 10:17
你说的这个字符显示形式我知道,也能理解,但我不知道为什么是 Xaddress += (LCD_PIXEL_WIDTH - LCD_Curren ...

800就对了啊,这样就指向下一行了。
按你的假设,初始Xaddress=0,字模的第一行,第一列地址是Xaddress=0。
那字模的第二行,第一列的地址不就是800么? 是不是被搞晕了。。哈哈


  
0
  
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*



所以为什么不直接加800,好像我也晕了 ,上面的for循环其实刚好对Xaddress加了一个LCD_Currentfonts->Width,这个运算又把它减掉了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-12-11 11:17:11 | 显示全部楼层
flyleaf 发表于 2015-12-11 11:01
800就对了啊,这样就指向下一行了。
按你的假设,初始Xaddress=0,字模的第一行,第一列地址是Xaddress= ...

你的意思是LCD的SRAM存储是按一行一行存的,并不是说按一个字符的一小行完,到下一小行存的。
那也就是:第一行0---48  第二行就是2400--2448,而不是49--96.
回复 支持 反对

使用道具 举报

发表于 2015-12-11 12:30:47 | 显示全部楼层
sdram存储的是整个液晶的像素数据结构,不是按字符的,这个函数里的Xaddress表示像素位置
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-12-11 12:58:38 | 显示全部楼层
OK 明白了,我饶进字符了。之前玩其他开发板是用字符的,3Q
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-9-21 05:46 , Processed in 0.029146 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表