搜索
bottom↓
回复: 118

[原创] FL032-C0 240*320 TFT LCD的AVR驱动程序,LCD控制芯片ILI9320 并行16bit模式

[复制链接]

出0入0汤圆

发表于 2007-10-11 09:57:08 | 显示全部楼层 |阅读模式
大家好:
    经过两个晚上的努力,终于用AVR驱动起来这个型号是FL032-C0 控制芯片是ILI9320 的240*320 TFT LCD. AVR芯片用的是M32
当然这个屏最合适用ARM来驱动。16bit总线,很方便的。

    这个液晶屏是从二手交易论坛grant那弄来的,grant由于采购错误买了10块,现在还有6块,我刚才又发邮件定了一块。因此最多还有5块,需要的可以去看看。http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=823134&bbs_page_no=1&bbs_id=1011
    另外这个屏的资料也全在那里。

    闲话少说,上程序:
程序1:
用的是M32芯片,编译平台AVRStudio4.13+WINAVR20070525 -s优化级别,16MHz时钟频率
连线:
LCD            M32
D0~D7  <--->  PA0~PA7
D8~D15 <--->  PD0~PD7
CS      --->  PB0
RS      --->  PB1
WR      --->  PB2
RD      --->  PB4
RESET   --->  PB5
管脚定义在程序中很容易就可以改的,其中控制脚可以任意更改。

程序完成的功能是,把屏分成八份,显示八种颜色,即RGB的排列组合。
然后程序会在中间显示一幅小照片,鉴于M32的存储空间有限,所以图片很小了。

PS:程序没有注释,大家将就着看了。不好意思
这是程序:     
点击此处下载ourdev_176129.zip(文件大小:129K)

效果图:(抱歉,用手机那30W拍的,不清楚)



程序2:
用的是M32芯片,编译平台AVRStudio4.13+WINAVR20070525 -s优化级别,16MHz时钟频率,这次使用SD卡作存储
连线:
LCD            M32
D0~D7  <--->  PA0~PA7
D8~D15 <--->  PD0~PD7
CS      --->  PB0
RS      --->  PB1
WR      --->  PB2
RD      --->  PB4
RESET   --->  PC0

SD卡          M32
SO      ---〉 MISO
SI     <---   MOSI
CLK    <---   SCK
CS     <---   SS

程序完成的功能是搜索SD卡更目录下的batch文件夹下的bin文件。
这个文件是通过img2lcd 3.2软件生成的。选取方式是16位色,包含头数据,水平扫描,bin文件,240*320。
上一个测试程序也是通过这种方式取的,只不过是不包含头数据,弄成c语言的格式。
找到文件后会依次显示到屏幕上。

注:FAT支持FA16和32, FAT12不支持

这是程序:
点击此处下载ourdev_176130.zip(文件大小:103K)
把那个batch文件及其文件也附上来:(解压到sd卡就可以了,形式:batch文件夹,里面存放bin文件)
点击此处下载ourdev_176133.zip(文件大小:2.11M)

这是我用的板子:



效果图:(苦于没有相机啊,拍的效果就...)







程序的说明:

屏是工作在16位并行的模式下的,色彩65K,还没试过262K呢。

在test2中,我对程序作了整理,放在LCM文件夹下,有相应的c和h文件。以便于使用。
这个程序我只完成了初始化,还有就是显示数据。没有那些显示汉字,字母的程序。这个程序只要稍加改动就可应用于你的其他液晶程序。
这个屏的操作思想是:
     初始化 (这个我写好了,不需要管了)
     写数据:
            先确定XY坐标,然后启动,写数据(可以连续写,地址模块自己会自动增加),结束。这个都有相应的函数。
            如果中途改变坐标,则需要重新启动,然后写数据。

相信只要这么多,就行了,另外还有读数据,操作方式跟写数据相同

这个屏有个window功能的,就是写数据只写到设定的窗口内,在test1里我之前也用了这个功能,但是发现这个功能要求,x的起始和结束需要是4的倍数。
搞不明白,手册上又没明说,只提到起始x比结束x小,然后,两者的差要大于等于4,莫非就是这个因素?
后来我就没用这个函数,重新写了个。

好了,如果你有这个屏就试一下吧。献丑了。

出0入0汤圆

发表于 2007-10-11 10:10:38 | 显示全部楼层
厉害!

出0入8汤圆

发表于 2007-10-11 11:09:16 | 显示全部楼层
要是有SPI接口的TFT LCD,用ST CortexM3核的STM32F103xxx的SPI接口,最快可以做到18M的速度,那显示起来才爽啊。

我要的2.8寸快到了,你要是需要预定要早点给我消息。只是价格我暂时也不是特别清楚,我全部委托朋友搞定,我只能保证会控制在200RMB以下,都是那个17点税搞的。

出0入0汤圆

 楼主| 发表于 2007-10-11 12:14:03 | 显示全部楼层
谢谢grant,我回了你邮件了,我要一块,spi接口的线又少。麻烦你了!

出50入0汤圆

发表于 2007-10-11 12:43:48 | 显示全部楼层
有SPI接口的TFT,我也想要个,呵呵~~

出0入0汤圆

发表于 2007-10-11 13:54:16 | 显示全部楼层
你的效率好高哈!今天做了它的小板(6.5CM*6.5CM)的.竟用了70远,(5快),物价果然涨了!好在是和同学平分费用的~

出0入8汤圆

发表于 2007-10-11 15:26:59 | 显示全部楼层
上面的触摸屏没用上,可惜了。

不过这次要是全部转让完了,我就没了。我买的2.8寸屏很快就到了,是用来配STM32F103R8T6,我额外加了一个EN28J60。倒时那个屏也要做转接板,那个插座麻烦,不想焊在PCB上。

to bozai
我收到你的邮件,我会多定购一块。回头我的MCU板做好了,我送你一块空PCB和主芯片,到时你也TFT也不用焊板了。

出0入0汤圆

发表于 2007-10-11 15:33:22 | 显示全部楼层
不知道楼主可否给我订购一个SPI方式的液晶呢

出0入0汤圆

发表于 2007-10-11 15:46:30 | 显示全部楼层
强帖! 顶下,呵呵

出0入0汤圆

 楼主| 发表于 2007-10-11 15:55:38 | 显示全部楼层
to: Grant
    谢谢!
    触摸屏没用上是可惜了,一个也要好几十呢。不过以后可以用上。现在没有触摸屏的控制芯片,在21ic上看到有人用avr的ad直接接的不知道性能如何。这倒可以试试。
    另外看了你给的资料,那个2.8寸的把所有接口都接出来了,可以根据选择使用spi还是并行方式。看了尺寸图,那个FPC的脚距也很小,焊起来有难度阿。哈哈,等着你的板子了,多谢了!
    还有,那个屏的背光不是3.2v而是12.8v,它把四个等串了起来,所以还得加个dc-dc升压电路,这个不难,你做板时要注意了。

to 7楼:
    不好意思,屏是Grant的,Grant是自己定购时顺便帮我多带一块的。
    PS:这个屏还是有很多脚的,但其可以工作在spi模式下的

出0入0汤圆

发表于 2007-10-11 15:58:35 | 显示全部楼层
to 【9楼】 bozai 章其波
用AVR的A/D做触摸屏性能还可以,我已经测试过了,好像在论坛里有人已经发过了,那我就在发一次我验证通过的。

点击此处下载ourdev_176169.rar(文件大小:431K)


出0入0汤圆

 楼主| 发表于 2007-10-11 15:59:56 | 显示全部楼层
to 【10楼】 _yu-ming :
    谢谢!有空试一下。

出0入8汤圆

发表于 2007-10-11 16:20:54 | 显示全部楼层
to bozai

我已经申请了触摸屏的IC,拿到后我会送你几片,免得触摸功能浪费了。俺别的没有,就是芯片多,特别是MCU。

2.8寸的屏是支持SPI、8位、16位并行方式、YSYNC接口。上面已经说了,我暂时也不知道具体的价格。这块2.8寸屏是不带触摸屏的!

真要需要的,我可以多拿几块。不过这块屏的价格可能会高一些,因为前面的那块2.4寸的时没有开票拿的,后面的这块2.8的要含17点的税。

出0入0汤圆

 楼主| 发表于 2007-10-11 16:29:30 | 显示全部楼层
to Grant:
   哈哈,Thanks a lot!

to 【4楼】 cddyy & 【7楼】 RENMA :
   还等什么,需要的赶快联系grant哦,是捎带哦,不是卖的。晚了就没了。

出50入0汤圆

发表于 2007-10-11 20:28:56 | 显示全部楼层
呵呵,我的邮箱:cddyy@sohu.com
希望Grant能看到,对了,能发给我模块的资料么?

出0入0汤圆

发表于 2007-10-11 20:53:06 | 显示全部楼层
留个记号

出0入0汤圆

发表于 2007-10-12 10:49:34 | 显示全部楼层
to:Grant

能否也帮我多定一个SPI的屏呢

谢谢

出0入0汤圆

发表于 2007-10-12 16:58:01 | 显示全部楼层
bozai 章其波    你的触摸屏部分搞好了吗? 我把M16A/D采集触摸屏的代码已经上传了。

出0入0汤圆

 楼主| 发表于 2007-10-12 18:07:42 | 显示全部楼层
【17楼】 _yu-ming
谢谢!已经下了。
昨天太累了,没试,公司事也比较多。
头像被屏蔽

出0入0汤圆

发表于 2007-10-12 18:59:43 | 显示全部楼层
谢谢bozai的共享,热心会员啊 :)

出0入8汤圆

发表于 2007-10-13 01:02:47 | 显示全部楼层
给我发邮件的几位,我暂时不能答复是否还有剩下的,因为有几个网友订了,但我一直没查到到账,我既然答应了他们,再等一下,下周一之后如果还没确认付款,我只能对他们放弃!到那是我才能知道还能剩下多少块,所以之前有给我发邮件的,我都没有回复。

转让这块屏我是亏了本的,只是没亏那么多罢了。所有不要指望我有很多这样的屏。

to migzan:我当初登出转让消息时,感觉被你挤兑了,就这个价格全新的屏还带触摸屏你还嫌……,我觉得和你交易不会是一件爽快的事情。为了避免你我之间不必要的误会,我只能说非常抱歉,我无法为你提供购买渠道,也许在TaoBao上你会找到更好的机会的。


to cddyy:
由于一些意外,我暂时还不能发给你2.8寸的全部资料。

to bozai:
出了一点意外,今天早上朋友打电话过来,如果2.8寸的含税的话,价格有点高了快接近我的目标。我之前已经订了10pcs,是用在我自己的系统中的,没有多出的数量。我打算叫我朋友在帮我找找有没有可以不用加税的2.8寸或3.2寸屏,当然也要是能支持SPI接口的,要是找不到合适的,就只能再追加定购了。如果有什么消息我再邮件告知你。

哦,对了你对宽屏介不介意?听说现在的2.8和3.2流行宽屏啊?模块的具体尺寸我也不是特别清楚,在等提供数据手册。

出0入0汤圆

 楼主| 发表于 2007-10-13 08:56:43 | 显示全部楼层
to Grant:
   无所谓的,都可以。
另外如果找不到合适的,追加订购又比较麻烦的话,那个屏我想就不要找了吧,已经很麻烦你了,呵呵。

出50入0汤圆

发表于 2007-10-13 09:01:24 | 显示全部楼层
to Grant:
等您在这里发消息

出0入0汤圆

发表于 2007-10-13 11:29:59 | 显示全部楼层
to:【20楼】 Grant
你的做事原则我喜欢,你那么想我也不想说什么,一件小事也不想多说了

有论坛这个好氛围,这个好地方,贴点路费我想你也不怎么在乎,没觉得亏了

我曾经帮助过论坛几个哥们在北京中发买芯片,有的没货我去定货,前后跑了几次,不说那点车费,光时间就耽误不少了,不图一点利益,就只因为是论坛的朋友,有共同的爱好。

影响你转让了,说声抱歉,并不是存心或者恶意,事情就此OVER吧,Grant你也不用回我帖了

出0入0汤圆

发表于 2007-10-22 22:43:40 | 显示全部楼层
2.8的屏到了没有??
想要一块!!!
最好能带STM32F103R8T6的板子!!!
有的话发我条短信:13586540855

出0入8汤圆

发表于 2007-11-10 23:39:46 | 显示全部楼层
ST现在官方给出的Cortex-M3 STM3210B EvalBoard上用的TFT LCD与我之前搞错的TFT使用的是相同的驱动,不过它使用的是SPI接口,而我本身买错的屏只有并行接口。我在STM32演示板下面找到它使用的ILI9320底层驱动,有画点、画园、画线等函数可以参考,如果有帮我转购这个屏的朋友,需要使用的时候可以参考它的部分函数。记得由于接口不同,读、写函数是需要改变的,代码最后的LCD_SPIConfig函数对不是使用STM32F10x芯片控制是没有用的。




下面提供的是C文件代码

/******************** (C) COPYRIGHT 2007 STMicroelectronics ********************
* File Name          : lcd.c
* Author             : MCD Application Team
* Version            : V1.0
* Date               : 10/08/2007
* Description        : This file includes the LCD driver for AM-240320LTNQW00H
*                      (LCD_HX8312) and AM-240320L8TNQW00H (LCD_ILI9320)
*                      Liquid Crystal Display Module of STM3210B-EVAL board.
********************************************************************************
* THE PRESENT SOFTWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
* CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
*******************************************************************************/

/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "fonts.h"

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
#ifdef LCD_ILI9320
  #define START_BYTE  0x70
  #define SET_INDEX   0x00
  #define READ_STATUS 0x01
  #define WRITE_REG   0x02
  #define READ_REG    0x03
#endif  

/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
  /* Global variables to set the written text color */
static  vu16 TextColor = 0x0000, BackColor = 0xFFFF;
  
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/

/*******************************************************************************
* Function Name  : STM3210B_LCD_Init
* Description    : Initializes the LCD.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void STM3210B_LCD_Init(void)
{
/* Configure the LCD Control pins --------------------------------------------*/
  LCD_CtrlLinesConfig();
  
/* Configure the SPI2 interface ----------------------------------------------*/
  LCD_SPIConfig();

#ifdef LCD_ILI9320
  Delay(5); // delay 50 ms
/* Start Initial Sequence ----------------------------------------------------*/
  LCD_WriteReg(R229, 0x8000); /* Set the internal vcore voltage */
  LCD_WriteReg(R0,   0x0001); /* Start internal OSC. */
  LCD_WriteReg(R1,   0x0100); /* set SS and SM bit */
  LCD_WriteReg(R2,   0x0700); /* set 1 line inversion */
  LCD_WriteReg(R3,   0x1030); /* set GRAM write direction and BGR=1. */
  LCD_WriteReg(R4,   0x0000); /* Resize register */
  LCD_WriteReg(R8,  0x0202); /* set the back porch and front porch */
  LCD_WriteReg(R9,  0x0000); /* set non-display area refresh cycle ISC[3:0] */
  LCD_WriteReg(R10, 0x0000); /* FMARK function */
  LCD_WriteReg(R12, 0x0000); /* RGB interface setting */
  LCD_WriteReg(R13, 0x0000); /* Frame marker Position */
  LCD_WriteReg(R15, 0x0000); /* RGB interface polarity */

/* Power On sequence ---------------------------------------------------------*/
  LCD_WriteReg(R16, 0x0000); /* SAP, BT[3:0], AP, DSTB, SLP, STB */
  LCD_WriteReg(R17, 0x0000); /* DC1[2:0], DC0[2:0], VC[2:0] */
  LCD_WriteReg(R18, 0x0000); /* VREG1OUT voltage */
  LCD_WriteReg(R19, 0x0000); /* VDV[4:0] for VCOM amplitude */
  Delay(20);                 /* Dis-charge capacitor power voltage (200ms) */
  LCD_WriteReg(R16, 0x17B0); /* SAP, BT[3:0], AP, DSTB, SLP, STB */
  LCD_WriteReg(R17, 0x0137); /* DC1[2:0], DC0[2:0], VC[2:0] */
  Delay(5);                  /* Delay 50 ms */
  LCD_WriteReg(R18, 0x0139); /* VREG1OUT voltage */
  Delay(5);                  /* Delay 50 ms */
  LCD_WriteReg(R19, 0x1d00); /* VDV[4:0] for VCOM amplitude */
  LCD_WriteReg(R41, 0x0013); /* VCM[4:0] for VCOMH */
  Delay(5);                  /* Delay 50 ms */
  LCD_WriteReg(R32, 0x0000); /* GRAM horizontal Address */
  LCD_WriteReg(R33, 0x0000); /* GRAM Vertical Address */

/* Adjust the Gamma Curve ----------------------------------------------------*/
  LCD_WriteReg(R48, 0x0006);
  LCD_WriteReg(R49, 0x0101);
  LCD_WriteReg(R50, 0x0003);
  LCD_WriteReg(R53, 0x0106);
  LCD_WriteReg(R54, 0x0b02);
  LCD_WriteReg(R55, 0x0302);
  LCD_WriteReg(R56, 0x0707);
  LCD_WriteReg(R57, 0x0007);
  LCD_WriteReg(R60, 0x0600);
  LCD_WriteReg(R61, 0x020b);
  
/* Set GRAM area -------------------------------------------------------------*/
  LCD_WriteReg(R80, 0x0000); /* Horizontal GRAM Start Address */
  LCD_WriteReg(R81, 0x00EF); /* Horizontal GRAM End Address */
  LCD_WriteReg(R82, 0x0000); /* Vertical GRAM Start Address */
  LCD_WriteReg(R83, 0x013F); /* Vertical GRAM End Address */

  LCD_WriteReg(R96,  0x2700); /* Gate Scan Line */
  LCD_WriteReg(R97,  0x0001); /* NDL,VLE, REV */
  LCD_WriteReg(R106, 0x0000); /* set scrolling line */

/* Partial Display Control ---------------------------------------------------*/
  LCD_WriteReg(R128, 0x0000);
  LCD_WriteReg(R129, 0x0000);
  LCD_WriteReg(R130, 0x0000);
  LCD_WriteReg(R131, 0x0000);
  LCD_WriteReg(R132, 0x0000);
  LCD_WriteReg(R133, 0x0000);

/* Panel Control -------------------------------------------------------------*/
  LCD_WriteReg(R144, 0x0010);
  LCD_WriteReg(R146, 0x0000);
  LCD_WriteReg(R147, 0x0003);
  LCD_WriteReg(R149, 0x0110);
  LCD_WriteReg(R151, 0x0000);
  LCD_WriteReg(R152, 0x0000);

  /* Set GRAM write direction and BGR = 1 */
  /* I/D=01 (Horizontal : increment, Vertical : decrement) */
  /* AM=1 (address is updated in vertical writing direction) */
  LCD_WriteReg(R3, 0x1018);

  LCD_WriteReg(R7, 0x0173); /* 262K color and display ON */

#elif defined LCD_HX8312  
/* Enable the LCD Oscillator -------------------------------------------------*/
  LCD_WriteReg(R1, 0x10);
  LCD_WriteReg(R0, 0xA0);
  LCD_WriteReg(R3, 0x01);
  Delay(1); /* Delay 10 ms */
  LCD_WriteReg(R3, 0x00);
  LCD_WriteReg(R43, 0x04);
  
  LCD_WriteReg(R40, 0x18);
  LCD_WriteReg(R26, 0x05);
  LCD_WriteReg(R37, 0x05);
  LCD_WriteReg(R25, 0x00);
   
/* LCD Power On --------------------------------------------------------------*/
  LCD_WriteReg(R28, 0x73);
  LCD_WriteReg(R36, 0x74);
  LCD_WriteReg(R30, 0x01);
  LCD_WriteReg(R24, 0xC1);
  Delay(1); /* Delay 10 ms */
  LCD_WriteReg(R24, 0xE1);
  LCD_WriteReg(R24, 0xF1);
  Delay(6); /* Delay 60 ms */
  LCD_WriteReg(R24, 0xF5);
  Delay(6); /* Delay 60 ms */
  LCD_WriteReg(R27, 0x09);
  Delay(1); /* Delay 10 ms */
  LCD_WriteReg(R31, 0x11);
  LCD_WriteReg(R32, 0x0E);
  LCD_WriteReg(R30, 0x81);
  Delay(1); /* Delay 10 ms */
   
/* Chip Set ------------------------------------------------------------------*/
  LCD_WriteReg(R157, 0x00);
  LCD_WriteReg(R192, 0x00);

  LCD_WriteReg(R14, 0x00);
  LCD_WriteReg(R15, 0x00);
  LCD_WriteReg(R16, 0x00);
  LCD_WriteReg(R17, 0x00);
  LCD_WriteReg(R18, 0x00);
  LCD_WriteReg(R19, 0x00);
  LCD_WriteReg(R20, 0x00);
  LCD_WriteReg(R21, 0x00);
  LCD_WriteReg(R22, 0x00);
  LCD_WriteReg(R23, 0x00);

  LCD_WriteReg(R52, 0x01);
  LCD_WriteReg(R53, 0x00);

  LCD_WriteReg(R75, 0x00);
  LCD_WriteReg(R76, 0x00);
  LCD_WriteReg(R78, 0x00);
  LCD_WriteReg(R79, 0x00);
  LCD_WriteReg(R80, 0x00);

  LCD_WriteReg(R60, 0x00);
  LCD_WriteReg(R61, 0x00);
  LCD_WriteReg(R62, 0x01);
  LCD_WriteReg(R63, 0x3F);
  LCD_WriteReg(R64, 0x02);
  LCD_WriteReg(R65, 0x02);
  LCD_WriteReg(R66, 0x00);
  LCD_WriteReg(R67, 0x00);
  LCD_WriteReg(R68, 0x00);
  LCD_WriteReg(R69, 0x00);
  LCD_WriteReg(R70, 0xEF);
  LCD_WriteReg(R71, 0x00);
  LCD_WriteReg(R72, 0x00);
  LCD_WriteReg(R73, 0x01);
  LCD_WriteReg(R74, 0x3F);

  LCD_WriteReg(R29, 0x08);  /* R29:Gate scan direction setting */

  LCD_WriteReg(R134, 0x00);
  LCD_WriteReg(R135, 0x30);
  LCD_WriteReg(R136, 0x02);
  LCD_WriteReg(R137, 0x05);

  LCD_WriteReg(R141, 0x01);  /* R141:Register set-up mode for one line clock */
  LCD_WriteReg(R139, 0x20);  /* R139:One line SYSCLK number in one-line */
  LCD_WriteReg(R51, 0x01);  /* R51:N line inversion setting */
  LCD_WriteReg(R55, 0x01);  /* R55:Scanning method setting */
  LCD_WriteReg(R118, 0x00);
   
/* Gamma Set -----------------------------------------------------------------*/
  LCD_WriteReg(R143, 0x10);
  LCD_WriteReg(R144, 0x67);
  LCD_WriteReg(R145, 0x07);
  LCD_WriteReg(R146, 0x65);
  LCD_WriteReg(R147, 0x07);
  LCD_WriteReg(R148, 0x01);
  LCD_WriteReg(R149, 0x76);
  LCD_WriteReg(R150, 0x56);
  LCD_WriteReg(R151, 0x00);
  LCD_WriteReg(R152, 0x06);
  LCD_WriteReg(R153, 0x03);
  LCD_WriteReg(R154, 0x00);
  
/* Display On ----------------------------------------------------------------*/
  LCD_WriteReg(R1, 0x50);
  LCD_WriteReg(R5, 0x04);

  LCD_WriteReg(R0, 0x80);
  LCD_WriteReg(R59, 0x01);
  Delay(4);  /* Delay 40 ms */
  LCD_WriteReg(R0, 0x20);
#endif  
}

/*******************************************************************************
* Function Name  : LCD_SetTextColor
* Description    : Sets the Text color.
* Input          : - Color: specifies the Text color code RGB(5-6-5).
* Output         : - TextColor: Text color global variable used by LCD_DrawChar
*                  and LCD_DrawPicture functions.
* Return         : None
*******************************************************************************/
void LCD_SetTextColor(vu16 Color)
{
  TextColor = Color;
}

/*******************************************************************************
* Function Name  : LCD_SetBackColor
* Description    : Sets the Background color.
* Input          : - Color: specifies the Background color code RGB(5-6-5).
* Output         : - BackColor: Background color global variable used by
*                  LCD_DrawChar and LCD_DrawPicture functions.
* Return         : None
*******************************************************************************/
void LCD_SetBackColor(vu16 Color)
{
  BackColor = Color;
}

/*******************************************************************************
* Function Name  : LCD_ClearLine
* Description    : Clears the selected line.
* Input          : - Line: the Line to be cleared.
*                    This parameter can be one of the following values:
*                       - Linex: where x can be 0..9
* Output         : None
* Return         : None
*******************************************************************************/
void LCD_ClearLine(u8 Line)
{
  LCD_DisplayStringLine(Line, "                    ");
}

/*******************************************************************************
* Function Name  : LCD_Clear
* Description    : Clears the hole LCD.
* Input          : Color: the color of the background.
* Output         : None
* Return         : None
*******************************************************************************/
void LCD_Clear(u16 Color)
{
  u32 index = 0;
  
  LCD_SetCursor(0x00, 0x013F);

#ifdef LCD_ILI9320
  LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */
#endif

  for(index = 0; index < 76800; index++)
  {
    LCD_WriteRAM(Color);
  }

#ifdef LCD_ILI9320
  LCD_CtrlLinesWrite(GPIOB, CtrlPin_NCS, Bit_SET);
#endif  
}

/*******************************************************************************
* Function Name  : LCD_SetCursor
* Description    : Sets the cursor position.
* Input          : - Xpos: specifies the X position.
*                  - Ypos: specifies the Y position.
* Output         : None
* Return         : None
*******************************************************************************/
void LCD_SetCursor(u8 Xpos, u16 Ypos)
{
#ifdef LCD_ILI9320
  LCD_WriteReg(R32, Xpos);
  LCD_WriteReg(R33, Ypos);
#elif defined LCD_HX8312
  LCD_WriteReg(R66, Xpos);
  LCD_WriteReg(R67, ((Ypos & 0x100)>> 8));
  LCD_WriteReg(R68, (Ypos & 0xFF));
#endif
}

/*******************************************************************************
* Function Name  : LCD_DrawChar
* Description    : Draws a character on LCD.
* Input          : - Xpos: the Line where to display the character shape.
*                    This parameter can be one of the following values:
*                       - Linex: where x can be 0..9
*                  - Ypos: start column address.
*                  - c: pointer to the character data.
* Output         : None
* Return         : None
*******************************************************************************/
void LCD_DrawChar(u8 Xpos, u16 Ypos, uc16 *c)
{
  u32 index = 0, i = 0;
  u8 Xaddress = 0;
   
  Xaddress = Xpos;
  
  LCD_SetCursor(Xaddress, Ypos);
  
  for(index = 0; index < 24; index++)
  {
    #ifdef LCD_ILI9320
      LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */
    #endif
    for(i = 0; i < 16; i++)
    {
      if((c[index] & (1 << i)) == 0x00)
      {
        LCD_WriteRAM(BackColor);
      }
      else
      {
        LCD_WriteRAM(TextColor);
      }
    }
    #ifdef LCD_ILI9320
      LCD_CtrlLinesWrite(GPIOB, CtrlPin_NCS, Bit_SET);
    #endif  
    Xaddress++;
    LCD_SetCursor(Xaddress, Ypos);
  }
}

/*******************************************************************************
* Function Name  : LCD_DisplayChar
* Description    : Displays one character (16dots width, 24dots height).
* Input          : - Line: the Line where to display the character shape .
*                    This parameter can be one of the following values:
*                       - Linex: where x can be 0..9
*                  - Column: start column address.
*                  - Ascii: character ascii code, must be between 0x20 and 0x7E.
* Output         : None
* Return         : None
*******************************************************************************/
void LCD_DisplayChar(u8 Line, u16 Column, u8 Ascii)
{
  Ascii -= 32;
  LCD_DrawChar(Line, Column, &ASCII_Table[Ascii * 24]);
}

/*******************************************************************************
* Function Name  : LCD_DisplayStringLine
* Description    : Displays a maximum of 20 char on the LCD.
* Input          : - Line: the Line where to display the character shape .
*                    This parameter can be one of the following values:
*                       - Linex: where x can be 0..9
*                  - *ptr: pointer to string to display on LCD.
* Output         : None
* Return         : None
*******************************************************************************/
void LCD_DisplayStringLine(u8 Line, u8 *ptr)
{
  u32 i = 0;
  u16 refcolumn = 319;

  /* Send the string character by character on lCD */
  while ((*ptr != 0) & (i < 20))
  {
    /* Display one character on LCD */
    LCD_DisplayChar(Line, refcolumn, *ptr);
    /* Decrement the column position by 16 */
    refcolumn -= 16;
    /* Point on the next character */
    ptr++;
    /* Increment the character counter */
    i++;
  }
}

/*******************************************************************************
* Function Name  : LCD_SetDisplayWindow
* Description    : Sets a display window
* Input          : - Xpos: specifies the X buttom left position.
*                  - Ypos: specifies the Y buttom left position.
*                  - Height: display window height.
*                  - Width: display window width.
* Output         : None
* Return         : None
*******************************************************************************/
void LCD_SetDisplayWindow(u8 Xpos, u16 Ypos, u8 Height, u16 Width)
{
#ifdef LCD_ILI9320
  /* Horizontal GRAM Start Address */
  if(Xpos >= Height)
  {
    LCD_WriteReg(R80, (Xpos - Height + 1));
  }
  else
  {
    LCD_WriteReg(R80, 0);
  }
  /* Horizontal GRAM End Address */
  LCD_WriteReg(R81, Xpos);
  /* Vertical GRAM Start Address */
  if(Ypos >= Width)
  {
    LCD_WriteReg(R82, (Ypos - Width + 1));
  }  
  else
  {
    LCD_WriteReg(R82, 0);
  }
  /* Vertical GRAM End Address */
  LCD_WriteReg(R83, Ypos);
  
#elif defined LCD_HX8312  
  LCD_WriteReg(R1, 0xD0);
  LCD_WriteReg(R5, 0x14);

  LCD_WriteReg(R69, (Xpos - Height + 1));
  LCD_WriteReg(R70, Xpos);

  LCD_WriteReg(R71, (((Ypos - Width + 1) & 0x100)>> 8));
  LCD_WriteReg(R72, ((Ypos - Width + 1) & 0xFF));

  LCD_WriteReg(R73, ((Ypos & 0x100)>> 8));
  LCD_WriteReg(R74, (Ypos & 0xFF));
#endif

  LCD_SetCursor(Xpos, Ypos);
}

/*******************************************************************************
* Function Name  : LCD_WindowModeDisable
* Description    : Disables LCD Window mode.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void LCD_WindowModeDisable(void)
{
  #ifdef LCD_ILI9320
    LCD_SetDisplayWindow(239, 0x13F, 240, 320);
    LCD_WriteReg(R3, 0x1018);
  #elif defined LCD_HX8312
    LCD_WriteReg(R1, 0x50);
    LCD_WriteReg(R5, 0x04);
  #endif
   
}
/*******************************************************************************
* Function Name  : LCD_DrawLine
* Description    : Displays a line.
* Input          : - Xpos: specifies the X position.
*                  - Ypos: specifies the Y position.
*                  - Length: line length.
*                  - Direction: line direction.
*                    This parameter can be one of the following values: Vertical
*                    or Horizontal.
* Output         : None
* Return         : None
*******************************************************************************/
void LCD_DrawLine(u8 Xpos, u16 Ypos, u16 Length, u8 Direction)
{
  u32 i = 0;
  
  LCD_SetCursor(Xpos, Ypos);

  if(Direction == Horizontal)
  {
    #ifdef LCD_ILI9320
      LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */
    #endif
    for(i = 0; i < Length; i++)
    {
      LCD_WriteRAM(TextColor);
    }
    #ifdef LCD_ILI9320
      LCD_CtrlLinesWrite(GPIOB, CtrlPin_NCS, Bit_SET);
    #endif
  }
  else
  {
   for(i = 0; i < Length; i++)
    {
      #ifdef LCD_ILI9320
        LCD_WriteRAMWord(TextColor);
      #elif defined LCD_HX8312
        LCD_WriteRAM(TextColor);
      #endif
      Xpos++;
      LCD_SetCursor(Xpos, Ypos);
    }
  }
}

/*******************************************************************************
* Function Name  : LCD_DrawRect
* Description    : Displays a rectangle.
* Input          : - Xpos: specifies the X position.
*                  - Ypos: specifies the Y position.
*                  - Height: display rectangle height.
*                  - Width: display rectangle width.
* Output         : None
* Return         : None
*******************************************************************************/
void LCD_DrawRect(u8 Xpos, u16 Ypos, u8 Height, u16 Width)
{
  LCD_DrawLine(Xpos, Ypos, Width, Horizontal);
  LCD_DrawLine((Xpos + Height), Ypos, Width, Horizontal);
  
  LCD_DrawLine(Xpos, Ypos, Height, Vertical);
  LCD_DrawLine(Xpos, (Ypos - Width + 1), Height, Vertical);
}

/*******************************************************************************
* Function Name  : LCD_DrawCircle
* Description    : Displays a circle.
* Input          : - Xpos: specifies the X position.
*                  - Ypos: specifies the Y position.
*                  - Height: display rectangle height.
*                  - Width: display rectangle width.
* Output         : None
* Return         : None
*******************************************************************************/
void LCD_DrawCircle(u8 Xpos, u16 Ypos, u16 Radius)
{
  s32  D;/* Decision Variable */
  u32  CurX;/* Current X Value */
  u32  CurY;/* Current Y Value */
  
  D = 3 - (Radius << 1);
  CurX = 0;
  CurY = Radius;
  
  while (CurX <= CurY)
  {
    LCD_SetCursor(Xpos + CurX, Ypos + CurY);
    #ifdef LCD_ILI9320
        LCD_WriteRAMWord(TextColor);
    #elif defined LCD_HX8312
        LCD_WriteRAM(TextColor);
    #endif
    LCD_SetCursor(Xpos + CurX, Ypos - CurY);
    #ifdef LCD_ILI9320
        LCD_WriteRAMWord(TextColor);
    #elif defined LCD_HX8312
        LCD_WriteRAM(TextColor);
    #endif
    LCD_SetCursor(Xpos - CurX, Ypos + CurY);
    #ifdef LCD_ILI9320
        LCD_WriteRAMWord(TextColor);
    #elif defined LCD_HX8312
        LCD_WriteRAM(TextColor);
    #endif
    LCD_SetCursor(Xpos - CurX, Ypos - CurY);
    #ifdef LCD_ILI9320
        LCD_WriteRAMWord(TextColor);
    #elif defined LCD_HX8312
        LCD_WriteRAM(TextColor);
    #endif
    LCD_SetCursor(Xpos + CurY, Ypos + CurX);
    #ifdef LCD_ILI9320
        LCD_WriteRAMWord(TextColor);
    #elif defined LCD_HX8312
        LCD_WriteRAM(TextColor);
    #endif
    LCD_SetCursor(Xpos + CurY, Ypos - CurX);
    #ifdef LCD_ILI9320
        LCD_WriteRAMWord(TextColor);
    #elif defined LCD_HX8312
        LCD_WriteRAM(TextColor);
    #endif
    LCD_SetCursor(Xpos - CurY, Ypos + CurX);
    #ifdef LCD_ILI9320
        LCD_WriteRAMWord(TextColor);
    #elif defined LCD_HX8312
        LCD_WriteRAM(TextColor);
    #endif
    LCD_SetCursor(Xpos - CurY, Ypos - CurX);
    #ifdef LCD_ILI9320
        LCD_WriteRAMWord(TextColor);
    #elif defined LCD_HX8312
        LCD_WriteRAM(TextColor);
    #endif

    if (D < 0)
    {
      D += (CurX << 2) + 6;
    }
    else
    {
      D += ((CurX - CurY) << 2) + 10;
      CurY--;
    }
    CurX++;
  }
}

/*******************************************************************************
* Function Name  : LCD_DrawMonoPict
* Description    : Displays a monocolor picture.
* Input          : - Pict: pointer to the picture array.
* Output         : None
* Return         : None
*******************************************************************************/
void LCD_DrawMonoPict(uc32 *Pict)
{
  u32 index = 0, i = 0;

  LCD_SetCursor(0, 319);
  #ifdef LCD_ILI9320
    LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */
  #endif
  for(index = 0; index < 2400; index++)
  {
    for(i = 0; i < 32; i++)
    {
      if((Pict[index] & (1 << i)) == 0x00)
      {
        LCD_WriteRAM(BackColor);
      }
      else
      {
        LCD_WriteRAM(TextColor);
      }
    }
  }
  #ifdef LCD_ILI9320
    LCD_CtrlLinesWrite(GPIOB, CtrlPin_NCS, Bit_SET);
  #endif
}

/*******************************************************************************
* Function Name  : LCD_DrawBMP
* Description    : Displays a bitmap picture loaded in the SPI Flash.
* Input          : - BmpAddress: Bmp picture address in the SPI Flash.
* Output         : None
* Return         : None
*******************************************************************************/
void LCD_DrawBMP(u32 BmpAddress)
{
  u32 i = 0, size = 0;

  /* Read bitmap size */
  SPI_FLASH_BufferRead((u8*)&size, BmpAddress + 2, 4);

  /* get bitmap data address offset */
  SPI_FLASH_BufferRead((u8*)&i, BmpAddress + 10, 4);
  
  size = (size - i)/2;

  SPI_FLASH_StartReadSequence(BmpAddress + i);

  /* Disable SPI1  */
  SPI_Cmd(SPI1, DISABLE);
  /* SPI in 16-bit mode */
  SPI_DataSizeConfig(SPI1, SPI_DataSize_16b);

  /* Enable SPI1  */
  SPI_Cmd(SPI1, ENABLE);
  
  #ifdef LCD_ILI9320
    /* Set GRAM write direction and BGR = 1 */
    /* I/D=00 (Horizontal : decrement, Vertical : decrement) */
    /* AM=1 (address is updated in vertical writing direction) */
    LCD_WriteReg(R3, 0x1008);

    LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */
  #endif
  /* Read bitmap data from SPI Flash and send them to LCD */
  for(i = 0; i < size; i++)
  {
    LCD_WriteRAM(__REV_HalfWord(SPI_FLASH_SendHalfWord(0xA5A5)));
  }
  #ifdef LCD_ILI9320
    LCD_CtrlLinesWrite(GPIOB, CtrlPin_NCS, Bit_SET);
  #endif

  /* Deselect the FLASH: Chip Select high */
  SPI_FLASH_CS_HIGH();

  /* Disable SPI1  */
  SPI_Cmd(SPI1, DISABLE);
  /* SPI in 8-bit mode */
  SPI_DataSizeConfig(SPI1, SPI_DataSize_8b);

  /* Enable SPI1  */
  SPI_Cmd(SPI1, ENABLE);
  #ifdef LCD_ILI9320
    /* Set GRAM write direction and BGR = 1 */
    /* I/D = 01 (Horizontal : increment, Vertical : decrement) */
    /* AM = 1 (address is updated in vertical writing direction) */
    LCD_WriteReg(R3, 0x1018);
  #endif
}

#ifdef LCD_ILI9320
/*******************************************************************************
* Function Name  : LCD_nCS_StartByte
* Description    : Reset LCD control line(/CS) and Send Start-Byte
* Input          : - Start_Byte: the Start-Byte to be sent
* Output         : None
* Return         : None
*******************************************************************************/
void LCD_nCS_StartByte(u8 Start_Byte)
{
  LCD_CtrlLinesWrite(GPIOB, CtrlPin_NCS, Bit_RESET);

  SPI_SendData(SPI2, Start_Byte);
  while(SPI_GetFlagStatus(SPI2, SPI_FLAG_BSY) != RESET)
  {
  }
}

/*******************************************************************************
* Function Name  : LCD_WriteRegIndex
* Description    : Writes index to select the LCD register.
* Input          : - LCD_Reg: address of the selected register.
* Output         : None
* Return         : None
*******************************************************************************/
void LCD_WriteRegIndex(u8 LCD_Reg)
{
  /* Reset LCD control line(/CS) and Send Start-Byte */
  LCD_nCS_StartByte(START_BYTE | SET_INDEX);

  /* Write 16-bit Reg Index (High Byte is 0) */
  SPI_SendData(SPI2, 0);
  while(SPI_GetFlagStatus(SPI2, SPI_FLAG_BSY) != RESET)
  {
  }
  SPI_SendData(SPI2, LCD_Reg);
  while(SPI_GetFlagStatus(SPI2, SPI_FLAG_BSY) != RESET)
  {
  }

  LCD_CtrlLinesWrite(GPIOB, CtrlPin_NCS, Bit_SET);
}

/*******************************************************************************
* Function Name  : LCD_WriteReg
* Description    : Writes to the selected LCD register.
* Input          : - LCD_Reg: address of the selected register.
*                  - LCD_RegValue: value to write to the selected register.
* Output         : None
* Return         : None
*******************************************************************************/
void LCD_WriteReg(u8 LCD_Reg, u16 LCD_RegValue)
{
  /* Write 16-bit Index (then Write Reg) */
  LCD_WriteRegIndex(LCD_Reg);

  /* Write 16-bit Reg */
  /* Reset LCD control line(/CS) and Send Start-Byte */
  LCD_nCS_StartByte(START_BYTE | WRITE_REG);

  SPI_SendData(SPI2, LCD_RegValue>>8);
  while(SPI_GetFlagStatus(SPI2, SPI_FLAG_BSY) != RESET)
  {
  }
  SPI_SendData(SPI2, (LCD_RegValue & 0xFF));
  while(SPI_GetFlagStatus(SPI2, SPI_FLAG_BSY) != RESET)
  {
  }

  LCD_CtrlLinesWrite(GPIOB, CtrlPin_NCS, Bit_SET);
}

/*******************************************************************************
* Function Name  : LCD_ReadReg
* Description    : Reads the selected LCD Register.
* Input          : None
* Output         : None
* Return         : LCD Register Value.
*******************************************************************************/
u16 LCD_ReadReg(u8 LCD_Reg)
{
  u16 tmp = 0;
  u8 i = 0;

  /* Write 16-bit Index (then Read Reg) */
  LCD_WriteRegIndex(LCD_Reg);

  /* Read 16-bit Reg */
  /* Reset LCD control line(/CS) and Send Start-Byte */
  LCD_nCS_StartByte(START_BYTE | READ_REG);
  for(i = 0; i < 5; i++)
  {
    while(SPI_GetFlagStatus(SPI2, SPI_FLAG_BSY) != RESET)
    {
    }
    SPI_SendData(SPI2, 0xFF);
  }
  /* One byte of invalid dummy data read after the start byte */
  while(SPI_GetFlagStatus(SPI2, SPI_FLAG_RXNE) == SET)
  {
    SPI_ReceiveData(SPI2);
  }

  /* Read upper byte */
  while(SPI_GetFlagStatus(SPI2, SPI_FLAG_BSY) != RESET)
  {
  }
  SPI_SendData(SPI2, 0xFF);
  while(SPI_GetFlagStatus(SPI2, SPI_FLAG_RXNE)== RESET)
  {
  }
  tmp = SPI_ReceiveData(SPI2);
  
  /* Read lower byte */
  while(SPI_GetFlagStatus(SPI2, SPI_FLAG_BSY) != RESET)
  {
  }
  SPI_SendData(SPI2, 0xFF);
  while(SPI_GetFlagStatus(SPI2, SPI_FLAG_RXNE) == RESET)
  {
  }
  tmp = ((tmp & 0xFF) << 8) | SPI_ReceiveData(SPI2);

  LCD_CtrlLinesWrite(GPIOB, CtrlPin_NCS, Bit_SET);
  return tmp;
}

/*******************************************************************************
* Function Name  : LCD_WriteRAM_Prepare
* Description    : Prepare to write to the LCD RAM.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void LCD_WriteRAM_Prepare(void)
{
  LCD_WriteRegIndex(R34); /* Select GRAM Reg */

  /* Reset LCD control line(/CS) and Send Start-Byte */
  LCD_nCS_StartByte(START_BYTE | WRITE_REG);
}

/*******************************************************************************
* Function Name  : LCD_WriteRAMWord
* Description    : Writes 1 word to the LCD RAM.
* Input          : - RGB_Code: the pixel color in RGB mode (5-6-5).
* Output         : None
* Return         : None
*******************************************************************************/
void LCD_WriteRAMWord(u16 RGB_Code)
{
  LCD_WriteRAM_Prepare();

  LCD_WriteRAM(RGB_Code);

  LCD_CtrlLinesWrite(GPIOB, CtrlPin_NCS, Bit_SET);
}

#elif defined LCD_HX8312
/*******************************************************************************
* Function Name  : LCD_WriteReg
* Description    : Writes to the selected LCD register.
* Input          : - LCD_Reg: address of the selected register.
*                  - LCD_RegValue: value to write to the selected register.
* Output         : None
* Return         : None
*******************************************************************************/
void LCD_WriteReg(u8 LCD_Reg, u8 LCD_RegValue)
{
  u16 tmp = 0;
  
  LCD_CtrlLinesWrite(GPIOD, CtrlPin_NWR, Bit_RESET);
  LCD_CtrlLinesWrite(GPIOD, CtrlPin_RS, Bit_RESET);
  LCD_CtrlLinesWrite(GPIOB, CtrlPin_NCS, Bit_RESET);
  
  tmp = LCD_Reg << 8;
  tmp |= LCD_RegValue;

  SPI_SendData(SPI2, tmp);
  while(SPI_GetFlagStatus(SPI2, SPI_FLAG_BSY) != RESET)
  {
  }
  
  LCD_CtrlLinesWrite(GPIOB, CtrlPin_NCS, Bit_SET);
}
#endif

/*******************************************************************************
* Function Name  : LCD_WriteRAM
* Description    : Writes to the LCD RAM.
* Input          : - RGB_Code: the pixel color in RGB mode (5-6-5).
* Output         : None
* Return         : None
*******************************************************************************/
void LCD_WriteRAM(u16 RGB_Code)
{
  #ifdef LCD_ILI9320
    SPI_SendData(SPI2, RGB_Code >> 8);
    while(SPI_GetFlagStatus(SPI2, SPI_FLAG_BSY) != RESET)
    {
    }
    SPI_SendData(SPI2, RGB_Code & 0xFF);
    while(SPI_GetFlagStatus(SPI2, SPI_FLAG_BSY) != RESET)
    {
    }
  #elif defined LCD_HX8312
    LCD_CtrlLinesWrite(GPIOD, CtrlPin_NWR, Bit_RESET);
    LCD_CtrlLinesWrite(GPIOD, CtrlPin_RS, Bit_SET);
    LCD_CtrlLinesWrite(GPIOB, CtrlPin_NCS, Bit_RESET);

    SPI_SendData(SPI2, RGB_Code);
    while(SPI_GetFlagStatus(SPI2, SPI_FLAG_BSY) != RESET)
    {
    }
  
    LCD_CtrlLinesWrite(GPIOB, CtrlPin_NCS, Bit_SET);
  #endif
}

/*******************************************************************************
* Function Name  : LCD_PowerOn
* Description    : Power on the LCD.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void LCD_PowerOn(void)
{
#ifdef LCD_ILI9320
/* Power On sequence ---------------------------------------------------------*/
  LCD_WriteReg(R16, 0x0000); /* SAP, BT[3:0], AP, DSTB, SLP, STB */
  LCD_WriteReg(R17, 0x0000); /* DC1[2:0], DC0[2:0], VC[2:0] */
  LCD_WriteReg(R18, 0x0000); /* VREG1OUT voltage */
  LCD_WriteReg(R19, 0x0000); /* VDV[4:0] for VCOM amplitude */
  Delay(20);                 /* Dis-charge capacitor power voltage (200ms) */
  LCD_WriteReg(R16, 0x17B0); /* SAP, BT[3:0], AP, DSTB, SLP, STB */
  LCD_WriteReg(R17, 0x0137); /* DC1[2:0], DC0[2:0], VC[2:0] */
  Delay(5);                  /* Delay 50 ms */
  LCD_WriteReg(R18, 0x0139); /* VREG1OUT voltage */
  Delay(5);                  /* delay 50 ms */
  LCD_WriteReg(R19, 0x1d00); /* VDV[4:0] for VCOM amplitude */
  LCD_WriteReg(R41, 0x0013); /* VCM[4:0] for VCOMH */
  Delay(5);                  /* delay 50 ms */
  LCD_WriteReg(R7, 0x0173);  /* 262K color and display ON */
#elif defined LCD_HX8312  
  /* Power On Set */
  LCD_WriteReg(R28, 0x73);
  LCD_WriteReg(R36, 0x74);
  LCD_WriteReg(R30, 0x01);
  LCD_WriteReg(R24, 0xC1);
  Delay(1); /* Delay 10 ms */
  LCD_WriteReg(R24, 0xE1);
  LCD_WriteReg(R24, 0xF1);
  Delay(6); /* Delay 60 ms */
  LCD_WriteReg(R24, 0xF5);
  Delay(6); /* Delay 60 ms */
  LCD_WriteReg(R27, 0x09);
  Delay(1); /* Delay 10 ms */
  LCD_WriteReg(R31, 0x11);
  LCD_WriteReg(R32, 0x0E);
  LCD_WriteReg(R30, 0x81);
  Delay(1); /* Delay 10 ms */
#endif
}

/*******************************************************************************
* Function Name  : LCD_DisplayOn
* Description    : Enables the Display.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void LCD_DisplayOn(void)
{
#ifdef LCD_ILI9320
  /* Display On */
  LCD_WriteReg(R7, 0x0173); /* 262K color and display ON */
#elif defined LCD_HX8312  
  LCD_WriteReg(R1, 0x50);
  LCD_WriteReg(R5, 0x04);

  /* Display On */
  LCD_WriteReg(R0, 0x80);
  LCD_WriteReg(R59, 0x01);
  Delay(4);                 /* Delay 40 ms */
  LCD_WriteReg(R0, 0x20);
#endif  
}

/*******************************************************************************
* Function Name  : LCD_DisplayOff
* Description    : Disables the Display.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void LCD_DisplayOff(void)
{
#ifdef LCD_ILI9320
  /* Display Off */
  LCD_WriteReg(R7, 0x0);
#elif defined LCD_HX8312
  /* Display Off */
  LCD_WriteReg(R0, 0xA0);
  Delay(4);                 /* Delay 40 ms */
  LCD_WriteReg(R59, 0x00);
#endif
}

/*******************************************************************************
* Function Name  : LCD_CtrlLinesConfig
* Description    : Configures LCD control lines in Output Push-Pull mode.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void LCD_CtrlLinesConfig(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

  /* Configure NCS (PB.02) in Output Push-Pull mode */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  
  /* Configure NWR(RNW), RS (PD.15, PD.07) in Output Push-Pull mode */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_15;
  GPIO_Init(GPIOD, &GPIO_InitStructure);
  
  LCD_CtrlLinesWrite(GPIOD, CtrlPin_NWR, Bit_SET);
  LCD_CtrlLinesWrite(GPIOD, CtrlPin_RS, Bit_SET);
}

/*******************************************************************************
* Function Name  : LCD_CtrlLinesWrite
* Description    : Sets or reset LCD control lines.
* Input          : - GPIOx: where x can be B or D to select the GPIO peripheral.
*                  - CtrlPins: the Control line. This parameter can be:
*                       - CtrlPin_NCS: Chip Select pin (PB.02)
*                       - CtrlPin_NWR: Read/Write Selection pin (PD.15)
*                       - CtrlPin_RS: Register/RAM Selection pin (PD.07)
*                  - BitVal: specifies the value to be written to the selected bit.
*                    This parameter can be:
*                       - Bit_RESET: to clear the port pin
*                       - Bit_SET: to set the port pin
* Output         : None
* Return         : None
*******************************************************************************/
void LCD_CtrlLinesWrite(GPIO_TypeDef* GPIOx, u16 CtrlPins, BitAction BitVal)
{
  /* Set or Reset the control line */
  GPIO_WriteBit(GPIOx, CtrlPins, BitVal);
}

/*******************************************************************************
* Function Name  : LCD_SPIConfig
* Description    : Configures the SPI2 interface.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void LCD_SPIConfig(void)
{
  SPI_InitTypeDef    SPI_InitStructure;
  GPIO_InitTypeDef   GPIO_InitStructure;

  /* Enable GPIOB clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

  /* Enable SPI2 clock  */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);

  /* Configure SPI2 pins: NSS, SCK, MISO and MOSI */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

  /* SPI2 Config */
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  #ifdef LCD_ILI9320
    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
    SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
    SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
  #elif defined LCD_HX8312
    SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;
    SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
    SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
  #endif
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  SPI_Init(SPI2, &SPI_InitStructure);

  /* SPI2 enable */
  SPI_Cmd(SPI2, ENABLE);
}

/******************* (C) COPYRIGHT 2007 STMicroelectronics *****END OF FILE****/

出0入8汤圆

发表于 2007-11-10 23:40:37 | 显示全部楼层
下面的内容是对于的h文件



/******************** (C) COPYRIGHT 2007 STMicroelectronics ********************
* File Name          : lcd.h
* Author             : MCD Application Team
* Version            : V1.0
* Date               : 10/08/2007
* Description        : This file contains all the functions prototypes for the
*                      lcd firmware driver.
********************************************************************************
* THE PRESENT SOFTWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
* CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
*******************************************************************************/

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __LCD_H
#define __LCD_H

/* Includes ------------------------------------------------------------------*/
#include "stm32f10x_lib.h"

/* Exported types ------------------------------------------------------------*/
/* #define LCD_ILI9320 */
/* #define LCD_HX8312 */

/* Exported constants --------------------------------------------------------*/
/* LCD Registers */
#define R0             0x00
#define R1             0x01
#define R2             0x02
#define R3             0x03
#define R4             0x04
#define R5             0x05
#define R6             0x06
#define R7             0x07
#define R8             0x08
#define R9             0x09
#define R10            0x0A
#define R12            0x0C
#define R13            0x0D
#define R14            0x0E
#define R15            0x0F
#define R16            0x10
#define R17            0x11
#define R18            0x12
#define R19            0x13
#define R20            0x14
#define R21            0x15
#define R22            0x16
#define R23            0x17
#define R24            0x18
#define R25            0x19
#define R26            0x1A
#define R27            0x1B
#define R28            0x1C
#define R29            0x1D
#define R30            0x1E
#define R31            0x1F
#define R32            0x20
#define R33            0x21
#define R34            0x22
#define R36            0x24
#define R37            0x25
#define R40            0x28
#define R41            0x29
#define R43            0x2B
#define R45            0x2D
#define R48            0x30
#define R49            0x31
#define R50            0x32
#define R51            0x33
#define R52            0x34
#define R53            0x35
#define R54            0x36
#define R55            0x37
#define R56            0x38
#define R57            0x39
#define R59            0x3B
#define R60            0x3C
#define R61            0x3D
#define R62            0x3E
#define R63            0x3F
#define R64            0x40
#define R65            0x41
#define R66            0x42
#define R67            0x43
#define R68            0x44
#define R69            0x45
#define R70            0x46
#define R71            0x47
#define R72            0x48
#define R73            0x49
#define R74            0x4A
#define R75            0x4B
#define R76            0x4C
#define R77            0x4D
#define R78            0x4E
#define R79            0x4F
#define R80            0x50
#define R81            0x51
#define R82            0x52
#define R83            0x53
#define R96            0x60
#define R97            0x61
#define R106           0x6A
#define R118           0x76
#define R128           0x80
#define R129           0x81
#define R130           0x82
#define R131           0x83
#define R132           0x84
#define R133           0x85
#define R134           0x86
#define R135           0x87
#define R136           0x88
#define R137           0x89
#define R139           0x8B
#define R140           0x8C
#define R141           0x8D
#define R143           0x8F
#define R144           0x90
#define R145           0x91
#define R146           0x92
#define R147           0x93
#define R148           0x94
#define R149           0x95
#define R150           0x96
#define R151           0x97
#define R152           0x98
#define R153           0x99
#define R154           0x9A
#define R157           0x9D
#define R192           0xC0
#define R193           0xC1
#define R229           0xE5

/* LCD Control pins */
#define CtrlPin_NCS    GPIO_Pin_2   /* PB.02 */
#define CtrlPin_RS     GPIO_Pin_7   /* PD.07 */
#define CtrlPin_NWR    GPIO_Pin_15  /* PD.15 */

/* LCD color */
#define White          0xFFFF
#define Black          0x0000
#define Grey           0xF7DE
#define Blue           0x001F
#define Blue2          0x051F
#define Red            0xF800
#define Magenta        0xF81F
#define Green          0x07E0
#define Cyan           0x7FFF
#define Yellow         0xFFE0

#define Line0          0
#define Line1          24
#define Line2          48
#define Line3          72
#define Line4          96
#define Line5          120
#define Line6          144
#define Line7          168
#define Line8          192
#define Line9          216

#define Horizontal     0x00
#define Vertical       0x01

/* Exported macro ------------------------------------------------------------*/
/* Exported functions ------------------------------------------------------- */
/*----- High layer function -----*/
void STM3210B_LCD_Init(void);
void LCD_SetTextColor(vu16 Color);
void LCD_SetBackColor(vu16 Color);
void LCD_ClearLine(u8 Line);
void LCD_Clear(u16 Color);
void LCD_SetCursor(u8 Xpos, u16 Ypos);
void LCD_DrawChar(u8 Xpos, u16 Ypos, uc16 *c);
void LCD_DisplayChar(u8 Line, u16 Column, u8 Ascii);
void LCD_DisplayStringLine(u8 Line, u8 *ptr);
void LCD_SetDisplayWindow(u8 Xpos, u16 Ypos, u8 Height, u16 Width);
void LCD_WindowModeDisable(void);
void LCD_DrawLine(u8 Xpos, u16 Ypos, u16 Length, u8 Direction);
void LCD_DrawRect(u8 Xpos, u16 Ypos, u8 Height, u16 Width);
void LCD_DrawCircle(u8 Xpos, u16 Ypos, u16 Radius);
void LCD_DrawMonoPict(uc32 *Pict);
void LCD_DrawBMP(u32 BmpAddress);

/*----- Medium layer function -----*/
#ifdef LCD_ILI9320
  void LCD_nCS_StartByte(u8 Start_Byte);
  void LCD_WriteRegIndex(u8 LCD_Reg);
  void LCD_WriteReg(u8 LCD_Reg, u16 LCD_RegValue);
  void LCD_WriteRAM_Prepare(void);
  void LCD_WriteRAMWord(u16 RGB_Code);
  u16 LCD_ReadReg(u8 LCD_Reg);
#elif defined LCD_HX8312
  void LCD_WriteReg(u8 LCD_Reg, u8 LCD_RegValue);
#endif
void LCD_WriteRAM(u16 RGB_Code);
void LCD_PowerOn(void);
void LCD_DisplayOn(void);
void LCD_DisplayOff(void);

/*----- Low layer function -----*/
void LCD_CtrlLinesConfig(void);
void LCD_CtrlLinesWrite(GPIO_TypeDef* GPIOx, u16 CtrlPins, BitAction BitVal);
void LCD_SPIConfig(void);

#endif /* __LCD_H */

/******************* (C) COPYRIGHT 2007 STMicroelectronics *****END OF FILE****/

出0入0汤圆

发表于 2007-12-17 16:30:24 | 显示全部楼层
to bozai 章其波:请问这个屏的引出线是怎么接的?

出0入0汤圆

发表于 2007-12-17 17:14:31 | 显示全部楼层
bozai必出精品啊~ 有合适tft屏卖的朋友说一说啊~我也想买一块玩玩~

出0入8汤圆

发表于 2007-12-17 22:07:14 | 显示全部楼层
屏真的这么难卖吗?看来我去倒一些屏来便宜点买买是一个不错的门道啊

出0入0汤圆

发表于 2007-12-17 23:01:51 | 显示全部楼层
顶起来,让别人看看

出0入0汤圆

 楼主| 发表于 2007-12-17 23:45:59 | 显示全部楼层
又被顶起来了阿,
to 【27楼】 ajdz:
    用线引出来

苏州的朋友可以去苏州赛格看看,二楼,各种各样的屏很多的,价格还可以。

出0入0汤圆

发表于 2007-12-21 18:36:42 | 显示全部楼层
收藏,非常谢谢!!!

出0入0汤圆

发表于 2008-1-14 17:34:26 | 显示全部楼层
想要一個SPI接口的TFT LCD,不知道哪家廠商有做,知道的朋友請告之一下,多謝。
郵箱Jessica_yus126.com

出0入0汤圆

发表于 2008-1-14 17:37:48 | 显示全部楼层
30*60mm,彩色的

出0入0汤圆

发表于 2008-4-20 10:52:42 | 显示全部楼层
搞了块240X320的TFT屏 驱动IC为  HX8347  哪位兄弟用过?

出0入0汤圆

发表于 2008-4-20 11:08:12 | 显示全部楼层
波仔果然高,呵呵

出0入0汤圆

发表于 2008-4-20 17:02:01 | 显示全部楼层
搞了块240X320的TFT屏 驱动IC为  HX8347  哪位兄弟用过?

这样的屏,什么价格?

出0入0汤圆

发表于 2008-4-21 15:39:53 | 显示全部楼层
赞一个!

出0入0汤圆

发表于 2008-4-21 17:24:22 | 显示全部楼层
赞两个

出0入0汤圆

发表于 2008-4-23 23:41:14 | 显示全部楼层
----因到处乱发广告内容被删除----

出0入0汤圆

 楼主| 发表于 2008-4-23 23:45:02 | 显示全部楼层
to 【40楼】 syij
    请不要发到处乱广告!!! 谢谢!、
啊莫看到请删除其它分区的

出0入0汤圆

发表于 2008-4-24 00:03:28 | 显示全部楼层
bozai
比较强悍!好像85年的吧?

出0入0汤圆

发表于 2008-4-24 01:54:19 | 显示全部楼层
资料好,就得拿下……

出0入0汤圆

发表于 2008-5-5 21:23:17 | 显示全部楼层
今天清理存货,发现我手头的屏2.8寸的和bozai的这个一模一样。。。

出0入0汤圆

发表于 2008-5-6 12:11:43 | 显示全部楼层
点亮了,用的MEGA16 7.3728M   程序就是改了下bozai的RS那几个脚定义,霍霍


(原文件名:P1020412.JPG)


(原文件名:P1020413.JPG)

出0入0汤圆

发表于 2008-5-18 15:24:05 | 显示全部楼层
不知道用16位并口的速度快还是硬件spi的速度快?

出0入0汤圆

发表于 2008-5-18 20:02:29 | 显示全部楼层
继续做记号,呵呵

出0入0汤圆

发表于 2008-5-28 12:30:47 | 显示全部楼层
bozai 章其波:

请和我联系,QQ:12761450,有项目合作.

出0入20汤圆

发表于 2008-5-28 12:57:59 | 显示全部楼层
很漂亮

出0入0汤圆

 楼主| 发表于 2008-5-28 14:18:05 | 显示全部楼层
to 【48楼】 xuhengjun PC精机
    我发邮件给你了

出0入0汤圆

发表于 2008-5-28 20:33:39 | 显示全部楼层
不知道楼主的图片是怎样将它的二进制数据查出来的。
要是有软件的话还希望楼主赐小弟一份。
不过楼主的软件中的pgm_read_word()函数取出来的一个字是高低颠倒的。unsigned char LCD_DrawPicture2(unsigned char startX, unsigned char startY, unsigned int *pic, unsigned char sizeX, unsigned char sizeY)
  {
        unsigned int i,j,k ,l;

        if((startX+sizeX)>240 || (startY+sizeY)>320)return 1;

        for (j = 0; j<sizeY; j++)
        {
            LCD_Set_XY(startX,startY);
                LCD_Write_Start();
            for(i = 0; i<sizeX; i++)
            {   



                    k = pgm_read_word(pic++)  ;
            l= k  ;
            k = k<<8;
                        l =  l>>8;
                        k= k+l ;   
                        LCD_Write_Data(k);




            }
            startY++;//换行
          }
        LCD_Write_End();
        return 0;
  }
上边的美女还是蛮漂亮的麻!
呵呵!!
<img src=./emotion/em018.gif

出0入0汤圆

发表于 2008-6-20 15:40:19 | 显示全部楼层
那位试过读屏, 我读屏时,数据RGB数据错位,比如 0xf800(red)读出是 0x001f(blue),而且连续读的地址不递增,我用的stm32f103,


/******************************************************************************
*                                                                             *
*  LCD驱动模块                                                                *
*                                                                             *
******************************************************************************/
#include "ILI9320.h"
#include "stm32f10x_lib.h"
#include "stm32f10x_type.h"


/*********************************************************************/
//Delay 1ms
//cpu clk is 12MHZ,
//tested OK! (2005.8.9 PM)
void Delay1ms(void)
{
        u8 i;
        for(i=0;i<60;i++);

}

/*********************************************************************/
//DelayXms
//cpu clk is 12MHZ,
//tested OK! (2005.8.9 PM)
void DelayXms(unsigned long x)
{
        for(;x>0;x--)
        {
                Delay1ms();
        }

}
/*********************************************************************/
void LCD_WriteReg(u8 cmd, u16 da)
//void wr_register(uchar cmd,uint da)
{
        //write Cmd
        clr_CS;       //CS=0;
        set_RD;
        clr_A0;       //RS=0;
        GPIO_DATA_LCD->ODR=cmd;
        clr_WR;       //WR=0;
        //_nop();
        set_WR;       //WR=1;

        set_A0;       //RS=0;
        GPIO_DATA_LCD->ODR=da;
        clr_WR;       //WR=0;
        //_nop();
        set_WR;       //WR=1;
        set_CS;
}

/*********************************************************************/
void wr_register22(void)
{
        uint command;
        command=0x22;

        //write Cmd
        clr_CS;       //CS=0;
        set_RD;
        clr_A0;       //RS=0; 2008-6-20 14:11
        GPIO_DATA_LCD->ODR=command;
        clr_WR;       //WR=0;
        //_nop();
        set_WR;       //WR=1;
        set_CS;
}

/*********************************************************************/
void wr_cmd(uint Cmd)
{
        //write Cmd
        clr_CS;       //CS=0;
        set_RD;
        clr_A0;       //RS=0;  2008-6-20 14:11
        GPIO_DATA_LCD->ODR=Cmd;
        clr_WR;       //WR=0;
        //_nop();
        set_WR;       //WR=1;
        set_CS;
}
/*********************************************************************/
//Data Setting
void wr_da(uint Dat)
{
        //write Cmd
        clr_CS;       //CS=0;
        set_RD;
        set_A0;       //RS=0;
        GPIO_DATA_LCD->ODR=Dat;
        clr_WR;
        //_nop();
        set_WR;
        set_CS;
}

/*********************************************************************/
void chg_IO(u8 flg)
{
        if(flg) //input
        {
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIO_DATA_LCD, ENABLE);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIO_DATA_LCD, &GPIO_InitStructure);
        }
        else   //output
        {
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIO_DATA_LCD, ENABLE);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIO_DATA_LCD, &GPIO_InitStructure);
        }
}
void rd_da(u16 *p,u16 len)
{
        u8 i,cnt;

        //read prepare
        set_RD;
        clr_CS;
        clr_A0;
        GPIO_DATA_LCD->ODR=0x22;
        clr_WR;
        set_WR;
        set_A0;

  chg_IO(1);
        //dummy read
        clr_RD;
        for(i=150;i>0;i--){;}
        set_RD;

        //read data
        for(cnt=0;cnt<len;cnt++)
        {
                for(i=150;i>0;i--){;}

                clr_RD;
                for(i=150;i>0;i--){;}
                *(p+cnt)=GPIO_DATA_LCD->IDR;
                set_RD;
        }
    chg_IO(0);


        set_CS;
}
/*********************************************************************/
void Set_ILI9320(void)
{
        //reset
        // set_PS0;//80-system 16-bit interface BD17-10,DB8-1
        clr_RST;
        DelayXms(200);          //wait 2ms
        set_RST;
        wr_cmd(0x00E5);wr_da(0x8000);
        wr_cmd(0x0000);wr_da(0x0001);
        wr_cmd(0x0001);wr_da(0x0100);
        wr_cmd(0x0002);wr_da(0x0000);
        wr_cmd(0x0003);wr_da(0x1030);
        wr_cmd(0x0004);wr_da(0x0000);
        wr_cmd(0x0008);wr_da(0x0202);
        wr_cmd(0x0009);wr_da(0x0000);
        wr_cmd(0x000A);wr_da(0x0000);
        wr_cmd(0x000C);wr_da(0x0000);
        wr_cmd(0x000D);wr_da(0x0000);
        wr_cmd(0x000F);wr_da(0x0000);
        //-------------------Power On sequence -----------
        wr_cmd(0x0010);wr_da(0x0000);
        wr_cmd(0x0011);wr_da(0x0007);
        wr_cmd(0x0012);wr_da(0x0000);
        wr_cmd(0x0013);wr_da(0x0000);
        DelayXms(200);
        wr_cmd(0x0010);wr_da(0x17B0);
        DelayXms(50);
        wr_cmd(0x0012);wr_da(0x013e);
        DelayXms(50);
        wr_cmd(0x0013);wr_da(0x1600);
        wr_cmd(0x0029);wr_da(0x0005);
        DelayXms(50);
        wr_cmd(0x0020);wr_da(0x0000);
        wr_cmd(0x0021);wr_da(0x0000);
        //------------------ Set GRAM area ---------------
        wr_cmd(0x0050);wr_da(0x0000);
        wr_cmd(0x0051);wr_da(0x00EF);
        wr_cmd(0x0052);wr_da(0x0000);
        wr_cmd(0x0053);wr_da(0x013F);
        wr_cmd(0x0060);wr_da(0x2700);
        wr_cmd(0x0061);wr_da(0x0001);
        wr_cmd(0x006A);wr_da(0x0000);
        //-------------- Panel Control -------------------
        wr_cmd(0x0090);wr_da(0x0010);
        wr_cmd(0x0092);wr_da(0x0000);
        wr_cmd(0x0093);wr_da(0x0003);
        wr_cmd(0x0095);wr_da(0x0110);
        wr_cmd(0x0097);wr_da(0x0000);
        wr_cmd(0x0098);wr_da(0x0000);
        wr_cmd(0x0007);wr_da(0x0173);
}
/*********************************************************************/
void  ILI9320_DISPDATA(uint dis_data)
{
        clr_CS;       //CS=0;
        set_RD;
        set_A0;       //RS=1;
        GPIO_DATA_LCD->ODR=dis_data;
        clr_WR;       //WR=0;
        _nop();
        set_WR;       //WR=1;
        set_CS;

}
/*********************************************************************/
void set_cursor(uint x, uint y)
{
        wr_cmd(0x0020);wr_da(x);
        wr_cmd(0x0021);wr_da(y);
        //wr_cmd( 0x0022 );
}

/*********************************************************************/
void delay(vu32 nCount)
{
  for(; nCount != 0; nCount--);
}


/*********************************************************************/
//st的官方初始化程序
void LCD_Init2(void)
{
/* Start Initial Sequence ----------------------------------------------------*/
  LCD_WriteReg(R229, 0x8000); // Set the internal vcore voltage
  LCD_WriteReg(R0,   0x0001); // Start internal OSC.
  LCD_WriteReg(R1,   0x0100); // set SS and SM bit
  LCD_WriteReg(R2,   0x0700); // set 1 line inversion
  LCD_WriteReg(R3,   0x1030); // set GRAM write direction and BGR=1.
  LCD_WriteReg(R4,   0x0000); // Resize register

  LCD_WriteReg(R8,  0x0202); // set the back porch and front porch
  LCD_WriteReg(R9,  0x0000); // set non-display area refresh cycle ISC[3:0]
  LCD_WriteReg(R10, 0x0000); // FMARK function
  LCD_WriteReg(R12, 0x0000); // RGB interface setting
  LCD_WriteReg(R13, 0x0000); // Frame marker Position
  LCD_WriteReg(R15, 0x0000); // RGB interface polarity

/* Power On sequence ---------------------------------------------------------*/
  LCD_WriteReg(R16, 0x0000); // SAP, BT[3:0], AP, DSTB, SLP, STB
  LCD_WriteReg(R17, 0x0000); // DC1[2:0], DC0[2:0], VC[2:0]
  LCD_WriteReg(R18, 0x0000); // VREG1OUT voltage
  LCD_WriteReg(R19, 0x0000); // VDV[4:0] for VCOM amplitude
  delay(200);                // Dis-charge capacitor power voltage (200ms)
  LCD_WriteReg(R16, 0x17B0); // SAP, BT[3:0], AP, DSTB, SLP, STB
  LCD_WriteReg(R17, 0x0137); // DC1[2:0], DC0[2:0], VC[2:0]
  delay(50);                 // delay 50 ms
  LCD_WriteReg(R18, 0x0139); // VREG1OUT voltage
  delay(50);                 // delay 50 ms
  LCD_WriteReg(R19, 0x1d00); // VDV[4:0] for VCOM amplitude
  LCD_WriteReg(R41, 0x0013); // VCM[4:0] for VCOMH
  delay(50);                 // delay 50 ms
  LCD_WriteReg(R32, 0x0000); // GRAM horizontal Address
  LCD_WriteReg(R33, 0x0000); // GRAM Vertical Address

/* Adjust the Gamma Curve ----------------------------------------------------*/
  LCD_WriteReg(R48, 0x0006);
  LCD_WriteReg(R49, 0x0101);
  LCD_WriteReg(R50, 0x0003);
  LCD_WriteReg(R53, 0x0106);
  LCD_WriteReg(R54, 0x0b02);
  LCD_WriteReg(R55, 0x0302);
  LCD_WriteReg(R56, 0x0707);
  LCD_WriteReg(R57, 0x0007);
  LCD_WriteReg(R60, 0x0600);
  LCD_WriteReg(R61, 0x020b);

/* Set GRAM area -------------------------------------------------------------*/
  LCD_WriteReg(R80, 0x0000); // Horizontal GRAM Start Address
  LCD_WriteReg(R81, 0x00EF); // Horizontal GRAM End Address
  LCD_WriteReg(R82, 0x0000); // Vertical GRAM Start Address
  LCD_WriteReg(R83, 0x013F); // Vertical GRAM End Address

  LCD_WriteReg(R96,  0x2700); // Gate Scan Line
  LCD_WriteReg(R97,  0x0001); // NDL,VLE, REV
  LCD_WriteReg(R106, 0x0000); // set scrolling line

/* Partial Display Control ---------------------------------------------------*/
  LCD_WriteReg(R128, 0x0000);
  LCD_WriteReg(R129, 0x0000);
  LCD_WriteReg(R130, 0x0000);
  LCD_WriteReg(R131, 0x0000);
  LCD_WriteReg(R132, 0x0000);
  LCD_WriteReg(R133, 0x0000);

/* Panel Control -------------------------------------------------------------*/
  LCD_WriteReg(R144, 0x0010);
  LCD_WriteReg(R146, 0x0000);
  LCD_WriteReg(R147, 0x0003);
  LCD_WriteReg(R149, 0x0110);
  LCD_WriteReg(R151, 0x0000);
  LCD_WriteReg(R152, 0x0000);

  // set GRAM write direction and BGR=1
  // I/D=01 (Horizontal : increment, Vertical : decrement)
  // AM=1 (address is updated in vertical writing direction)
  //LCD_WriteReg(R3, 0x1018);
  LCD_WriteReg(0x03,0x1230);
  LCD_WriteReg(R7, 0x0173); // 262K color and display ON
}

出0入0汤圆

发表于 2008-6-20 16:08:52 | 显示全部楼层
看得俺心痒痒的...
SPI的速度真的可以吗?我看现在用这些屏的手机都是用并行线的啊.

出0入20汤圆

发表于 2008-6-20 16:23:22 | 显示全部楼层
画面不错

出0入0汤圆

发表于 2008-6-25 17:49:34 | 显示全部楼层
弱问搂主:ili9320逻辑电平是3.3,而mega32在3.3v时做大8M晶振,迷惑中。。。。

“用的是M32芯片,编译平台AVRStudio4.13+WINAVR20070525 -s优化级别,16MHz时钟频率”

出0入0汤圆

发表于 2009-1-9 10:47:22 | 显示全部楼层
准备玩tft&nbsp;lcd,标记一下

出0入0汤圆

发表于 2008-11-16 23:29:14 | 显示全部楼层
ili&nbsp;9320&nbsp;驱动的TFT&nbsp;LCD&nbsp;横竖显示任何设置?

出0入0汤圆

发表于 2008-11-11 11:20:24 | 显示全部楼层
学习

出0入0汤圆

发表于 2008-11-9 11:27:42 | 显示全部楼层
我用M16驱动了一片9320的块,用并行16BIT接口就显示OK
但是改为用8BIT接口就死活无显示。硬件连线上按SPEC上要求IM3:0接成0011,DB口用DB10-DB17,其它DB口全部接地。连线是没有问题了。
一直怀疑写的时序有问题,但同样的写寄存器的时序用在51上就可以正常点亮此屏。十分困惑,请高人指教。十分感谢!


&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PORTD&=~BIT(1);//CS=0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PORTD|=BIT(4);&nbsp;//READ=1
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PORTD&=~BIT(2);&nbsp;//RS=0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PORTB=index>>8;&nbsp;//DB_L=index>>8;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PORTD&=~BIT(3);&nbsp;//WRITE=0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Delay(1);&nbsp;//_nop_();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PORTD|=BIT(3);&nbsp;//WRITE=1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//PORTD|=BIT(1);&nbsp;//CS=1;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//PORTD|=BIT(4);&nbsp;//READ=1
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//PORTD&=~BIT(2);&nbsp;//RS=0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//PORTD&=~BIT(1);//CS=0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PORTB=index;&nbsp;//DB_L=index;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PORTD&=~BIT(3);&nbsp;//WRITE=0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Delay(1);&nbsp;//_nop_();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PORTD|=BIT(3);&nbsp;//WRITE=1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PORTD|=BIT(1);&nbsp;//CS=1;

出0入0汤圆

发表于 2008-10-27 16:03:12 | 显示全部楼层
记号

出0入0汤圆

发表于 2008-10-22 19:43:34 | 显示全部楼层
mark&nbsp;&nbsp;我也刚买了一块tft屏

出0入0汤圆

发表于 2008-9-17 14:50:59 | 显示全部楼层
我也想人做个驱动,我有一块久正320*240的24位tft屏,不过我这里做板子很不方便呀!我也想学习学习,我QQ号:67451347,E-mail:wt630@163.com,希望大家可以帮帮我呀!&nbsp;

出0入0汤圆

发表于 2009-3-28 10:46:30 | 显示全部楼层
TO:【52楼】 myjnj

    我测试连续读GRAM时,也发现地址不能自动加1。不知你的问题解决了没?还望赐教。

出0入0汤圆

发表于 2009-4-1 19:36:14 | 显示全部楼层
我也网购了一块240*320的.相同的驱劝芯片.
正在实验中......

出0入4汤圆

发表于 2009-4-19 15:08:09 | 显示全部楼层
波仔出品,必属精品。
哈哈

出0入0汤圆

发表于 2009-4-20 08:29:57 | 显示全部楼层
很好!

出0入20汤圆

发表于 2009-4-20 09:00:00 | 显示全部楼层
程序写的不错

出0入0汤圆

发表于 2009-4-24 10:06:37 | 显示全部楼层
我又块3.2寸的屏,驱动器也是ILI9320的,出现了个问题,
就是在前大约50行写数据什么都很正常,但是后面的就什么也不显示了,
请用过这款屏的高手指点
我连续按单片机复位键,偶尔会出现一次想得到的效果,
我手头有两块一模一样的屏,都这样

出0入0汤圆

发表于 2009-5-1 10:19:11 | 显示全部楼层
楼上可以重点检查一下复位时序和初始化中的几个等待时间。另外,你前50行写数据都正常是写汉字或者图片吗?我也遇到过只显示一部分图片(前几十行)的情况,但显示的图片不正常,感觉被压缩了。

出0入0汤圆

发表于 2009-6-6 23:27:33 | 显示全部楼层
谢谢楼主的程序。
我试了一下。基本可以用。
我将其搬到LPC2458上却出现些问题。
就是不能从XY:00处写数据。写的时候前面有一小部分数据没有显示出来。如果在TEST_LCD的FOR中加入延时则能减少丢失的数据。
当延时达到8000NS时则可以从XY:00处开始写。

后来改动初始化时的值及顺序就解决了。

出0入0汤圆

发表于 2009-6-16 21:31:06 | 显示全部楼层
我修改的程序,驱动液晶ILI9325不太行,楼主有时间帮我看看吗?我的QQ号:498088997

出0入0汤圆

发表于 2009-6-17 08:46:52 | 显示全部楼层
记号

出0入0汤圆

发表于 2009-7-6 14:54:25 | 显示全部楼层
请教大家,我用AVR 8位数据线方式驱动TFT彩屏。8位数据线连接 DB8~DB15,DB0~DB7接地。屏也设置为8位方式了。
使用如下写寄存器函数:

#define  LCD_Reg   (*(volatile uchar *)0XE000)   
#define  LCD_Data  (*(volatile uchar *)0XE001)  

void LCD_WR_REG(uint reg16,uint data16)
{
     uchar dataH,dataL;
     uchar regH,regL;
         
     dataH=data16/256;
     dataL=data16&0xff;
         
     regH=reg16/256;
     regL=reg16&0xff;
         
     LCD_Reg=regH;
     LCD_Reg=regL;         
     LCD_Data=dataH;
     LCD_Data=dataL;
}

初始化完毕后,读取ID寄存的,返回值是不对的,读取时使用
     LCD_Reg=0;
     LCD_Reg=0;         
         
     xx1=LCD_Data;
     xx2=LCD_Data;

请教各位,可能会是哪里出了问题。硬件连接方面已经自信检查过;

出0入0汤圆

发表于 2009-7-6 14:56:25 | 显示全部楼层
16位数据分两次发送的

出0入0汤圆

发表于 2009-7-28 17:36:14 | 显示全部楼层
MARK

出0入0汤圆

发表于 2009-8-10 12:58:51 | 显示全部楼层
兄弟,请问下看。我一个屏,用的芯片是HX8347的。它有8位。16位模式。如果我只想用8位传数据应该怎么设置呢。是硬件上设置还是在寄存器里进行设置。应该和你的屏差不多的。说说你是怎么弄的看。行不

出0入4汤圆

发表于 2009-8-10 13:13:03 | 显示全部楼层
请问LS有没有16BIT模式的程序,我的调不出来。
我看HX8347得规格书有脚设置的,但应该没有引出LCD的接线处。

出0入0汤圆

发表于 2009-8-27 21:41:09 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-8-28 00:16:04 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-10-12 08:46:32 | 显示全部楼层
我找了一个搞批发的ILI9320液晶屏+触摸+背光而且还是3.5寸屏才90元,不过是拆机件,3.0、2.8寸的80元全新的。有要的我帮大家搞几片,邮资自费.
QQ:123826409

出0入0汤圆

发表于 2009-10-12 15:18:17 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-10-29 17:05:19 | 显示全部楼层
mark!!!
请教一下各位大大~~小弟我刚刚接触ili9320不知道从那下手,想自己写个显示古诗的程序,请问有没有哪位有现成的程序?
我的邮箱emeke@126.com

出0入0汤圆

发表于 2009-10-30 00:18:52 | 显示全部楼层
这个好啊

出0入0汤圆

发表于 2009-11-22 18:34:11 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-12-5 08:56:40 | 显示全部楼层
马克思

出0入0汤圆

发表于 2009-12-5 14:37:33 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-1-3 10:41:19 | 显示全部楼层
mark TFT 9320
.

出0入0汤圆

发表于 2010-1-4 09:38:49 | 显示全部楼层
再顶次
可惜9320已经停产

出0入0汤圆

发表于 2010-1-4 10:07:54 | 显示全部楼层
章其波 我是范成涛 看到后联系我一下 cht_fan@sbl.sh.cn

出0入0汤圆

发表于 2010-1-6 10:38:41 | 显示全部楼层
回复【楼主位】bozai 章其波
-----------------------------------------------------------------------
楼主,你好!能给个联系qq吗?

出0入0汤圆

发表于 2010-1-6 10:38:56 | 显示全部楼层
回复【楼主位】bozai 章其波
-----------------------------------------------------------------------
楼主,你好!能给个联系qq吗?

出0入0汤圆

发表于 2010-1-6 13:22:14 | 显示全部楼层
顶起,酷!

出0入0汤圆

发表于 2010-1-8 22:23:51 | 显示全部楼层
mark,太好了

出0入0汤圆

发表于 2010-1-28 01:15:59 | 显示全部楼层
很好,mark

出0入0汤圆

发表于 2010-2-5 08:53:47 | 显示全部楼层
确实不错哦。。。学习中。。。。

出0入0汤圆

发表于 2010-2-5 09:30:36 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-3-4 08:31:47 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-3-25 21:30:06 | 显示全部楼层
楼主,那个SD卡程序怎么修改能用在M128上,我也有个ILI9320屏,第一个彩条程序自己搞定了,能显示,SD卡那个编译通不过,自己刚学,不知是那的问题。能不能帮帮我,WINavr 多文件怎么编译,能不能来个编译的图解过程。小弟谢谢了。

出0入0汤圆

发表于 2010-4-1 16:33:45 | 显示全部楼层
顶一下!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-6 14:58

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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