收藏 分销(赏)

TFT-LCD彻底解析和程序.doc

上传人:仙人****88 文档编号:8876236 上传时间:2025-03-06 格式:DOC 页数:17 大小:287.50KB 下载积分:10 金币
下载 相关 举报
TFT-LCD彻底解析和程序.doc_第1页
第1页 / 共17页
TFT-LCD彻底解析和程序.doc_第2页
第2页 / 共17页


点击查看更多>>
资源描述
先介绍ILI9320的几个重要命令: R0,这个命令有两个功能,如果对它写,则最低位为OSC,用于开启和关闭振荡器。而如果对它读操作,则返回的是控制器的型号。这个命令最大的功能是通过读它可以得到控制器的型号,而我们的代码知道了控制器的型号之后,可以针对不同型号的控制器,进行不同的初始化。因为93xx系列的初始化,其实都比较类似,我们完全可以用一个代码兼容好几个控制器。 R3,入口模式命令。我们重点关注的是I/D0、I/D1、AM这三个位,因为这三个位控制了屏幕的显示方向。 AM:控制GRAM更新方向。当AM=0的时候,地址以行方向更新。当AM=1的时候,地址以列方向更新。 I/D[1:0]:当更新一个数据之后,根据这两个位的设置来控制地址计数器自动增加/减少1,其关系如下: 通过这几个位置的设置,我们就可以控制屏幕的显示方向了。 R7,显示控制命令。该命令CL位用来控制是8位彩色,还是26万色。为0时26万色,为1时8位色。D1、D0、BASEE这个三个位用来控制显示开关与否的。当全部设置为1的时候开启显示,全为0是关闭。我们一般通过该命令的设置来开启或关闭显示器,以降低功耗。 R32,R33,设置GRAM的行地址和列地址。R32用于设置列地址(X坐标,0~239),R33用于设置行地址(Y坐标,0~319)。当我们要在某个指定点写入一个颜色的时候,先通过这两个命令设置到改点,然后写入颜色值就可以了。 R34,写数据到GRAM命令,当写了这个命令之后,地址计数器才会自动的增加和减少。该命令是我们要介绍的这一组命令里面唯一的单个操作的命令,只需要写入该值就可以了,其他的都是要先写入命令编号,然后写入操作数。 R80~R83,行列GRAM地址位置设置。这几个命令用于设定你显示区域的大小,我们整个屏的大小为240*320,但是有时候我们只需要在其中的一部分区域写入数据,如果先用写坐标,后写数据这样的方式来实现,则速度大打折扣。此时我们就可以通过这几个命令,在其中开辟一个区域,然后不停的丢数据,地址计数器就会根据R3的设置自动增加/减少,这样就不需要频繁的写地址了,大大提高了刷新的速度。 通过以上介绍,我们可以得出TFT-lcd显示需要的相关设置步骤如下: (1) 设置单片机(STM32)与TFT-LCD模块相连的IO口 这一步,先将我们与TFT-LCD模块相连的IO口设置为输出,具体使用哪些IO口,这里需要根据连接电路以及TFT-LCD模块的设置来确定; (2) 初始化TFT-LCD模块 通过向TFT-LCD写入一系列的设置,来启动TFT-LCD的显示,为后续显示字符和数字做准备; (3) 通过函数将字符和数字显示到TFT-LCD模块上 这里就是通过我们设计的程序,将要显示的字符送到TFT-LCD模块就可以了。 #include "lcd.h" #include "fonts.h" static vu16 TextColor = 0x0000, BackColor = 0xFFFF; void Delay(int n) { unsigned int i,j; for (i = 0;i<n;++i) for(j=0;j<3000;++j); } //LCD寄存器初始化 #define lcm_mdelay(X) Delay(X) void lcd_reg_init( void) { LCD_WriteReg(0x0000,0x0001); lcm_mdelay(1000); //at least 100ms LCD_WriteReg(0x0001,0x0000); // set SS and SM bit //LCD_CtrlWrite(0x0003,0x1030); // set GRAM write direction and BGR=1. LCD_WriteReg(0x0010,0x1790); LCD_WriteReg(0x0060,0x2700); LCD_WriteReg(0x0061,0x0001); LCD_WriteReg(0x0046,0x0002); LCD_WriteReg(0x0013,0x8010); LCD_WriteReg(0x0012,0x80fe); LCD_WriteReg(0x0002,0x0500); LCD_WriteReg(0x0003,0x1030); LCD_WriteReg(0x0030,0x0303); LCD_WriteReg(0x0031,0x0303); LCD_WriteReg(0x0032,0x0303); LCD_WriteReg(0x0033,0x0300); LCD_WriteReg(0x0034,0x0003); LCD_WriteReg(0x0035,0x0303); LCD_WriteReg(0x0036,0x0014); LCD_WriteReg(0x0037,0x0303); LCD_WriteReg(0x0038,0x0303); LCD_WriteReg(0x0039,0x0303); LCD_WriteReg(0x003a,0x0300); LCD_WriteReg(0x003b,0x0003); LCD_WriteReg(0x003c,0x0303); LCD_WriteReg(0x003d,0x1400); LCD_WriteReg(0x0092,0x0200); LCD_WriteReg(0x0093,0x0303); LCD_WriteReg(0x0090,0x080d); LCD_WriteReg(0x0003,0x1018); // set GRAM write direction and BGR=1. LCD_WriteReg(0x0007,0x0173); } //LCD初始化 void STM3210B_LCD_Init(void) { vu16 dummy = 0; LCD_CtrlLinesConfig(); lcd_reg_init(); dummy = LCD_ReadReg(0); } //设置文字颜色 void LCD_SetTextColor(vu16 Color) { TextColor = Color; } //设置背景色 void LCD_SetBackColor(vu16 Color) { BackColor = Color; } //清除行,Line:0-9 void LCD_ClearLine(u8 Line) { LCD_DisplayStringLine(Line, " "); } //LCD清屏 void LCD_Clear(u16 Color) { u32 index = 0; LCD_SetCursor(0x00, 0x0000); LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */ for(index = 0; index < 76800; index++) { LCD_WriteRAM(Color); } } //LCD光标设置 void LCD_SetCursor(u8 Xpos, u16 Ypos) { LCD_WriteReg(R32, Xpos); LCD_WriteReg(R33, Ypos); } //在LCD指定位置上显示 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++) { LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */ for(i = 0; i < 16; i++) { if((c[index] & (1 << i)) == 0x00) { LCD_WriteRAM(BackColor); } else { LCD_WriteRAM(TextColor); } } Xaddress++; LCD_SetCursor(Xaddress, Ypos); } } //显示一个字符 void LCD_DisplayChar(u8 Line, u16 Column, u8 Ascii) { Ascii -= 32; LCD_DrawChar(Line, Column, &ASCII_Table[Ascii * 24]); } //LCD显示字符串 void LCD_DisplayStringLine(u8 Line, u8 *ptr) { u32 i = 0; u16 refcolumn = 319;//319; while ((*ptr != 0) && (i < 20)) // 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++; } } //设置LCD显示模式 void LCD_SetDisplayWindow(u8 Xpos, u16 Ypos, u8 Height, u16 Width) { if(Xpos >= Height) { LCD_WriteReg(R80, (Xpos - Height + 1)); } else { LCD_WriteReg(R80, 0); } LCD_WriteReg(R81, Xpos); if(Ypos >= Width) { LCD_WriteReg(R82, (Ypos - Width + 1)); } else { LCD_WriteReg(R82, 0); } /* Vertical GRAM End Address */ LCD_WriteReg(R83, Ypos); LCD_SetCursor(Xpos, Ypos); } //LCD窗口模式配置 void LCD_WindowModeDisable(void) { LCD_SetDisplayWindow(239, 0x13F, 240, 320); LCD_WriteReg(R3, 0x1018); } //LCD画线 void LCD_DrawLine(u8 Xpos, u16 Ypos, u16 Length, u8 Direction) { u32 i = 0; LCD_SetCursor(Xpos, Ypos); if(Direction == Horizontal) { LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */ for(i = 0; i < Length; i++) { LCD_WriteRAM(TextColor); } } else { for(i = 0; i < Length; i++) { LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */ LCD_WriteRAM(TextColor); Xpos++; LCD_SetCursor(Xpos, Ypos); } } } //LCD画矩形 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); } //LCD 画圆 void LCD_DrawCircle(u8 Xpos, u16 Ypos, u16 Radius) { s32 D; u32 CurX; u32 CurY; D = 3 - (Radius << 1); CurX = 0; CurY = Radius; while (CurX <= CurY) { LCD_SetCursor(Xpos + CurX, Ypos + CurY); LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */ LCD_WriteRAM(TextColor); LCD_SetCursor(Xpos + CurX, Ypos - CurY); LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */ LCD_WriteRAM(TextColor); LCD_SetCursor(Xpos - CurX, Ypos + CurY); LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */ LCD_WriteRAM(TextColor); LCD_SetCursor(Xpos - CurX, Ypos - CurY); LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */ LCD_WriteRAM(TextColor); LCD_SetCursor(Xpos + CurY, Ypos + CurX); LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */ LCD_WriteRAM(TextColor); LCD_SetCursor(Xpos + CurY, Ypos - CurX); LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */ LCD_WriteRAM(TextColor); LCD_SetCursor(Xpos - CurY, Ypos + CurX); LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */ LCD_WriteRAM(TextColor); LCD_SetCursor(Xpos - CurY, Ypos - CurX); LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */ LCD_WriteRAM(TextColor); if (D < 0) { D += (CurX << 2) + 6; } else { D += ((CurX - CurY) << 2) + 10; CurY--; } CurX++; } } //显示灰阶图片(Monocolor Picture) void LCD_DrawMonoPict(uc32 *Pict) { u32 index = 0, i = 0; LCD_SetCursor(0, 319); LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */ for(index = 0; index < 2400; index++) { for(i = 0; i < 32; i++) { if((Pict[index] & (1 << i)) == 0x00) { LCD_WriteRAM(BackColor); } else { LCD_WriteRAM(TextColor); } } } } //显示位图(BMP Picture) void LCD_WriteBMP(u32 BmpAddress) { u32 index = 0, size = 0; size = *(vu16 *) (BmpAddress + 2); size |= (*(vu16 *) (BmpAddress + 4)) << 16; index = *(vu16 *) (BmpAddress + 10); index |= (*(vu16 *) (BmpAddress + 12)) << 16; size = (size - index)/2; BmpAddress += index; LCD_WriteReg(R3, 0x1008); LCD_WriteRAM_Prepare(); for(index = 0; index < size; index++) { LCD_WriteRAM(*(vu16 *)BmpAddress); BmpAddress += 2; } LCD_WriteReg(R3, 0x1018); } //写LCD寄存器 void LCD_WriteReg(u8 LCD_Reg, u16 LCD_RegValue) { GPIOB->BRR = 0x0200; //LCD_NCS_LOW(); GPIOB->BRR = 0x0100; //LCD_RS_LOW(); GPIOB->BSRR = 0x0020; //LCD_NWR_HIGH(); GPIOC->ODR = LCD_Reg; //GPIO_Write(LCD_DataPort,LCD_Reg); GPIOB->BRR = 0x0020; //LCD_NWR_LOW(); GPIOB->BSRR = 0x0020; //LCD_NWR_HIGH(); GPIOB->BSRR = 0x0100; //LCD_RS_HIGH(); GPIOC->ODR = LCD_RegValue; //GPIO_Write(LCD_DataPort,LCD_RegValue); GPIOB->BRR = 0x0020; //LCD_NWR_LOW(); GPIOB->BSRR = 0x0020; //LCD_NWR_HIGH(); GPIOB->BSRR = 0x0100; //LCD_RS_HIGH(); } //读LCD寄存器 u16 LCD_ReadReg(u8 LCD_Reg) { u16 temp; GPIOB->BRR = 0x0200; //LCD_NCS_LOW(); GPIOB->BRR = 0x0100; //LCD_RS_LOW(); GPIOB->BSRR = 0x0020; //LCD_NWR_HIGH(); GPIOC->ODR = LCD_Reg; //GPIO_Write(LCD_DataPort,LCD_Reg); GPIOB->BRR = 0x0020; //LCD_NWR_LOW(); GPIOB->BSRR = 0x0020; //LCD_NWR_HIGH(); GPIOB->BSRR = 0x0100; //LCD_RS_HIGH(); LCD_BusIn(); GPIOB->BRR = 0x0400; //LCD_NRD_LOW(); temp = GPIOC->IDR; //temp=GPIO_ReadInputData(LCD_DataPort); GPIOB->BSRR = 0x0400; //LCD_NRD_HIGH(); LCD_BusOut(); GPIOB->BSRR = 0x0200; //LCD_NCS_HIGH(); return temp; } //写LCD-RAM预处理 void LCD_WriteRAM_Prepare(void) { GPIOB->BRR = 0x0200; //LCD_NCS_LOW(); GPIOB->BRR = 0x0100; //LCD_RS_LOW(); GPIOB->BSRR = 0x0020; //LCD_NWR_HIGH(); GPIOC->ODR = R34; //GPIO_Write(LCD_DataPort,R34); GPIOB->BRR = 0x0020; //LCD_NWR_LOW(); GPIOB->BSRR = 0x0020; //LCD_NWR_HIGH(); GPIOB->BSRR = 0x0100; //LCD_RS_HIGH(); GPIOB->BSRR = 0x0200; //LCD_NCS_HIGH(); } //写LCD-RAM void LCD_WriteRAM(u16 RGB_Code) { GPIOB->BRR = 0x0200; //LCD_NCS_LOW(); GPIOB->BSRR = 0x0100; //LCD_RS_HIGH(); GPIOB->BSRR = 0x0020; //LCD_NWR_HIGH(); GPIOC->ODR = RGB_Code; //GPIO_Write(LCD_DataPort,RGB_Code); GPIOB->BRR = 0x0020; //LCD_NWR_LOW(); GPIOB->BSRR = 0x0020; //LCD_NWR_HIGH(); GPIOB->BSRR = 0x0100; //LCD_RS_HIGH(); GPIOB->BSRR = 0x0200; //LCD_NCS_HIGH(); } //读取LCD-RAM u16 LCD_ReadRAM(void) { u16 temp; GPIOB->BRR = 0x0200; //LCD_NCS_LOW(); GPIOB->BRR = 0x0100; //LCD_RS_LOW(); GPIOB->BSRR = 0x0020; //LCD_NWR_HIGH(); GPIOC->ODR = R34; //GPIO_Write(LCD_DataPort,R34); GPIOB->BRR = 0x0020; //LCD_NWR_LOW(); GPIOB->BSRR = 0x0020; //LCD_NWR_HIGH(); GPIOB->BSRR = 0x0100; //LCD_RS_HIGH(); LCD_BusIn(); GPIOB->BRR = 0x0400; //LCD_NRD_LOW(); temp = GPIOC->IDR; //temp=GPIO_ReadInputData(LCD_DataPort); GPIOB->BSRR = 0x0400; //LCD_NRD_HIGH(); LCD_BusOut(); GPIOB->BSRR = 0x0200; //LCD_NCS_HIGH(); return temp; } //LCD上电 void LCD_PowerOn(void) { LCD_WriteReg(R16, 0x0000); LCD_WriteReg(R17, 0x0000); LCD_WriteReg(R18, 0x0000); LCD_WriteReg(R19, 0x0000); Delay(20); LCD_WriteReg(R16, 0x17B0); LCD_WriteReg(R17, 0x0137); Delay(5); LCD_WriteReg(R18, 0x0139); Delay(5); LCD_WriteReg(R19, 0x1d00); LCD_WriteReg(R41, 0x0013); Delay(5); LCD_WriteReg(R7, 0x0173); } //开启LCD显示 void LCD_DisplayOn(void) { LCD_WriteReg(R7, 0x0173); } //关闭LCD显示 void LCD_DisplayOff(void) { LCD_WriteReg(R7, 0x0); } //LCD控制引脚配置 void LCD_CtrlLinesConfig(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC , ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_5 | GPIO_Pin_8 | GPIO_Pin_10; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOB, &GPIO_InitStructure); LCD_BusOut(); GPIOB->BSRR |= 0x0620; } //数据总线输入配置 void LCD_BusIn(void) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOC, &GPIO_InitStructure); } //数据总线输出配置 void LCD_BusOut(void) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOC, &GPIO_InitStructure); } // void LCD_DrawPicture(const u8* picture) { int index; LCD_SetCursor(0x00, 0x0000); LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */ for(index = 0; index < 76800; index++) { LCD_WriteRAM(picture[2*index+1]<<8|picture[2*index]); } } ============================================================ #ifndef __LCD_H #define __LCD_H #include "stm32f10x.h" /* 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
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服