TFTLCD彻底解析和程序.docx
- 文档编号:14250013
- 上传时间:2023-06-21
- 格式:DOCX
- 页数:25
- 大小:19.81KB
TFTLCD彻底解析和程序.docx
《TFTLCD彻底解析和程序.docx》由会员分享,可在线阅读,更多相关《TFTLCD彻底解析和程序.docx(25页珍藏版)》请在冰点文库上搜索。
TFTLCD彻底解析和程序
先介绍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"
staticvu16TextColor=0x0000,BackColor=0xFFFF;
voidDelay(intn)
{
unsignedinti,j;
for(i=0;i for(j=0;j<3000;++j); } //LCD寄存器初始化 #definelcm_mdelay(X)Delay(X) voidlcd_reg_init(void) { LCD_WriteReg(0x0000,0x0001); lcm_mdelay(1000);//atleast100ms LCD_WriteReg(0x0001,0x0000);//setSSandSMbit //LCD_CtrlWrite(0x0003,0x1030);//setGRAMwritedirectionandBGR=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);//setGRAMwritedirectionandBGR=1. LCD_WriteReg(0x0007,0x0173); } //LCD初始化 voidSTM3210B_LCD_Init(void) { vu16dummy=0; LCD_CtrlLinesConfig(); lcd_reg_init(); dummy=LCD_ReadReg(0); } //设置文字颜色 voidLCD_SetTextColor(vu16Color) { TextColor=Color; } //设置背景色 voidLCD_SetBackColor(vu16Color) { BackColor=Color; } //清除行,Line: 0-9 voidLCD_ClearLine(u8Line) { LCD_DisplayStringLine(Line,""); } //LCD清屏 voidLCD_Clear(u16Color) { u32index=0; LCD_SetCursor(0x00,0x0000); LCD_WriteRAM_Prepare();/*PreparetowriteGRAM*/ for(index=0;index<76800;index++) { LCD_WriteRAM(Color); } } //LCD光标设置 voidLCD_SetCursor(u8Xpos,u16Ypos) { LCD_WriteReg(R32,Xpos); LCD_WriteReg(R33,Ypos); } //在LCD指定位置上显示 voidLCD_DrawChar(u8Xpos,u16Ypos,uc16*c) { u32index=0,i=0; u8Xaddress=0; Xaddress=Xpos; LCD_SetCursor(Xaddress,Ypos); for(index=0;index<24;index++) { LCD_WriteRAM_Prepare();/*PreparetowriteGRAM*/ for(i=0;i<16;i++) { if((c[index]&(1< { LCD_WriteRAM(BackColor); } else { LCD_WriteRAM(TextColor); } } Xaddress++; LCD_SetCursor(Xaddress,Ypos); } } //显示一个字符 voidLCD_DisplayChar(u8Line,u16Column,u8Ascii) { Ascii-=32; LCD_DrawChar(Line,Column,&ASCII_Table[Ascii*24]); } //LCD显示字符串 voidLCD_DisplayStringLine(u8Line,u8*ptr) { u32i=0; u16refcolumn=319;//319; while((*ptr! =0)&&(i<20))//20 { /*DisplayonecharacteronLCD*/ LCD_DisplayChar(Line,refcolumn,*ptr); /*Decrementthecolumnpositionby16*/ refcolumn-=16; /*Pointonthenextcharacter*/ ptr++; /*Incrementthecharactercounter*/ i++; } } //设置LCD显示模式 voidLCD_SetDisplayWindow(u8Xpos,u16Ypos,u8Height,u16Width) { 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); } /*VerticalGRAMEndAddress*/ LCD_WriteReg(R83,Ypos); LCD_SetCursor(Xpos,Ypos); } //LCD窗口模式配置 voidLCD_WindowModeDisable(void) { LCD_SetDisplayWindow(239,0x13F,240,320); LCD_WriteReg(R3,0x1018); } //LCD画线 voidLCD_DrawLine(u8Xpos,u16Ypos,u16Length,u8Direction) { u32i=0; LCD_SetCursor(Xpos,Ypos); if(Direction==Horizontal) { LCD_WriteRAM_Prepare();/*PreparetowriteGRAM*/ for(i=0;i { LCD_WriteRAM(TextColor); } } else { for(i=0;i { LCD_WriteRAM_Prepare();/*PreparetowriteGRAM*/ LCD_WriteRAM(TextColor); Xpos++; LCD_SetCursor(Xpos,Ypos); } } } //LCD画矩形 voidLCD_DrawRect(u8Xpos,u16Ypos,u8Height,u16Width) { 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画圆 voidLCD_DrawCircle(u8Xpos,u16Ypos,u16Radius) { s32D; u32CurX; u32CurY; D=3-(Radius<<1); CurX=0; CurY=Radius; while(CurX<=CurY) { LCD_SetCursor(Xpos+CurX,Ypos+CurY); LCD_WriteRAM_Prepare();/*PreparetowriteGRAM*/ LCD_WriteRAM(TextColor); LCD_SetCursor(Xpos+CurX,Ypos-CurY); LCD_WriteRAM_Prepare();/*PreparetowriteGRAM*/ LCD_WriteRAM(TextColor); LCD_SetCursor(Xpos-CurX,Ypos+CurY); LCD_WriteRAM_Prepare();/*PreparetowriteGRAM*/ LCD_WriteRAM(TextColor); LCD_SetCursor(Xpos-CurX,Ypos-CurY); LCD_WriteRAM_Prepare();/*PreparetowriteGRAM*/ LCD_WriteRAM(TextColor); LCD_SetCursor(Xpos+CurY,Ypos+CurX); LCD_WriteRAM_Prepare();/*PreparetowriteGRAM*/ LCD_WriteRAM(TextColor); LCD_SetCursor(Xpos+CurY,Ypos-CurX); LCD_WriteRAM_Prepare();/*PreparetowriteGRAM*/ LCD_WriteRAM(TextColor); LCD_SetCursor(Xpos-CurY,Ypos+CurX); LCD_WriteRAM_Prepare();/*PreparetowriteGRAM*/ LCD_WriteRAM(TextColor); LCD_SetCursor(Xpos-CurY,Ypos-CurX); LCD_WriteRAM_Prepare();/*PreparetowriteGRAM*/ LCD_WriteRAM(TextColor); if(D<0) { D+=(CurX<<2)+6; } else { D+=((CurX-CurY)<<2)+10; CurY--; } CurX++; } } //显示灰阶图片(MonocolorPicture) voidLCD_DrawMonoPict(uc32*Pict) { u32index=0,i=0; LCD_SetCursor(0,319); LCD_WriteRAM_Prepare();/*PreparetowriteGRAM*/ for(index=0;index<2400;index++) { for(i=0;i<32;i++) { if((Pict[index]&(1< { LCD_WriteRAM(BackColor); } else { LCD_WriteRAM(TextColor); } } } } //显示位图(BMPPicture) voidLCD_WriteBMP(u32BmpAddress) { u32index=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 { LCD_WriteRAM(*(vu16*)BmpAddress); BmpAddress+=2; } LCD_WriteReg(R3,0x1018); } //写LCD寄存器 voidLCD_WriteReg(u8LCD_Reg,u16LCD_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寄存器 u16LCD_ReadReg(u8LCD_Reg) { u16temp; 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(); returntemp; } //写LCD-RAM预处理 voidLCD_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 voidLCD_WriteRAM(u16RGB_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 u16LCD_ReadRAM(void) { u16temp; 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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- TFTLCD 彻底 解析 程序