“3.2inch 320x240 Touch LCD (C)”的版本间的差异
Waveshare-admin(讨论 | 贡献) 小 (替换文字 - 「</div> <div class="tabbertab" title="FAQ">」替换为「 {|style="width:auto" | {|class="bd-white at-c" style="table-layout:fixed;border-radius:100px;width:100%;border:2px solid #{{{bordercolor}}}" |- |class="bg-Joinus roundy-100 " styl) |
小 (文本替换 - 替换“<h1>技术支持</h1>”为“=售后=”) |
||
(未显示5个用户的25个中间版本) | |||
第1行: | 第1行: | ||
+ | <!--<div class="tabberlive newwsnav" id="wsnavbar"> | ||
+ | <ul class="tabbernav"> | ||
+ | <li class="nav-link">[[#myintro|说明]]</li> | ||
+ | <li class="nav-link">[[#myresources|资料]]</li> | ||
+ | <li class="nav-link">[[#myfaq|FAQ]]</li> | ||
+ | <li class="nav-link">[[#mysupport|售后]]</li> | ||
+ | </ul> | ||
+ | </div>--> | ||
<div class="tabber"> | <div class="tabber"> | ||
− | |||
− | |||
{{外围模块|colorscheme=blue | {{外围模块|colorscheme=blue | ||
|name = 3.2inch 320x240 Touch LCD (C) | |name = 3.2inch 320x240 Touch LCD (C) | ||
− | |img=[[File:3.2inch-320x240-Touch-LCD-C-1.jpg|360px |alt=3.2inch-320x240-Touch-LCD-C|link= | + | |img=[[File:3.2inch-320x240-Touch-LCD-C-1.jpg|360px |alt=3.2inch-320x240-Touch-LCD-C|link=https://{{SERVERNAME}}/shop/3.2inch-320x240-Touch-LCD-C.htm | 3.2inch 320x240 Touch LCD (C)]] |
|category1=通用彩色LCD | |category1=通用彩色LCD | ||
|category2=显示屏 | |category2=显示屏 | ||
第19行: | 第25行: | ||
| interface3 = 8080 | | interface3 = 8080 | ||
}} | }} | ||
+ | <div class="tabbertab" title="说明" id="myintro"> | ||
+ | =说明= | ||
+ | ==1. 硬件资源== | ||
+ | ===1.1 ILI9325=== | ||
+ | *ILI9325是一个240x320(RGB)分辨率、262144色的TFT 液晶显示屏的驱动芯片;172820 (240 x 320x 18/8) 字节的RAM。每个像素点深度可以达到18 位。 | ||
+ | *ILI9325有以下几种数据接口模式: | ||
+ | 1) i80-system MPU 接口(8-/9-/16-/18-bit bus width) | ||
+ | |||
+ | 2) VSYNC 接口(system interface + VSYNC, internal clock, DB[17:0]) | ||
+ | |||
+ | 3) serial data transfer 接口(SPI) | ||
+ | |||
+ | 4) RGB 6-/16-/18-bit 接口(DOTCLK, VSYNC, HSYNC, ENABLE, DB[17:0]). | ||
+ | |||
+ | 此屏的ILI9325的18位RGB赋值与 LCD GRAM的对应关系如图所示: | ||
+ | [[File:3.2inch 320x240 Touch LCD (C)-1.png|800px]]<br /> | ||
+ | 从图中可以看出,ILI9325 在16 位模式下面,GRAM Data有用的是:D17~D10 和 D8~D1, D9和 D0 没有用到,实际上在我们 LCD 模块里面, ILI9341 的 D9 和 D0没有引出,ILI9325 的 D17~D10 和 D8~D1对应 MCU 的 D15~D0。MCU 的 16 位数据,最低 5 位代表蓝色,中间 6 位为绿色,最高 5 位为红色;数值越大,表示该颜色越深。<br /> | ||
+ | ====重要寄存器介绍==== | ||
+ | 寄存器详细介绍请参阅 ILI9325的 datasheet。这里只介绍一些重要的寄存器设置:<br /> | ||
+ | '''输入设置(R03h):'''<br /> | ||
+ | [[File:3.2inch 320x240 Touch LCD (C)-2.png|800px]]<br /> | ||
+ | AM:控制GRAM的更新方向 | ||
+ | *当 AM=0 地址在水平写入方向得以更新 | ||
+ | *当 AM=1 地址在垂直写入方向得以更新 | ||
+ | I/D[1:0]: 当更新一个像素数据时, I/D[1:0]位控制地址计数器(AC)自动增加或者减少 1。详细请见下图:<br /> | ||
+ | [[File:3.2inch 320x240 Touch LCD (C)-3.jpg|800px]]<br /> | ||
+ | ORG :当窗口地址区域产生后,原点地址的移动根据 ID的设定。当使用高速写 RAM 模式写数据到窗口地址区域这个功能被使能。 | ||
+ | *ORG=0 :原点地址不会移动,在这种情况下,在窗口地址区域根据 GRAM 的地址映射指定一个地址开始写操作。 | ||
+ | *ORG=1 :原始地址为“00000h” 根据 ID[1 :0]的 设定来移动。 | ||
+ | |||
+ | BGR : 根据被写入的数据交换 R 和 B 的顺序<br /> | ||
+ | *BGR=0 :根据 RGB 的顺序写入像素数据 | ||
+ | *BGR=1 :交换 RGB 数据为 BGR 写到 GRAM | ||
+ | |||
+ | '''GRAM 水平垂直变址设置(R20h, R21h)''' | ||
+ | 水平位置寄存器变址 0x20 垂直变址寄存器变址 0x21 GRAM Horizontal/Vertical Address Set (R20h, R21h)<br /> | ||
+ | [[File:3.2inch 320x240 Touch LCD (C)-4.png|800px]]<br /> | ||
+ | AD[16:0]:用于设置变址计数器(AC)的初始化数值。当数据写入内部的 GARM 中时,变址计数器(AC)会根据 AM 和 I/D 位的设置来自动的更新其数值。当从内部 GRAM 中读数据时变址计数器不会自动更新。 | ||
+ | [[File:3.2inch 320x240 Touch LCD (C)-5.png|800px]]<br /> | ||
+ | [[File:3.2inch 320x240 Touch LCD (C)-6.png|800px]]<br /> | ||
+ | '''写数据到 GRAM (R22h)''' | ||
+ | [[File:3.2inch 320x240 Touch LCD (C)-7.png|800px]]<br /> | ||
+ | 该寄存器是 GRAM 的访问端口,当通过这个寄存器更新显示数据的时候,地址计数器会自动增加或者减少。<br /> | ||
+ | '''GRAM 地址映射和读/写''' | ||
+ | ILI9325 有一个容量为 172800 bytes的内部图片RAM (GRAM),用来存储显示数据。一像素由十八位数据构成, GRAM可以通过 i80系统接口,SPI 或者是 RGB 接口来访问,以下是 GRAM 在 i80 系统接口下读写的时序“<br /> | ||
+ | [[File:3.2inch 320x240 Touch LCD (C)-8.png|800px]]<br /> | ||
+ | [[File:3.2inch 320x240 Touch LCD (C)-9.png|800px]]<br /> | ||
+ | |||
+ | ===1.2 XPT2046=== | ||
+ | *XPT2046 是一款 4 线制电阻式触摸屏控制器,内含 12 位分辨率 125KHz 转换速率逐步逼近型 A/D 转换器。 | ||
+ | *XPT2046 支持从 1.5V 到 5.25V 的低电压 I/O 接口。 | ||
+ | *XPT2046 能通过执行两次 A/D 转换查出被按的屏幕位置,除此之外,还可以测量加在触摸屏上的压力。内部自带 2.5V 参考电压,可以作为辅助输入、温度测量和电池监测之用,电池监测的电压范围可以从 0V 到 5V。 | ||
+ | *XPT2046 片内集成有一个温度传感器。在 2.7V 的典型工作状态下,关闭参考电压,功耗可小于 0.75mW。XPT2046 采用微小的封装形式:TSSOP-16,QFN-16 和 VFBGA-48。 工作温度范围为-40℃~+85℃。与 ADS7846、TSC2046、AK4182A 完全兼容。 | ||
+ | |||
+ | ==2. 硬件说明== | ||
+ | |||
+ | {|border=2; style="width:800px;" | ||
+ | |-style="background:#eeeeff; color:black;" align="center" | ||
+ | |引脚号||标识||描述||功能 | ||
+ | |-align="center" | ||
+ | |1||5V||5V电源||当5V供电时(1,2脚接5V电源),3.3V端(33,34脚输出3.3V电压) | ||
+ | |-align="center" | ||
+ | |2||GND||接地||GND | ||
+ | |-align="center" | ||
+ | |3||D0||rowspan=16|数据线||rowspan=16|D0-D15 | ||
+ | |-align="center" | ||
+ | |4|| D1 | ||
+ | |-align="center" | ||
+ | |5|| D2 | ||
+ | |-align="center" | ||
+ | |6|| D3 | ||
+ | |-align="center" | ||
+ | |7|| D4 | ||
+ | |-align="center" | ||
+ | |8|| D5 | ||
+ | |-align="center" | ||
+ | |9|| D6 | ||
+ | |-align="center" | ||
+ | |10|| D7 | ||
+ | |-align="center" | ||
+ | |11|| D8 | ||
+ | |-align="center" | ||
+ | |12|| D9 | ||
+ | |-align="center" | ||
+ | |13|| D10 | ||
+ | |-align="center" | ||
+ | |14|| D11 | ||
+ | |-align="center" | ||
+ | |15|| D12 | ||
+ | |-align="center" | ||
+ | |16|| D13 | ||
+ | |-align="center" | ||
+ | |17|| D14 | ||
+ | |-align="center" | ||
+ | |18|| D15 | ||
+ | |-align="center" | ||
+ | |19|| CS|| LCD片选信号|| 低电平选择LCD | ||
+ | |-align="center" | ||
+ | |20|| RS|| 指令/数据 寄存器选择|| RS = 0:指令寄存器<br />RS = 1:数据寄存器 | ||
+ | |-align="center" | ||
+ | |21|| WR|| 写动作||WR = 0,RD = 1 | ||
+ | |-align="center" | ||
+ | |22|| RD|| 读动作|| WR = 1,RD = 0 | ||
+ | |-align="center" | ||
+ | |23|| RESET|| 芯片重启|| 低电平重启芯片 | ||
+ | |-align="center" | ||
+ | |24|| NC|| || | ||
+ | |-align="center" | ||
+ | |25|| BLVCC||5V或3.3V|| 背光灯VCC | ||
+ | |-align="center" | ||
+ | |26|| BLGND|| 接地 ||背光灯GND | ||
+ | |-align="center" | ||
+ | |27|| BLCNT|| 背光灯亮度调节||可以使用PWM来控制背光灯亮度 | ||
+ | |-align="center" | ||
+ | |28|| TP_IRQ|| 触摸面板中断|| 检测到触摸面板有按下则为低电平 | ||
+ | |-align="center" | ||
+ | |29|| TP_CS|| 触摸面板片选信号|| 低电平选择触摸面板 | ||
+ | |-align="center" | ||
+ | |30|| TP_SCK|| 触摸面板SPI时钟信号|| 连接到SPI的SCK | ||
+ | |-align="center" | ||
+ | |31|| TP_SI|| 触摸面板SPI数据输入||连接到SPI的MOSI | ||
+ | |-align="center" | ||
+ | |32|| TP_SO|| 触摸面板SPI数据输出||连接到SPI的MISO | ||
+ | |-align="center" | ||
+ | |33|| 3.3V||+3.3电源 ||当3.3V供电时(33,34脚输入3.3V) 1,2脚悬空 | ||
+ | |-align="center" | ||
+ | |34|| GND|| 接地 | ||
+ | |} | ||
+ | |||
+ | ==3. 示例程序== | ||
+ | 本手册使用主控芯片STM32F103RCT6的开发板说明本款LCD的基本使用方法。用户也可以采用其他类似的开发板进行开发。<br /> | ||
+ | 3.2inch 320x240 Touch LCD (C)和STM32F103RCT6连接接口图:<br /> | ||
+ | [[File:3.2inch 320x240 Touch LCD (C)-10.png|800px]]<br /> | ||
+ | 程序流程:<br /> | ||
+ | [[File:3.2inch 320x240 Touch LCD (C)-11.png|800px]]<br /> | ||
+ | |||
+ | 源代码解析:<br /> | ||
+ | <pre> | ||
+ | /*下面宏定义的是图像的旋转角度*/<br /> | ||
+ | //#define DISP_ORIENTATION 0 | ||
+ | //#define DISP_ORIENTATION 90 | ||
+ | //#define DISP_ORIENTATION 180 | ||
+ | #define DISP_ORIENTATION 270 | ||
+ | #define Set_Cs GPIO_SetBits(GPIOC, GPIO_Pin_6); //CS=1; | ||
+ | #define Clr_Cs GPIO_ResetBits(GPIOC, GPIO_Pin_6); //CS=0; | ||
+ | |||
+ | #define Set_Rs GPIO_SetBits(GPIOC, GPIO_Pin_7); //RS=1; | ||
+ | #define Clr_Rs GPIO_ResetBits(GPIOC, GPIO_Pin_7); //RS=0; | ||
+ | |||
+ | #define Set_nWr GPIO_SetBits(GPIOC, GPIO_Pin_1); //WR=1; | ||
+ | #define Clr_nWr GPIO_ResetBits(GPIOC, GPIO_Pin_1); //WR=0; | ||
+ | |||
+ | #define Set_nRd GPIO_SetBits(GPIOC, GPIO_Pin_2); //RD=1; | ||
+ | #define Clr_nRd GPIO_ResetBits(GPIOC, GPIO_Pin_2); // RD=0; | ||
+ | /* 写命令函数 */ | ||
+ | __inline void LCD_WriteIndex(uint16_t index) | ||
+ | { | ||
+ | Clr_Rs; //RS=0 | ||
+ | Set_nRd; //RD=0 | ||
+ | LCD_Delay(0); //延时 | ||
+ | GPIOB->ODR = index; /*写命令 */ | ||
+ | LCD_Delay(0); //延时 | ||
+ | Clr_nWr; //WR=0 | ||
+ | Set_nWr; //WR=1 | ||
+ | } | ||
+ | /* 写数据函数 */ | ||
+ | __inline void LCD_WriteData(uint16_t data) | ||
+ | { | ||
+ | Set_Rs; //RS=1 | ||
+ | LCD_Delay(0); //延时 | ||
+ | GPIOB->ODR = data; /*写数据*/ | ||
+ | LCD_Delay(0); //延时 | ||
+ | Clr_nWr; //WR=0 | ||
+ | Set_nWr; //WR=1 | ||
+ | } | ||
+ | /* 读数据函数 */ | ||
+ | __inline uint16_t LCD_ReadData(void) | ||
+ | { | ||
+ | uint16_t value; | ||
+ | Set_Rs; | ||
+ | Set_nWr; | ||
+ | Clr_nRd; | ||
+ | GPIOB->CRH = 0x44444444; //设置PB0-PB15为输入 | ||
+ | GPIOB->CRL = 0x44444444; | ||
+ | value = GPIOB->IDR; //读取数据 | ||
+ | GPIOB->CRH = 0x33333333; //设置PB0-PB15为输出 | ||
+ | GPIOB->CRL = 0x33333333; | ||
+ | Set_nRd; | ||
+ | return value; | ||
+ | } | ||
+ | /****************************************************************************** | ||
+ | |||
+ | 指定的地址写入数据,LCD_Reg是地址,LCD_RegValue是写入的值。 | ||
+ | |||
+ | ******************************************************************************/ | ||
+ | __inline void LCD_WriteReg(uint16_t LCD_Reg,uint16_t LCD_RegValue) | ||
+ | { | ||
+ | Clr_Cs; | ||
+ | LCD_WriteIndex(LCD_Reg); //写指令;即要写入数据的地址; | ||
+ | LCD_WriteData(LCD_RegValue); //数据写入; | ||
+ | Set_Cs; | ||
+ | } | ||
+ | |||
+ | /****************************************************************************** | ||
+ | |||
+ | 从指定的地址读取数据,LCD_Reg是地址,函数返回读取出来的值。 | ||
+ | <pre> | ||
+ | ******************************************************************************/ | ||
+ | __inline uint16_t LCD_ReadReg(uint16_t LCD_Reg) | ||
+ | { | ||
+ | uint16_t LCD_RAM; | ||
+ | Clr_Cs; | ||
+ | LCD_WriteIndex(LCD_Reg); //写指令;即要读出数据的地址; | ||
+ | LCD_RAM = LCD_ReadData(); //数据读出; | ||
+ | Set_Cs; | ||
+ | return LCD_RAM; | ||
+ | } | ||
+ | //以上是最基本的读写函数;IO模拟操作,如果想STM32的FSMC来控制的,参考另外一个例程LCD + TouchPanel(8080 FSMC) | ||
+ | /****************************************************************************** | ||
+ | LCD寄存器的初始化,以下寄存器的初始化值由LCD原厂家提供,按照如下配置就可以正常显示,寄存器请参考芯片手册。 | ||
+ | ******************************************************************************/ | ||
+ | void LCD_Initializtion(void) | ||
+ | { | ||
+ | uint16_t DeviceCode; | ||
+ | LCD_Configuration(); //管脚初始化 | ||
+ | GPIO_ResetBits(GPIOC, GPIO_Pin_0); /* LCD复位*/ | ||
+ | delay_ms(100); | ||
+ | GPIO_SetBits(GPIOC, GPIO_Pin_0); | ||
+ | GPIO_SetBits(GPIOA, GPIO_Pin_3); /*使能背光 */ | ||
+ | DeviceCode = LCD_ReadReg(0x0000); /* 读取ID */ | ||
+ | if( DeviceCode == 0x9325 || DeviceCode == 0x9328 ) | ||
+ | { | ||
+ | LCD_WriteReg(0x00e7,0x0010); | ||
+ | LCD_WriteReg(0x0000,0x0001); | ||
+ | LCD_WriteReg(0x0001,(0<<10)|(1<<8)); | ||
+ | LCD_WriteReg(0x0002,0x0700); | ||
+ | #if (DISP_ORIENTATION == 0) | ||
+ | LCD_WriteReg(0x0003,(1<<12)|(1<<5)|(1<<4)|(0<<3)); | ||
+ | #elif (DISP_ORIENTATION == 90) | ||
+ | LCD_WriteReg(0x0003,(1<<12)|(0<<5)|(1<<4)|(1<<3)); | ||
+ | #elif (DISP_ORIENTATION == 180) | ||
+ | LCD_WriteReg(0x0003,(1<<12)|(0<<5)|(0<<4)|(0<<3)); | ||
+ | #elif (DISP_ORIENTATION == 270) | ||
+ | LCD_WriteReg(0x0003,(1<<12)|(1<<5)|(0<<4)|(1<<3)); | ||
+ | #endif | ||
+ | LCD_WriteReg(0x0004,0x0000); | ||
+ | LCD_WriteReg(0x0008,0x0207); | ||
+ | LCD_WriteReg(0x0009,0x0000); | ||
+ | LCD_WriteReg(0x000a,0x0000); | ||
+ | LCD_WriteReg(0x000c,0x0001); | ||
+ | LCD_WriteReg(0x000d,0x0000); | ||
+ | LCD_WriteReg(0x000f,0x0000); | ||
+ | /* Power On sequence */ | ||
+ | LCD_WriteReg(0x0010,0x0000); | ||
+ | LCD_WriteReg(0x0011,0x0007); | ||
+ | LCD_WriteReg(0x0012,0x0000); | ||
+ | LCD_WriteReg(0x0013,0x0000); | ||
+ | delay_ms(50); /* delay 50 ms */ | ||
+ | LCD_WriteReg(0x0010,0x1590); | ||
+ | LCD_WriteReg(0x0011,0x0227); | ||
+ | delay_ms(50); /* delay 50 ms */ | ||
+ | LCD_WriteReg(0x0012,0x009c); | ||
+ | delay_ms(50); /* delay 50 ms */ | ||
+ | LCD_WriteReg(0x0013,0x1900); | ||
+ | LCD_WriteReg(0x0029,0x0023); | ||
+ | LCD_WriteReg(0x002b,0x000e); | ||
+ | delay_ms(50); /* delay 50 ms */ | ||
+ | delay_ms(50); /* delay 50 ms */ | ||
+ | LCD_WriteReg(0x0030,0x0007); | ||
+ | LCD_WriteReg(0x0031,0x0707); | ||
+ | LCD_WriteReg(0x0032,0x0006); | ||
+ | LCD_WriteReg(0x0035,0x0704); | ||
+ | LCD_WriteReg(0x0036,0x1f04); | ||
+ | LCD_WriteReg(0x0037,0x0004); | ||
+ | LCD_WriteReg(0x0038,0x0000); | ||
+ | LCD_WriteReg(0x0039,0x0706); | ||
+ | LCD_WriteReg(0x003c,0x0701); | ||
+ | LCD_WriteReg(0x003d,0x000f); | ||
+ | delay_ms(50); /* delay 50 ms */ | ||
+ | LCD_WriteReg(0x0050,0x0000); | ||
+ | LCD_WriteReg(0x0051,0x00ef); | ||
+ | LCD_WriteReg(0x0052,0x0000); | ||
+ | LCD_WriteReg(0x0053,0x013f); | ||
+ | LCD_WriteReg(0x0060,0xa700); | ||
+ | LCD_WriteReg(0x0061,0x0001); | ||
+ | LCD_WriteReg(0x006a,0x0000); | ||
+ | LCD_WriteReg(0x0080,0x0000); | ||
+ | LCD_WriteReg(0x0081,0x0000); | ||
+ | LCD_WriteReg(0x0082,0x0000); | ||
+ | LCD_WriteReg(0x0083,0x0000); | ||
+ | LCD_WriteReg(0x0084,0x0000); | ||
+ | LCD_WriteReg(0x0085,0x0000); | ||
+ | LCD_WriteReg(0x0090,0x0010); | ||
+ | LCD_WriteReg(0x0092,0x0600); | ||
+ | LCD_WriteReg(0x0093,0x0003); | ||
+ | LCD_WriteReg(0x0095,0x0110); | ||
+ | LCD_WriteReg(0x0097,0x0000); | ||
+ | LCD_WriteReg(0x0098,0x0000); | ||
+ | /* display on sequence */ | ||
+ | LCD_WriteReg(0x0007,0x0133); | ||
+ | } | ||
+ | delay_ms(50); | ||
+ | } | ||
+ | /****************************************************************************** | ||
+ | 设置显示窗口的位置X、Y; | ||
+ | *****************************************************************************/ | ||
+ | static void LCD_SetCursor( uint16_t Xpos, uint16_t Ypos ) | ||
+ | { | ||
+ | uint16_t temp; | ||
+ | #if (DISP_ORIENTATION == 0) | ||
+ | #elif (DISP_ORIENTATION == 90) | ||
+ | temp = Xpos; | ||
+ | Xpos =Ypos; | ||
+ | Ypos = MAX_X - 1 - temp; | ||
+ | #elif (DISP_ORIENTATION == 180) | ||
+ | Xpos = MAX_X - 1 - Xpos; | ||
+ | Ypos = MAX_Y - 1 - Ypos; | ||
+ | #elif (DISP_ORIENTATION == 270) | ||
+ | temp = Ypos; | ||
+ | Ypos = Xpos; | ||
+ | Xpos = MAX_Y - 1 - temp; | ||
+ | #endif | ||
+ | LCD_WriteReg(0x0020, Xpos); //水平位置X的设置 | ||
+ | LCD_WriteReg(0x0021, Ypos); //垂直位置Y的设置 | ||
+ | } | ||
+ | /****************************************************************************** | ||
+ | 清屏函数,作用是让整个屏显示某一种颜色, | ||
+ | *****************************************************************************/ | ||
+ | void LCD_Clear(uint16_t Color) | ||
+ | { | ||
+ | uint32_t index=0; | ||
+ | LCD_SetCursor(0,0); //设置光标的初始位置X、Y | ||
+ | Clr_Cs; | ||
+ | LCD_WriteIndex(0x0022);//开始向GRAM写数据 | ||
+ | for( index = 0; index < MAX_X * MAX_Y; index++ ) | ||
+ | { | ||
+ | LCD_WriteData(Color); | ||
+ | } | ||
+ | Set_Cs; | ||
+ | } | ||
+ | |||
+ | int main(void) | ||
+ | { | ||
+ | //延时和初始化系统 | ||
+ | LCD_Initializtion(); //LCD初始化 | ||
+ | //LCD触摸板初始化 | ||
+ | LCD_Clear(Red); //清屏为红色 | ||
+ | //您可以编写函数来校准屏幕。 | ||
+ | /* Infinite loop */ | ||
+ | while (1) | ||
+ | { | ||
+ | //您可以编写函数,把触摸点坐标显示在 LCD 上 | ||
+ | } | ||
+ | } | ||
+ | </pre> | ||
+ | </div> | ||
+ | <div class="tabbertab" title="资料" id="myresources"> | ||
+ | |||
+ | <h1>资料</h1> | ||
+ | |||
===文档=== | ===文档=== | ||
− | *[ | + | *[https://{{SERVERNAME}}/w/upload/a/ae/3.2inch-320x240-Touch-LCD-C_UserManual_CN.pdf 用户手册] |
− | *[ | + | *[https://{{SERVERNAME}}/w/upload/9/93/3.2inch-320-240-Touch-LCD-SCH.pdf 原理图]<br> |
− | *[ | + | *[https://{{SERVERNAME}}/w/upload/5/5b/HY32D_dimension.pdf 尺寸图] <br> |
===程序=== | ===程序=== | ||
− | *[ | + | *[https://{{SERVERNAME}}/w/upload/1/1c/3.2inch-320x240-Touch-LCD-C-code.7z 示例程序]<br> |
===数据手册=== | ===数据手册=== | ||
− | *[ | + | *[https://{{SERVERNAME}}/w/upload/6/62/ILI9325_datasheet.pdf ILI9325] |
− | *[ | + | *[https://{{SERVERNAME}}/w/upload/d/db/XPT2046-CH.pdf XPT2046 中文手册] |
− | *[ | + | *[https://{{SERVERNAME}}/w/upload/9/98/XPT2046-EN.pdf XPT2046 英文手册] |
− | |||
− | |||
</div> | </div> | ||
− | <div class="tabbertab" title="FAQ">< | + | |
− | <div class="tabbertab" title="售后"> | + | <div class="tabbertab" title="FAQ" id="myfaq"> |
+ | |||
+ | <h1>FAQ</h1> | ||
+ | {{32inch-TOUCH-LCD-FAQ}}</div> | ||
+ | <div class="tabbertab" title="售后" id="mysupport"> | ||
+ | |||
+ | =售后= | ||
+ | {{Service12}}</div> |
2023年1月14日 (六) 14:45的最新版本
| ||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||
说明
1. 硬件资源
1.1 ILI9325
- ILI9325是一个240x320(RGB)分辨率、262144色的TFT 液晶显示屏的驱动芯片;172820 (240 x 320x 18/8) 字节的RAM。每个像素点深度可以达到18 位。
- ILI9325有以下几种数据接口模式:
1) i80-system MPU 接口(8-/9-/16-/18-bit bus width)
2) VSYNC 接口(system interface + VSYNC, internal clock, DB[17:0])
3) serial data transfer 接口(SPI)
4) RGB 6-/16-/18-bit 接口(DOTCLK, VSYNC, HSYNC, ENABLE, DB[17:0]).
此屏的ILI9325的18位RGB赋值与 LCD GRAM的对应关系如图所示:
从图中可以看出,ILI9325 在16 位模式下面,GRAM Data有用的是:D17~D10 和 D8~D1, D9和 D0 没有用到,实际上在我们 LCD 模块里面, ILI9341 的 D9 和 D0没有引出,ILI9325 的 D17~D10 和 D8~D1对应 MCU 的 D15~D0。MCU 的 16 位数据,最低 5 位代表蓝色,中间 6 位为绿色,最高 5 位为红色;数值越大,表示该颜色越深。
重要寄存器介绍
寄存器详细介绍请参阅 ILI9325的 datasheet。这里只介绍一些重要的寄存器设置:
输入设置(R03h):
AM:控制GRAM的更新方向
- 当 AM=0 地址在水平写入方向得以更新
- 当 AM=1 地址在垂直写入方向得以更新
I/D[1:0]: 当更新一个像素数据时, I/D[1:0]位控制地址计数器(AC)自动增加或者减少 1。详细请见下图:
ORG :当窗口地址区域产生后,原点地址的移动根据 ID的设定。当使用高速写 RAM 模式写数据到窗口地址区域这个功能被使能。
- ORG=0 :原点地址不会移动,在这种情况下,在窗口地址区域根据 GRAM 的地址映射指定一个地址开始写操作。
- ORG=1 :原始地址为“00000h” 根据 ID[1 :0]的 设定来移动。
BGR : 根据被写入的数据交换 R 和 B 的顺序
- BGR=0 :根据 RGB 的顺序写入像素数据
- BGR=1 :交换 RGB 数据为 BGR 写到 GRAM
GRAM 水平垂直变址设置(R20h, R21h)
水平位置寄存器变址 0x20 垂直变址寄存器变址 0x21 GRAM Horizontal/Vertical Address Set (R20h, R21h)
AD[16:0]:用于设置变址计数器(AC)的初始化数值。当数据写入内部的 GARM 中时,变址计数器(AC)会根据 AM 和 I/D 位的设置来自动的更新其数值。当从内部 GRAM 中读数据时变址计数器不会自动更新。
写数据到 GRAM (R22h)
该寄存器是 GRAM 的访问端口,当通过这个寄存器更新显示数据的时候,地址计数器会自动增加或者减少。
GRAM 地址映射和读/写
ILI9325 有一个容量为 172800 bytes的内部图片RAM (GRAM),用来存储显示数据。一像素由十八位数据构成, GRAM可以通过 i80系统接口,SPI 或者是 RGB 接口来访问,以下是 GRAM 在 i80 系统接口下读写的时序“
1.2 XPT2046
- XPT2046 是一款 4 线制电阻式触摸屏控制器,内含 12 位分辨率 125KHz 转换速率逐步逼近型 A/D 转换器。
- XPT2046 支持从 1.5V 到 5.25V 的低电压 I/O 接口。
- XPT2046 能通过执行两次 A/D 转换查出被按的屏幕位置,除此之外,还可以测量加在触摸屏上的压力。内部自带 2.5V 参考电压,可以作为辅助输入、温度测量和电池监测之用,电池监测的电压范围可以从 0V 到 5V。
- XPT2046 片内集成有一个温度传感器。在 2.7V 的典型工作状态下,关闭参考电压,功耗可小于 0.75mW。XPT2046 采用微小的封装形式:TSSOP-16,QFN-16 和 VFBGA-48。 工作温度范围为-40℃~+85℃。与 ADS7846、TSC2046、AK4182A 完全兼容。
2. 硬件说明
引脚号 | 标识 | 描述 | 功能 |
1 | 5V | 5V电源 | 当5V供电时(1,2脚接5V电源),3.3V端(33,34脚输出3.3V电压) |
2 | GND | 接地 | GND |
3 | D0 | 数据线 | D0-D15 |
4 | D1 | ||
5 | D2 | ||
6 | D3 | ||
7 | D4 | ||
8 | D5 | ||
9 | D6 | ||
10 | D7 | ||
11 | D8 | ||
12 | D9 | ||
13 | D10 | ||
14 | D11 | ||
15 | D12 | ||
16 | D13 | ||
17 | D14 | ||
18 | D15 | ||
19 | CS | LCD片选信号 | 低电平选择LCD |
20 | RS | 指令/数据 寄存器选择 | RS = 0:指令寄存器 RS = 1:数据寄存器 |
21 | WR | 写动作 | WR = 0,RD = 1 |
22 | RD | 读动作 | WR = 1,RD = 0 |
23 | RESET | 芯片重启 | 低电平重启芯片 |
24 | NC | ||
25 | BLVCC | 5V或3.3V | 背光灯VCC |
26 | BLGND | 接地 | 背光灯GND |
27 | BLCNT | 背光灯亮度调节 | 可以使用PWM来控制背光灯亮度 |
28 | TP_IRQ | 触摸面板中断 | 检测到触摸面板有按下则为低电平 |
29 | TP_CS | 触摸面板片选信号 | 低电平选择触摸面板 |
30 | TP_SCK | 触摸面板SPI时钟信号 | 连接到SPI的SCK |
31 | TP_SI | 触摸面板SPI数据输入 | 连接到SPI的MOSI |
32 | TP_SO | 触摸面板SPI数据输出 | 连接到SPI的MISO |
33 | 3.3V | +3.3电源 | 当3.3V供电时(33,34脚输入3.3V) 1,2脚悬空 |
34 | GND | 接地 |
3. 示例程序
本手册使用主控芯片STM32F103RCT6的开发板说明本款LCD的基本使用方法。用户也可以采用其他类似的开发板进行开发。
3.2inch 320x240 Touch LCD (C)和STM32F103RCT6连接接口图:
程序流程:
源代码解析:
/*下面宏定义的是图像的旋转角度*/<br /> //#define DISP_ORIENTATION 0 //#define DISP_ORIENTATION 90 //#define DISP_ORIENTATION 180 #define DISP_ORIENTATION 270 #define Set_Cs GPIO_SetBits(GPIOC, GPIO_Pin_6); //CS=1; #define Clr_Cs GPIO_ResetBits(GPIOC, GPIO_Pin_6); //CS=0; #define Set_Rs GPIO_SetBits(GPIOC, GPIO_Pin_7); //RS=1; #define Clr_Rs GPIO_ResetBits(GPIOC, GPIO_Pin_7); //RS=0; #define Set_nWr GPIO_SetBits(GPIOC, GPIO_Pin_1); //WR=1; #define Clr_nWr GPIO_ResetBits(GPIOC, GPIO_Pin_1); //WR=0; #define Set_nRd GPIO_SetBits(GPIOC, GPIO_Pin_2); //RD=1; #define Clr_nRd GPIO_ResetBits(GPIOC, GPIO_Pin_2); // RD=0; /* 写命令函数 */ __inline void LCD_WriteIndex(uint16_t index) { Clr_Rs; //RS=0 Set_nRd; //RD=0 LCD_Delay(0); //延时 GPIOB->ODR = index; /*写命令 */ LCD_Delay(0); //延时 Clr_nWr; //WR=0 Set_nWr; //WR=1 } /* 写数据函数 */ __inline void LCD_WriteData(uint16_t data) { Set_Rs; //RS=1 LCD_Delay(0); //延时 GPIOB->ODR = data; /*写数据*/ LCD_Delay(0); //延时 Clr_nWr; //WR=0 Set_nWr; //WR=1 } /* 读数据函数 */ __inline uint16_t LCD_ReadData(void) { uint16_t value; Set_Rs; Set_nWr; Clr_nRd; GPIOB->CRH = 0x44444444; //设置PB0-PB15为输入 GPIOB->CRL = 0x44444444; value = GPIOB->IDR; //读取数据 GPIOB->CRH = 0x33333333; //设置PB0-PB15为输出 GPIOB->CRL = 0x33333333; Set_nRd; return value; } /****************************************************************************** 指定的地址写入数据,LCD_Reg是地址,LCD_RegValue是写入的值。 ******************************************************************************/ __inline void LCD_WriteReg(uint16_t LCD_Reg,uint16_t LCD_RegValue) { Clr_Cs; LCD_WriteIndex(LCD_Reg); //写指令;即要写入数据的地址; LCD_WriteData(LCD_RegValue); //数据写入; Set_Cs; } /****************************************************************************** 从指定的地址读取数据,LCD_Reg是地址,函数返回读取出来的值。 <pre> ******************************************************************************/ __inline uint16_t LCD_ReadReg(uint16_t LCD_Reg) { uint16_t LCD_RAM; Clr_Cs; LCD_WriteIndex(LCD_Reg); //写指令;即要读出数据的地址; LCD_RAM = LCD_ReadData(); //数据读出; Set_Cs; return LCD_RAM; } //以上是最基本的读写函数;IO模拟操作,如果想STM32的FSMC来控制的,参考另外一个例程LCD + TouchPanel(8080 FSMC) /****************************************************************************** LCD寄存器的初始化,以下寄存器的初始化值由LCD原厂家提供,按照如下配置就可以正常显示,寄存器请参考芯片手册。 ******************************************************************************/ void LCD_Initializtion(void) { uint16_t DeviceCode; LCD_Configuration(); //管脚初始化 GPIO_ResetBits(GPIOC, GPIO_Pin_0); /* LCD复位*/ delay_ms(100); GPIO_SetBits(GPIOC, GPIO_Pin_0); GPIO_SetBits(GPIOA, GPIO_Pin_3); /*使能背光 */ DeviceCode = LCD_ReadReg(0x0000); /* 读取ID */ if( DeviceCode == 0x9325 || DeviceCode == 0x9328 ) { LCD_WriteReg(0x00e7,0x0010); LCD_WriteReg(0x0000,0x0001); LCD_WriteReg(0x0001,(0<<10)|(1<<8)); LCD_WriteReg(0x0002,0x0700); #if (DISP_ORIENTATION == 0) LCD_WriteReg(0x0003,(1<<12)|(1<<5)|(1<<4)|(0<<3)); #elif (DISP_ORIENTATION == 90) LCD_WriteReg(0x0003,(1<<12)|(0<<5)|(1<<4)|(1<<3)); #elif (DISP_ORIENTATION == 180) LCD_WriteReg(0x0003,(1<<12)|(0<<5)|(0<<4)|(0<<3)); #elif (DISP_ORIENTATION == 270) LCD_WriteReg(0x0003,(1<<12)|(1<<5)|(0<<4)|(1<<3)); #endif LCD_WriteReg(0x0004,0x0000); LCD_WriteReg(0x0008,0x0207); LCD_WriteReg(0x0009,0x0000); LCD_WriteReg(0x000a,0x0000); LCD_WriteReg(0x000c,0x0001); LCD_WriteReg(0x000d,0x0000); LCD_WriteReg(0x000f,0x0000); /* Power On sequence */ LCD_WriteReg(0x0010,0x0000); LCD_WriteReg(0x0011,0x0007); LCD_WriteReg(0x0012,0x0000); LCD_WriteReg(0x0013,0x0000); delay_ms(50); /* delay 50 ms */ LCD_WriteReg(0x0010,0x1590); LCD_WriteReg(0x0011,0x0227); delay_ms(50); /* delay 50 ms */ LCD_WriteReg(0x0012,0x009c); delay_ms(50); /* delay 50 ms */ LCD_WriteReg(0x0013,0x1900); LCD_WriteReg(0x0029,0x0023); LCD_WriteReg(0x002b,0x000e); delay_ms(50); /* delay 50 ms */ delay_ms(50); /* delay 50 ms */ LCD_WriteReg(0x0030,0x0007); LCD_WriteReg(0x0031,0x0707); LCD_WriteReg(0x0032,0x0006); LCD_WriteReg(0x0035,0x0704); LCD_WriteReg(0x0036,0x1f04); LCD_WriteReg(0x0037,0x0004); LCD_WriteReg(0x0038,0x0000); LCD_WriteReg(0x0039,0x0706); LCD_WriteReg(0x003c,0x0701); LCD_WriteReg(0x003d,0x000f); delay_ms(50); /* delay 50 ms */ LCD_WriteReg(0x0050,0x0000); LCD_WriteReg(0x0051,0x00ef); LCD_WriteReg(0x0052,0x0000); LCD_WriteReg(0x0053,0x013f); LCD_WriteReg(0x0060,0xa700); LCD_WriteReg(0x0061,0x0001); LCD_WriteReg(0x006a,0x0000); LCD_WriteReg(0x0080,0x0000); LCD_WriteReg(0x0081,0x0000); LCD_WriteReg(0x0082,0x0000); LCD_WriteReg(0x0083,0x0000); LCD_WriteReg(0x0084,0x0000); LCD_WriteReg(0x0085,0x0000); LCD_WriteReg(0x0090,0x0010); LCD_WriteReg(0x0092,0x0600); LCD_WriteReg(0x0093,0x0003); LCD_WriteReg(0x0095,0x0110); LCD_WriteReg(0x0097,0x0000); LCD_WriteReg(0x0098,0x0000); /* display on sequence */ LCD_WriteReg(0x0007,0x0133); } delay_ms(50); } /****************************************************************************** 设置显示窗口的位置X、Y; *****************************************************************************/ static void LCD_SetCursor( uint16_t Xpos, uint16_t Ypos ) { uint16_t temp; #if (DISP_ORIENTATION == 0) #elif (DISP_ORIENTATION == 90) temp = Xpos; Xpos =Ypos; Ypos = MAX_X - 1 - temp; #elif (DISP_ORIENTATION == 180) Xpos = MAX_X - 1 - Xpos; Ypos = MAX_Y - 1 - Ypos; #elif (DISP_ORIENTATION == 270) temp = Ypos; Ypos = Xpos; Xpos = MAX_Y - 1 - temp; #endif LCD_WriteReg(0x0020, Xpos); //水平位置X的设置 LCD_WriteReg(0x0021, Ypos); //垂直位置Y的设置 } /****************************************************************************** 清屏函数,作用是让整个屏显示某一种颜色, *****************************************************************************/ void LCD_Clear(uint16_t Color) { uint32_t index=0; LCD_SetCursor(0,0); //设置光标的初始位置X、Y Clr_Cs; LCD_WriteIndex(0x0022);//开始向GRAM写数据 for( index = 0; index < MAX_X * MAX_Y; index++ ) { LCD_WriteData(Color); } Set_Cs; } int main(void) { //延时和初始化系统 LCD_Initializtion(); //LCD初始化 //LCD触摸板初始化 LCD_Clear(Red); //清屏为红色 //您可以编写函数来校准屏幕。 /* Infinite loop */ while (1) { //您可以编写函数,把触摸点坐标显示在 LCD 上 } }
FAQ
- LCD供电电压:2.5V~3.3V
- 背光供电电压:4.5V~5V
- 平均背光工作电流:150mA
- 平均LCD面板工作电流:15mA
- 可以,但延长线不能超过100mm,否则可能会导致通信失败。
【相同点】:
- 接口一致,分辨率一致。
【区别】:
- 3.2inch 320x240 Touch LCD (A) LCD控制芯片SSD1289
- 3.2inch 320x240 Touch LCD (C) LCD控制芯片ILI9325
- 您好,A的已经停产了,您可以购买C型3.2inch 320x240 Touch LCD (C)这款,接口是兼容的。另外需要下载新版的示例程序资料,修改您现有的程序即可。
- 可能是初始化代码有问题,打开工程,用以下代码覆盖试试(如果是不同硬件平台的代码,可能需要作相应的修改)
if( DeviceCode == 0x9325 || DeviceCode == 0x9328 ) { LCD_Code = ILI9325; LCD_WriteReg(0xE5, 0x78F0); /* set SRAM internal timing */ LCD_WriteReg(0x01, 0x0100); /* set Driver Output Control */ LCD_WriteReg(0x02, 0x0700); /* set 1 line inversion */ LCD_WriteReg(0x03, 0x1030); /* set GRAM write direction and BGR=1 */ LCD_WriteReg(0x04, 0x0000); /* Resize register */ LCD_WriteReg(0x08, 0x0207); /* set the back porch and front porch */ LCD_WriteReg(0x09, 0x0000); /* set non-display area refresh cycle ISC[3:0] */ LCD_WriteReg(0x0A, 0x0000); /* FMARK function */ LCD_WriteReg(0x0C, 0x0000); /* RGB interface setting */ LCD_WriteReg(0x0D, 0x0000); /* Frame marker Position */ LCD_WriteReg(0x0F, 0x0000); /* RGB interface polarity */ /*************Power On sequence ****************/ LCD_WriteReg(0x10, 0x0000); /* SAP, BT[3:0], AP, DSTB, SLP, STB */ LCD_WriteReg(0x11, 0x0007); /* DC1[2:0], DC0[2:0], VC[2:0] */ LCD_WriteReg(0x12, 0x0000); /* VREG1OUT voltage */ LCD_WriteReg(0x13, 0x0000); /* VDV[4:0] for VCOM amplitude */ LCD_WriteReg(0x07, 0x0001); delay_ms(200); /* Dis-charge capacitor power voltage */ LCD_WriteReg(0x10, 0x1090); /* SAP, BT[3:0], AP, DSTB, SLP, STB */ LCD_WriteReg(0x11, 0x0227); /* Set DC1[2:0], DC0[2:0], VC[2:0] */ delay_ms(50); /* Delay 50ms */ LCD_WriteReg(0x12, 0x001F); delay_ms(50); /* Delay 50ms */ LCD_WriteReg(0x13, 0x1500); /* VDV[4:0] for VCOM amplitude */ LCD_WriteReg(0x29, 0x0027); /* 04 VCM[5:0] for VCOMH */ LCD_WriteReg(0x2B, 0x000D); /* Set Frame Rate */ delay_ms(50); /* Delay 50ms */ LCD_WriteReg(0x20, 0x0000); /* GRAM horizontal Address */ LCD_WriteReg(0x21, 0x0000); /* GRAM Vertical Address */ /* ----------- Adjust the Gamma Curve ---------- */ #if 1 //不同批次Gamma值可能有一定差异,以下提供了我们常用的3组参数作为参考 LCD_WriteReg(0x30, 0x0000); LCD_WriteReg(0x31, 0x0603); LCD_WriteReg(0x32, 0x0206); LCD_WriteReg(0x35, 0x0206); LCD_WriteReg(0x36, 0x0004); LCD_WriteReg(0x37, 0x0105); LCD_WriteReg(0x38, 0x0401); LCD_WriteReg(0x39, 0x0707); LCD_WriteReg(0x3C, 0x0602); LCD_WriteReg(0x3D, 0x0004); #endif #if 0 LCD_WriteReg(0x30, 0x0000); LCD_WriteReg(0x31, 0x0707); LCD_WriteReg(0x32, 0x0307); LCD_WriteReg(0x35, 0x0200); LCD_WriteReg(0x36, 0x0008); LCD_WriteReg(0x37, 0x0004); LCD_WriteReg(0x38, 0x0000); LCD_WriteReg(0x39, 0x0707); LCD_WriteReg(0x3C, 0x0002); LCD_WriteReg(0x3D, 0x1D04); #endif #if 0 LCD_WriteReg(0x30,0x0007); LCD_WriteReg(0x31,0x0707); LCD_WriteReg(0x32,0x0006); LCD_WriteReg(0x35,0x0704); LCD_WriteReg(0x36,0x1f04); LCD_WriteReg(0x37,0x0004); LCD_WriteReg(0x38,0x0000); LCD_WriteReg(0x39,0x0706); LCD_WriteReg(0x3c,0x0701); LCD_WriteReg(0x3d,0x000f); #endif /* ------------------ Set GRAM area --------------- */ LCD_WriteReg(0x50, 0x0000); /* Horizontal GRAM Start Address */ LCD_WriteReg(0x51, 0x00EF); /* Horizontal GRAM End Address */ LCD_WriteReg(0x52, 0x0000); /* Vertical GRAM Start Address */ LCD_WriteReg(0x53, 0x013F); /* Vertical GRAM Start Address */ LCD_WriteReg(0x60, 0xA700); /* Gate Scan Line */ LCD_WriteReg(0x61, 0x0001); /* NDL,VLE, REV */ LCD_WriteReg(0x6A, 0x0000); /* set scrolling line */ /* -------------- Partial Display Control --------- */ LCD_WriteReg(0x80, 0x0000); LCD_WriteReg(0x81, 0x0000); LCD_WriteReg(0x82, 0x0000); LCD_WriteReg(0x83, 0x0000); LCD_WriteReg(0x84, 0x0000); LCD_WriteReg(0x85, 0x0000); /* -------------- Panel Control ------------------- */ LCD_WriteReg(0x90, 0x0010); LCD_WriteReg(0x92, 0x0600); LCD_WriteReg(0x07, 0x0133); /* 262K color and display ON */ }