colaring 发表于 2008-6-5 09:46:57

遇到个问题,搞过ILI9320的进来讨论一下

最近用ILI9320的TFT液晶时突发奇想,想在刷中文和ASCII时来个“透明写”功能,具体就是从中文或ASCII码库中取来编码时,普通程序对应编码1时将液晶的这一像素涂上CharColor(字符颜色),编码0涂上BackColor(背景颜色),而我想弄的这个程序是1涂上CharColor而0时不改变背景,这样做菜单就省力多了并且还能节省系统资源,但是PDF东找西找还是没搞明白怎么能简便的让液晶的AC自增1(发一堆命令改AC就算了,这我也想过,实在不行也就只能这样了,但是估计效率不怎么高啊)
我的意思就是希望能能很简单的使AC跳过指定点,现在写中文和ASCII的方法是一位一位判断字符代码,是1的写入CharColor是0的写入BackColor
这是我LCD写中文的底层程序,总感觉效率不高,有经验的请指点一下,谢谢了

/****************************************************************
函数名:Lcd写1个中文函数
入口参数:x,横向坐标,由左到右分别是0~15
          y,纵向坐标,由上到下分别为0~19
          CharColaor,字符的颜色
          CharBackColor,字符背景颜色
         ASCIICode,相应中文的编码
也就是说,320240分辨率的显示屏,横向能显示15中文字符,竖向能显示20行
返回值:无
*****************************************************************/
void Lcd_WriteChinese(u8 x,u8 y,u16 CharColor,u16 CharBackColor,u16 ChineseCode)
{
      u8 ByteCounter,BitCounter,*ChinesePointer;
      Lcd_Set16X16ChineseArea(x,y);      
      Lcd_WR_Start();
      CatchChinese(ChineseCode,0);//一个去SPI FLASH取字模并将32byte字模存储到数组ChineseBuffer,另外那个0是字库的地址偏移
      ChinesePointer=ChineseBuffer;//Chinese;
      for(ByteCounter=0;ByteCounter<32;ByteCounter++)
      {
          for(BitCounter=0;BitCounter<8;BitCounter++)
          {
            if((*ChinesePointer & (0x80 >> BitCounter)) == 0x00)
            {
               Lcd_Rs_H();
               Lcd_Write(CharBackColor);
               Lcd_Wr_L();
               Lcd_Wr_H();
            }
            else
            {
               Lcd_Rs_H();
               Lcd_Write(CharColor);
               Lcd_Wr_L();
               Lcd_Wr_H();
            }   
          }
          ChinesePointer++;
      }
         Lcd_WR_End();
}

cddyy 发表于 2008-6-6 20:45:01

ILI9320没有这个指令
我调这个时发现, 扫描方式改成从左到右,从下到上(BMP格式),显示图片的时候会出问题,本来是屏幕的最下面的几行数据会显示在最上面,当扫描方式改成从左到右,从上到下时就能正常显示了,不知道大家有没有遇到过这个问题呢?

syij 发表于 2008-6-12 23:40:58

可以这样解决的,取字模1时写入CharColor 取字模0的时候读取显示ram(读取的数据扔掉,由于读取的时候指针地址也是加一的,也就实现了不改变原数据的效果),然后继续下一点,呵呵!!!!!!!!!!!

colaring 发表于 2008-6-16 11:15:03

syij 逸洁 谢谢了   好办法

jhhh999 发表于 2008-8-15 09:14:17

小弟也刚刚一个ILI9320驱动的2.8寸的液晶,能否发一个驱动的例程啊,我实在不知道从那里入手

colaring 发表于 2008-8-15 09:18:01

我发过ILI9320驱动了,你自己搜

shdzbsl 发表于 2009-3-28 10:42:47

问一下,LZ试过通过读取GRAM使地址加一的方法实现透明写功能了吗?
我测试时,发现读取GRAM后它的地址没有自动加一,不知是哪里的问题,还望赐教。

XUEPENGBIN 发表于 2009-3-28 11:12:45

要是用写一点的方式来写汉字就不会出现你的问题。你先写一个在屏幕上画点的函数。然后你写汉字的每一个点的时候就用这个画点的函数来写。碰到0只要让地址加一而不执行动做就可以了。

252177861 发表于 2009-3-28 11:27:34

楼上的方法每写一个点都需要定位XY坐标,那样效率还是不高吧。

shdzbsl 发表于 2009-3-28 13:11:29

顶一下,ILI9320的GRAM在连续读的情况下,内部地址会不会自动加1呢?

2484 发表于 2009-8-11 08:05:15

学习了!!!

fq1888 发表于 2010-5-14 01:27:15

Mark

billgates 发表于 2010-7-4 03:45:48

Mark

billgates 发表于 2010-7-4 03:50:49

通常“镂空的点”比“字的点”要多得多,就算能用GetPointerColor()来移动GRAM指针,也不如每个“字的点”SetXY()快。。。
不知我说得对不对,大家讨论下

zjn8888 发表于 2010-7-4 10:59:28

学习

ql8261956 发表于 2010-8-24 10:51:56

回复【6楼】colaring 十月天高人浮躁
-----------------------------------------------------------------------

貌似我的实践结果也是读取数据时指针没有加1;那位高人还有高招

285123115 发表于 2010-11-8 22:55:57

回复【1楼】cddyy
-----------------------------------------------------------------------

这个问题我也碰到了,从左到右,从下到上时,设定区域里的第一行会显示在最下面一行,当从左到右,从上到下时是正常的,疑惑中.

285123115 发表于 2010-11-8 23:18:53

回复【2楼】syij逸洁
-----------------------------------------------------------------------

回复【7楼】shdzbsl
-----------------------------------------------------------------------

回复【10楼】shdzbsl
-----------------------------------------------------------------------

回复【16楼】ql8261956
-----------------------------------------------------------------------

读的时候AC是不会自动加一的,只有写的时候才会,ILI9320的透明写也困扰了我很久,现在还没有找到一个高效率的方法,我的文字背景是一张图片,所以一楼的方法也不适用.
http://cache.amobbs.com/bbs_upload782111/files_34/ourdev_596294B7R6XA.JPG
ILI9320文档截图 (原文件名:QQ截图未命名.JPG)

312578957 发表于 2010-11-15 15:02:49

我也遇到了相同了的问题,
如果不事先 设定一个窗口的话,那样显示效率很低,每个点都得重新给坐标

shenfeipascal 发表于 2011-1-12 15:41:47

可以的我试过,你把函数ili9320_PutChar的一部分注释掉就行了
void ili9320_PutChar(u16 x, u16 y, u8 c, u16 charColor, u16 bkColor)
{
    u16 i = 0;
    u16 j = 0;
    u8 tmp_char = 0;
    for (i = 0; i < 16; i++)
    {
      tmp_char=ascii_8x16[((c - 0x20) * 16) + i];
      for (j = 0; j < 8; j++)
      {
            if ( (tmp_char >> 7-j) & 0x01 == 0x01)
            {
                ili9320_SetPoint(x+j,y+i,charColor); // 字符颜色
            }//end if
            //else
            //{
            //    ili9320_SetPoint(x+j,y+i,bkColor); // 背景颜色
            //}//end else
      }//end for
    }//end for
}//end func.

yu_wen 发表于 2011-5-10 10:48:30

mark

yulri 发表于 2011-6-23 15:04:40

标记一下

likebo 发表于 2011-9-6 16:43:20

把透明部分读出来,又写回去AC就+1了。

nobleyinhuan 发表于 2011-12-19 14:30:32

MARK ,关注中

AttTiv 发表于 2012-1-10 10:30:53

MARK,正开始学习

ming1006 发表于 2013-2-3 09:47:59

billgates 发表于 2010-7-4 03:50 static/image/common/back.gif
通常“镂空的点”比“字的点”要多得多,就算能用GetPointerColor()来移动GRAM指针,也不如每个“字的点”S ...

很有道理,这个方法值得借鉴

nhztb 发表于 2013-2-3 09:51:03

写块,这样快点

SUNZHILIANG 发表于 2013-2-4 21:36:48

不会左丘绑定

uplinux 发表于 2013-4-14 14:39:34

读出来,再把读出的点写回去就实现了AC加一

anyanggcmy 发表于 2014-7-18 17:39:11

学习中,{:lol:}
页: [1]
查看完整版本: 遇到个问题,搞过ILI9320的进来讨论一下