bozai 发表于 2007-10-11 09:57:08

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

大家好:
    经过两个晚上的努力,终于用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拍的,不清楚)
http://cache.amobbs.com/bbs_upload782111/files_8/ourdev_176131.jpg


程序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)

这是我用的板子:
http://cache.amobbs.com/bbs_upload782111/files_8/ourdev_176134.jpg


效果图:(苦于没有相机啊,拍的效果就...)
http://cache.amobbs.com/bbs_upload782111/files_8/ourdev_176135.jpg
http://cache.amobbs.com/bbs_upload782111/files_8/ourdev_176136.jpg
http://cache.amobbs.com/bbs_upload782111/files_8/ourdev_176137.jpg
http://cache.amobbs.com/bbs_upload782111/files_8/ourdev_176138.jpg



程序的说明:

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

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

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

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

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

1181zjf 发表于 2007-10-11 10:10:38

厉害!

Grant 发表于 2007-10-11 11:09:16

要是有SPI接口的TFT LCD,用ST CortexM3核的STM32F103xxx的SPI接口,最快可以做到18M的速度,那显示起来才爽啊。

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

bozai 发表于 2007-10-11 12:14:03

谢谢grant,我回了你邮件了,我要一块,spi接口的线又少。麻烦你了!

cddyy 发表于 2007-10-11 12:43:48

有SPI接口的TFT,我也想要个,呵呵~~

ppa2001 发表于 2007-10-11 13:54:16

你的效率好高哈!今天做了它的小板(6.5CM*6.5CM)的.竟用了70远,(5快),物价果然涨了!好在是和同学平分费用的~

Grant 发表于 2007-10-11 15:26:59

上面的触摸屏没用上,可惜了。

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

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

RENMA 发表于 2007-10-11 15:33:22

不知道楼主可否给我订购一个SPI方式的液晶呢

benladn911 发表于 2007-10-11 15:46:30

强帖! 顶下,呵呵

bozai 发表于 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模式下的

_yuming 发表于 2007-10-11 15:58:35

to 【9楼】 bozai 章其波
用AVR的A/D做触摸屏性能还可以,我已经测试过了,好像在论坛里有人已经发过了,那我就在发一次我验证通过的。

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


http://cache.amobbs.com/bbs_upload782111/files_8/ourdev_176170.jpg

bozai 发表于 2007-10-11 15:59:56

to 【10楼】 _yu-ming :
    谢谢!有空试一下。

Grant 发表于 2007-10-11 16:20:54

to bozai

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

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

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

bozai 发表于 2007-10-11 16:29:30

to Grant:
   哈哈,Thanks a lot!

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

cddyy 发表于 2007-10-11 20:28:56

呵呵,我的邮箱:cddyy@sohu.com
希望Grant能看到,对了,能发给我模块的资料么?

myjnj 发表于 2007-10-11 20:53:06

留个记号

migzan 发表于 2007-10-12 10:49:34

to:Grant

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

谢谢

_yuming 发表于 2007-10-12 16:58:01

bozai 章其波    你的触摸屏部分搞好了吗? 我把M16A/D采集触摸屏的代码已经上传了。

bozai 发表于 2007-10-12 18:07:42

【17楼】 _yu-ming
谢谢!已经下了。
昨天太累了,没试,公司事也比较多。

armok 发表于 2007-10-12 18:59:43

谢谢bozai的共享,热心会员啊 :)

Grant 发表于 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流行宽屏啊?模块的具体尺寸我也不是特别清楚,在等提供数据手册。

bozai 发表于 2007-10-13 08:56:43

to Grant:
   无所谓的,都可以。
另外如果找不到合适的,追加订购又比较麻烦的话,那个屏我想就不要找了吧,已经很麻烦你了,呵呵。

cddyy 发表于 2007-10-13 09:01:24

to Grant:
等您在这里发消息

migzan 发表于 2007-10-13 11:29:59

to:【20楼】 Grant
你的做事原则我喜欢,你那么想我也不想说什么,一件小事也不想多说了

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

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

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

tsb0574 发表于 2007-10-22 22:43:40

2.8的屏到了没有??
想要一块!!!
最好能带STM32F103R8T6的板子!!!
有的话发我条短信:13586540855

Grant 发表于 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_BYTE0x70
#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 */
staticvu16 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 */
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, AP, DSTB, SLP, STB */
LCD_WriteReg(R17, 0x0000); /* DC1, DC0, VC */
LCD_WriteReg(R18, 0x0000); /* VREG1OUT voltage */
LCD_WriteReg(R19, 0x0000); /* VDV for VCOM amplitude */
Delay(20);               /* Dis-charge capacitor power voltage (200ms) */
LCD_WriteReg(R16, 0x17B0); /* SAP, BT, AP, DSTB, SLP, STB */
LCD_WriteReg(R17, 0x0137); /* DC1, DC0, VC */
Delay(5);                  /* Delay 50 ms */
LCD_WriteReg(R18, 0x0139); /* VREG1OUT voltage */
Delay(5);                  /* Delay 50 ms */
LCD_WriteReg(R19, 0x1d00); /* VDV for VCOM amplitude */
LCD_WriteReg(R41, 0x0013); /* VCM 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 & (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);
}

/*******************************************************************************
* 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)
{
s32D;/* Decision Variable */
u32CurX;/* Current X Value */
u32CurY;/* 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 & (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, AP, DSTB, SLP, STB */
LCD_WriteReg(R17, 0x0000); /* DC1, DC0, VC */
LCD_WriteReg(R18, 0x0000); /* VREG1OUT voltage */
LCD_WriteReg(R19, 0x0000); /* VDV for VCOM amplitude */
Delay(20);               /* Dis-charge capacitor power voltage (200ms) */
LCD_WriteReg(R16, 0x17B0); /* SAP, BT, AP, DSTB, SLP, STB */
LCD_WriteReg(R17, 0x0137); /* DC1, DC0, VC */
Delay(5);                  /* Delay 50 ms */
LCD_WriteReg(R18, 0x0139); /* VREG1OUT voltage */
Delay(5);                  /* delay 50 ms */
LCD_WriteReg(R19, 0x1d00); /* VDV for VCOM amplitude */
LCD_WriteReg(R41, 0x0013); /* VCM 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****/

Grant 发表于 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****/

ajdz 发表于 2007-12-17 16:30:24

to bozai 章其波:请问这个屏的引出线是怎么接的?

soulmate 发表于 2007-12-17 17:14:31

bozai必出精品啊~ 有合适tft屏卖的朋友说一说啊~我也想买一块玩玩~./emotion/em012.gif

Grant 发表于 2007-12-17 22:07:14

屏真的这么难卖吗?看来我去倒一些屏来便宜点买买是一个不错的门道啊

chuanhuibh 发表于 2007-12-17 23:01:51

顶起来,让别人看看

bozai 发表于 2007-12-17 23:45:59

又被顶起来了阿,
to 【27楼】 ajdz:
    用线引出来

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

oywwen 发表于 2007-12-21 18:36:42

收藏,非常谢谢!!!

Jessica_yu 发表于 2008-1-14 17:34:26

想要一個SPI接口的TFT LCD,不知道哪家廠商有做,知道的朋友請告之一下,多謝。
郵箱Jessica_yus126.com

Jessica_yu 发表于 2008-1-14 17:37:48

30*60mm,彩色的

hjian508 发表于 2008-4-20 10:52:42

搞了块240X320的TFT屏 驱动IC为HX8347哪位兄弟用过?

sharkbing 发表于 2008-4-20 11:08:12

波仔果然高,呵呵

ywl0409 发表于 2008-4-20 17:02:01

搞了块240X320的TFT屏 驱动IC为HX8347哪位兄弟用过?

这样的屏,什么价格?

wtliu 发表于 2008-4-21 15:39:53

赞一个!

plantniu 发表于 2008-4-21 17:24:22

赞两个

syij 发表于 2008-4-23 23:41:14

----因到处乱发广告内容被删除----

bozai 发表于 2008-4-23 23:45:02

to 【40楼】 syij
    请不要发到处乱广告!!! 谢谢!、
啊莫看到请删除其它分区的

xingzhang 发表于 2008-4-24 00:03:28

bozai
比较强悍!好像85年的吧?

weiwgml 发表于 2008-4-24 01:54:19

资料好,就得拿下……

fugeone 发表于 2008-5-5 21:23:17

今天清理存货,发现我手头的屏2.8寸的和bozai的这个一模一样。。。

fugeone 发表于 2008-5-6 12:11:43

点亮了,用的MEGA16 7.3728M   程序就是改了下bozai的RS那几个脚定义,霍霍

http://cache.amobbs.com/bbs_upload782111/files_10/ourdev_267222.JPG
(原文件名:P1020412.JPG)

http://cache.amobbs.com/bbs_upload782111/files_10/ourdev_267223.JPG
(原文件名:P1020413.JPG)

haerbintcl 发表于 2008-5-18 15:24:05

不知道用16位并口的速度快还是硬件spi的速度快?

aysyjgw 发表于 2008-5-18 20:02:29

继续做记号,呵呵

Hjoan 发表于 2008-5-28 12:30:47

bozai 章其波:

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

wenming 发表于 2008-5-28 12:57:59

很漂亮

bozai 发表于 2008-5-28 14:18:05

to 【48楼】 xuhengjun PC精机
    我发邮件给你了

XUEPENGBIN 发表于 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

myjnj 发表于 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);
}
/*********************************************************************/
voidILI9320_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
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, AP, DSTB, SLP, STB
LCD_WriteReg(R17, 0x0000); // DC1, DC0, VC
LCD_WriteReg(R18, 0x0000); // VREG1OUT voltage
LCD_WriteReg(R19, 0x0000); // VDV for VCOM amplitude
delay(200);                // Dis-charge capacitor power voltage (200ms)
LCD_WriteReg(R16, 0x17B0); // SAP, BT, AP, DSTB, SLP, STB
LCD_WriteReg(R17, 0x0137); // DC1, DC0, VC
delay(50);               // delay 50 ms
LCD_WriteReg(R18, 0x0139); // VREG1OUT voltage
delay(50);               // delay 50 ms
LCD_WriteReg(R19, 0x1d00); // VDV for VCOM amplitude
LCD_WriteReg(R41, 0x0013); // VCM 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
}

zcdyyu 发表于 2008-6-20 16:08:52

看得俺心痒痒的...
SPI的速度真的可以吗?我看现在用这些屏的手机都是用并行线的啊.

wenming 发表于 2008-6-20 16:23:22

画面不错

wanwtju 发表于 2008-6-25 17:49:34

弱问搂主:ili9320逻辑电平是3.3,而mega32在3.3v时做大8M晶振,迷惑中。。。。

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

yyldsp 发表于 2009-1-9 10:47:22

准备玩tft&nbsp;lcd,标记一下

zhou__mi 发表于 2008-11-16 23:29:14

ili&nbsp;9320&nbsp;驱动的TFT&nbsp;LCD&nbsp;横竖显示任何设置?

spy2008 发表于 2008-11-11 11:20:24

学习

Jerry_power 发表于 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;

fujinggui 发表于 2008-10-27 16:03:12

记号

rainbowu 发表于 2008-10-22 19:43:34

mark&nbsp;&nbsp;我也刚买了一块tft屏

wt630 发表于 2008-9-17 14:50:59

我也想人做个驱动,我有一块久正320*240的24位tft屏,不过我这里做板子很不方便呀!我也想学习学习,我QQ号:67451347,E-mail:wt630@163.com,希望大家可以帮帮我呀!&nbsp;

shdzbsl 发表于 2009-3-28 10:46:30

TO:【52楼】 myjnj

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

49707555 发表于 2009-4-1 19:36:14

我也网购了一块240*320的.相同的驱劝芯片.
正在实验中......

bbandpp 发表于 2009-4-19 15:08:09

波仔出品,必属精品。
哈哈

xiaowei0588 发表于 2009-4-20 08:29:57

很好!

wenming 发表于 2009-4-20 09:00:00

程序写的不错

ZYXWVU 发表于 2009-4-24 10:06:37

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

shdzbsl 发表于 2009-5-1 10:19:11

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

markliang 发表于 2009-6-6 23:27:33

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

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

lxqchuang 发表于 2009-6-16 21:31:06

我修改的程序,驱动液晶ILI9325不太行,楼主有时间帮我看看吗?我的QQ号:498088997

chinamanzhong 发表于 2009-6-17 08:46:52

记号

51FLY 发表于 2009-7-6 14:54:25

请教大家,我用AVR 8位数据线方式驱动TFT彩屏。8位数据线连接 DB8~DB15,DB0~DB7接地。屏也设置为8位方式了。
使用如下写寄存器函数:

#defineLCD_Reg   (*(volatile uchar *)0XE000)   
#defineLCD_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;

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

51FLY 发表于 2009-7-6 14:56:25

16位数据分两次发送的

xiaokangkang 发表于 2009-7-28 17:36:14

MARK

mcu_mouse 发表于 2009-8-10 12:58:51

兄弟,请问下看。我一个屏,用的芯片是HX8347的。它有8位。16位模式。如果我只想用8位传数据应该怎么设置呢。是硬件上设置还是在寄存器里进行设置。应该和你的屏差不多的。说说你是怎么弄的看。行不

lwy86 发表于 2009-8-10 13:13:03

请问LS有没有16BIT模式的程序,我的调不出来。
我看HX8347得规格书有脚设置的,但应该没有引出LCD的接线处。

iisi 发表于 2009-8-27 21:41:09

mark

fy024 发表于 2009-8-28 00:16:04

mark

zhouxinjie1 发表于 2009-10-12 08:46:32

我找了一个搞批发的ILI9320液晶屏+触摸+背光而且还是3.5寸屏才90元,不过是拆机件,3.0、2.8寸的80元全新的。有要的我帮大家搞几片,邮资自费.
QQ:123826409

yest 发表于 2009-10-12 15:18:17

mark

emeke 发表于 2009-10-29 17:05:19

mark!!!
请教一下各位大大~~小弟我刚刚接触ili9320不知道从那下手,想自己写个显示古诗的程序,请问有没有哪位有现成的程序?
我的邮箱emeke@126.com

guochengqiang 发表于 2009-10-30 00:18:52

这个好啊

wu628 发表于 2009-11-22 18:34:11

mark

xflqsw 发表于 2009-12-5 08:56:40

马克思

gxy508 发表于 2009-12-5 14:37:33

mark

sym2008 发表于 2010-1-3 10:41:19

mark TFT 9320
.

aysyjgw 发表于 2010-1-4 09:38:49

再顶次
可惜9320已经停产

cht_fan 发表于 2010-1-4 10:07:54

章其波 我是范成涛 看到后联系我一下 cht_fan@sbl.sh.cn

jiatingyun 发表于 2010-1-6 10:38:41

回复【楼主位】bozai 章其波
-----------------------------------------------------------------------
楼主,你好!能给个联系qq吗?

jiatingyun 发表于 2010-1-6 10:38:56

回复【楼主位】bozai 章其波
-----------------------------------------------------------------------
楼主,你好!能给个联系qq吗?

guozhiyuan 发表于 2010-1-6 13:22:14

顶起,酷!

zengyi703 发表于 2010-1-8 22:23:51

mark,太好了

moon0213 发表于 2010-1-28 01:15:59

很好,mark

mique 发表于 2010-2-5 08:53:47

确实不错哦。。。学习中。。。。

wugaohui04 发表于 2010-2-5 09:30:36

mark

wenpeijun 发表于 2010-3-4 08:31:47

mark

jydz 发表于 2010-3-25 21:30:06

楼主,那个SD卡程序怎么修改能用在M128上,我也有个ILI9320屏,第一个彩条程序自己搞定了,能显示,SD卡那个编译通不过,自己刚学,不知是那的问题。能不能帮帮我,WINavr 多文件怎么编译,能不能来个编译的图解过程。小弟谢谢了。

thinki 发表于 2010-4-1 16:33:45

顶一下!
页: [1] 2
查看完整版本: [原创] FL032-C0 240*320 TFT LCD的AVR驱动程序,LCD控制芯片ILI9320 并行16bit模式