[原创] 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,莫非就是这个因素?
后来我就没用这个函数,重新写了个。
好了,如果你有这个屏就试一下吧。献丑了。 厉害! 要是有SPI接口的TFT LCD,用ST CortexM3核的STM32F103xxx的SPI接口,最快可以做到18M的速度,那显示起来才爽啊。
我要的2.8寸快到了,你要是需要预定要早点给我消息。只是价格我暂时也不是特别清楚,我全部委托朋友搞定,我只能保证会控制在200RMB以下,都是那个17点税搞的。 谢谢grant,我回了你邮件了,我要一块,spi接口的线又少。麻烦你了! 有SPI接口的TFT,我也想要个,呵呵~~ 你的效率好高哈!今天做了它的小板(6.5CM*6.5CM)的.竟用了70远,(5快),物价果然涨了!好在是和同学平分费用的~ 上面的触摸屏没用上,可惜了。
不过这次要是全部转让完了,我就没了。我买的2.8寸屏很快就到了,是用来配STM32F103R8T6,我额外加了一个EN28J60。倒时那个屏也要做转接板,那个插座麻烦,不想焊在PCB上。
to bozai
我收到你的邮件,我会多定购一块。回头我的MCU板做好了,我送你一块空PCB和主芯片,到时你也TFT也不用焊板了。 不知道楼主可否给我订购一个SPI方式的液晶呢 强帖! 顶下,呵呵 to: Grant
谢谢!
触摸屏没用上是可惜了,一个也要好几十呢。不过以后可以用上。现在没有触摸屏的控制芯片,在21ic上看到有人用avr的ad直接接的不知道性能如何。这倒可以试试。
另外看了你给的资料,那个2.8寸的把所有接口都接出来了,可以根据选择使用spi还是并行方式。看了尺寸图,那个FPC的脚距也很小,焊起来有难度阿。哈哈,等着你的板子了,多谢了!
还有,那个屏的背光不是3.2v而是12.8v,它把四个等串了起来,所以还得加个dc-dc升压电路,这个不难,你做板时要注意了。
to 7楼:
不好意思,屏是Grant的,Grant是自己定购时顺便帮我多带一块的。
PS:这个屏还是有很多脚的,但其可以工作在spi模式下的 to 【9楼】 bozai 章其波
用AVR的A/D做触摸屏性能还可以,我已经测试过了,好像在论坛里有人已经发过了,那我就在发一次我验证通过的。
点击此处下载ourdev_176169.rar(文件大小:431K)
http://cache.amobbs.com/bbs_upload782111/files_8/ourdev_176170.jpg to 【10楼】 _yu-ming :
谢谢!有空试一下。 to bozai
我已经申请了触摸屏的IC,拿到后我会送你几片,免得触摸功能浪费了。俺别的没有,就是芯片多,特别是MCU。
2.8寸的屏是支持SPI、8位、16位并行方式、YSYNC接口。上面已经说了,我暂时也不知道具体的价格。这块2.8寸屏是不带触摸屏的!
真要需要的,我可以多拿几块。不过这块屏的价格可能会高一些,因为前面的那块2.4寸的时没有开票拿的,后面的这块2.8的要含17点的税。 to Grant:
哈哈,Thanks a lot!
to 【4楼】 cddyy & 【7楼】 RENMA :
还等什么,需要的赶快联系grant哦,是捎带哦,不是卖的。晚了就没了。 呵呵,我的邮箱:cddyy@sohu.com
希望Grant能看到,对了,能发给我模块的资料么? 留个记号 to:Grant
能否也帮我多定一个SPI的屏呢
谢谢 bozai 章其波 你的触摸屏部分搞好了吗? 我把M16A/D采集触摸屏的代码已经上传了。 【17楼】 _yu-ming
谢谢!已经下了。
昨天太累了,没试,公司事也比较多。 谢谢bozai的共享,热心会员啊 :) 给我发邮件的几位,我暂时不能答复是否还有剩下的,因为有几个网友订了,但我一直没查到到账,我既然答应了他们,再等一下,下周一之后如果还没确认付款,我只能对他们放弃!到那是我才能知道还能剩下多少块,所以之前有给我发邮件的,我都没有回复。
转让这块屏我是亏了本的,只是没亏那么多罢了。所有不要指望我有很多这样的屏。
to migzan:我当初登出转让消息时,感觉被你挤兑了,就这个价格全新的屏还带触摸屏你还嫌……,我觉得和你交易不会是一件爽快的事情。为了避免你我之间不必要的误会,我只能说非常抱歉,我无法为你提供购买渠道,也许在TaoBao上你会找到更好的机会的。
to cddyy:
由于一些意外,我暂时还不能发给你2.8寸的全部资料。
to bozai:
出了一点意外,今天早上朋友打电话过来,如果2.8寸的含税的话,价格有点高了快接近我的目标。我之前已经订了10pcs,是用在我自己的系统中的,没有多出的数量。我打算叫我朋友在帮我找找有没有可以不用加税的2.8寸或3.2寸屏,当然也要是能支持SPI接口的,要是找不到合适的,就只能再追加定购了。如果有什么消息我再邮件告知你。
哦,对了你对宽屏介不介意?听说现在的2.8和3.2流行宽屏啊?模块的具体尺寸我也不是特别清楚,在等提供数据手册。 to Grant:
无所谓的,都可以。
另外如果找不到合适的,追加订购又比较麻烦的话,那个屏我想就不要找了吧,已经很麻烦你了,呵呵。 to Grant:
等您在这里发消息 to:【20楼】 Grant
你的做事原则我喜欢,你那么想我也不想说什么,一件小事也不想多说了
有论坛这个好氛围,这个好地方,贴点路费我想你也不怎么在乎,没觉得亏了
我曾经帮助过论坛几个哥们在北京中发买芯片,有的没货我去定货,前后跑了几次,不说那点车费,光时间就耽误不少了,不图一点利益,就只因为是论坛的朋友,有共同的爱好。
影响你转让了,说声抱歉,并不是存心或者恶意,事情就此OVER吧,Grant你也不用回我帖了 2.8的屏到了没有??
想要一块!!!
最好能带STM32F103R8T6的板子!!!
有的话发我条短信:13586540855 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****/ 下面的内容是对于的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****/ to bozai 章其波:请问这个屏的引出线是怎么接的? bozai必出精品啊~ 有合适tft屏卖的朋友说一说啊~我也想买一块玩玩~./emotion/em012.gif 屏真的这么难卖吗?看来我去倒一些屏来便宜点买买是一个不错的门道啊 顶起来,让别人看看 又被顶起来了阿,
to 【27楼】 ajdz:
用线引出来
苏州的朋友可以去苏州赛格看看,二楼,各种各样的屏很多的,价格还可以。 收藏,非常谢谢!!! 想要一個SPI接口的TFT LCD,不知道哪家廠商有做,知道的朋友請告之一下,多謝。
郵箱Jessica_yus126.com 30*60mm,彩色的 搞了块240X320的TFT屏 驱动IC为HX8347哪位兄弟用过? 波仔果然高,呵呵 搞了块240X320的TFT屏 驱动IC为HX8347哪位兄弟用过?
这样的屏,什么价格? 赞一个! 赞两个 ----因到处乱发广告内容被删除---- to 【40楼】 syij
请不要发到处乱广告!!! 谢谢!、
啊莫看到请删除其它分区的 bozai
比较强悍!好像85年的吧? 资料好,就得拿下…… 今天清理存货,发现我手头的屏2.8寸的和bozai的这个一模一样。。。 点亮了,用的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) 不知道用16位并口的速度快还是硬件spi的速度快? 继续做记号,呵呵 bozai 章其波:
请和我联系,QQ:12761450,有项目合作. 很漂亮 to 【48楼】 xuhengjun PC精机
我发邮件给你了 不知道楼主的图片是怎样将它的二进制数据查出来的。
要是有软件的话还希望楼主赐小弟一份。
不过楼主的软件中的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 那位试过读屏, 我读屏时,数据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
} 看得俺心痒痒的...
SPI的速度真的可以吗?我看现在用这些屏的手机都是用并行线的啊. 画面不错 弱问搂主:ili9320逻辑电平是3.3,而mega32在3.3v时做大8M晶振,迷惑中。。。。
“用的是M32芯片,编译平台AVRStudio4.13+WINAVR20070525 -s优化级别,16MHz时钟频率” 准备玩tft lcd,标记一下 ili 9320 驱动的TFT LCD 横竖显示任何设置? 学习 我用M16驱动了一片9320的块,用并行16BIT接口就显示OK
但是改为用8BIT接口就死活无显示。硬件连线上按SPEC上要求IM3:0接成0011,DB口用DB10-DB17,其它DB口全部接地。连线是没有问题了。
一直怀疑写的时序有问题,但同样的写寄存器的时序用在51上就可以正常点亮此屏。十分困惑,请高人指教。十分感谢!
PORTD&=~BIT(1);//CS=0;
PORTD|=BIT(4); //READ=1
PORTD&=~BIT(2); //RS=0;
PORTB=index>>8; //DB_L=index>>8;
PORTD&=~BIT(3); //WRITE=0;
//Delay(1); //_nop_();
PORTD|=BIT(3); //WRITE=1;
//PORTD|=BIT(1); //CS=1;
//PORTD|=BIT(4); //READ=1
//PORTD&=~BIT(2); //RS=0;
//PORTD&=~BIT(1);//CS=0;
PORTB=index; //DB_L=index;
PORTD&=~BIT(3); //WRITE=0;
//Delay(1); //_nop_();
PORTD|=BIT(3); //WRITE=1;
PORTD|=BIT(1); //CS=1; 记号 mark 我也刚买了一块tft屏 我也想人做个驱动,我有一块久正320*240的24位tft屏,不过我这里做板子很不方便呀!我也想学习学习,我QQ号:67451347,E-mail:wt630@163.com,希望大家可以帮帮我呀! TO:【52楼】 myjnj
我测试连续读GRAM时,也发现地址不能自动加1。不知你的问题解决了没?还望赐教。 我也网购了一块240*320的.相同的驱劝芯片.
正在实验中...... 波仔出品,必属精品。
哈哈 很好! 程序写的不错 我又块3.2寸的屏,驱动器也是ILI9320的,出现了个问题,
就是在前大约50行写数据什么都很正常,但是后面的就什么也不显示了,
请用过这款屏的高手指点
我连续按单片机复位键,偶尔会出现一次想得到的效果,
我手头有两块一模一样的屏,都这样 楼上可以重点检查一下复位时序和初始化中的几个等待时间。另外,你前50行写数据都正常是写汉字或者图片吗?我也遇到过只显示一部分图片(前几十行)的情况,但显示的图片不正常,感觉被压缩了。 谢谢楼主的程序。
我试了一下。基本可以用。
我将其搬到LPC2458上却出现些问题。
就是不能从XY:00处写数据。写的时候前面有一小部分数据没有显示出来。如果在TEST_LCD的FOR中加入延时则能减少丢失的数据。
当延时达到8000NS时则可以从XY:00处开始写。
后来改动初始化时的值及顺序就解决了。 我修改的程序,驱动液晶ILI9325不太行,楼主有时间帮我看看吗?我的QQ号:498088997 记号 请教大家,我用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;
请教各位,可能会是哪里出了问题。硬件连接方面已经自信检查过; 16位数据分两次发送的 MARK 兄弟,请问下看。我一个屏,用的芯片是HX8347的。它有8位。16位模式。如果我只想用8位传数据应该怎么设置呢。是硬件上设置还是在寄存器里进行设置。应该和你的屏差不多的。说说你是怎么弄的看。行不 请问LS有没有16BIT模式的程序,我的调不出来。
我看HX8347得规格书有脚设置的,但应该没有引出LCD的接线处。 mark mark 我找了一个搞批发的ILI9320液晶屏+触摸+背光而且还是3.5寸屏才90元,不过是拆机件,3.0、2.8寸的80元全新的。有要的我帮大家搞几片,邮资自费.
QQ:123826409 mark mark!!!
请教一下各位大大~~小弟我刚刚接触ili9320不知道从那下手,想自己写个显示古诗的程序,请问有没有哪位有现成的程序?
我的邮箱emeke@126.com 这个好啊 mark 马克思 mark mark TFT 9320
. 再顶次
可惜9320已经停产 章其波 我是范成涛 看到后联系我一下 cht_fan@sbl.sh.cn 回复【楼主位】bozai 章其波
-----------------------------------------------------------------------
楼主,你好!能给个联系qq吗? 回复【楼主位】bozai 章其波
-----------------------------------------------------------------------
楼主,你好!能给个联系qq吗? 顶起,酷! mark,太好了 很好,mark 确实不错哦。。。学习中。。。。 mark mark 楼主,那个SD卡程序怎么修改能用在M128上,我也有个ILI9320屏,第一个彩条程序自己搞定了,能显示,SD卡那个编译通不过,自己刚学,不知是那的问题。能不能帮帮我,WINavr 多文件怎么编译,能不能来个编译的图解过程。小弟谢谢了。 顶一下!
页:
[1]
2