基于STM32的LCD操作.docx
- 文档编号:10442715
- 上传时间:2023-02-11
- 格式:DOCX
- 页数:22
- 大小:317.37KB
基于STM32的LCD操作.docx
《基于STM32的LCD操作.docx》由会员分享,可在线阅读,更多相关《基于STM32的LCD操作.docx(22页珍藏版)》请在冰豆网上搜索。
基于STM32的LCD操作
《嵌入式系统》课程报告
基于STM32勺LCD操作
姓
名
组长:
曾昭智
组员:
邓宁、张小扬、牛洪澄
学
院
光电学院
班
级
电信2班、3班
完成日期
2014.05.29
1原理方案(功能框图介绍)1
2、电路连线及资源分配2
3、所用主要器件或模块说明3
4、程序流程图4
5、调试心得5
6、源代码
1.TFT-LCD原理
1.1TFT-LCD简介
TFT-LCD即薄膜晶体管液晶显示器。
其英文全称为:
ThinFilmTransistor-LiquidCrystalDisplay。
TFT-LCD与无源TN-LCDSTN-LC的简单
矩阵不同,它在液晶显示屏的每一个象素上都设置有一个薄膜晶体管(TFT),可有效地克服非选通时的串扰,使显示液晶屏的静态特性与扫描线数无关,因此大大提高了图像质量。
TFT-LCD也被叫做真彩液晶显示器。
上一节介绍了OLE模块,这一节,我们给大家介绍ALIENTEKTFTLC模块,该模块有如下特点:
1,2.4'28'两种大小的屏幕可选。
2,320X240的分辨率。
3,16位真彩显示。
4,自带触摸屏,可以用来作为控制输入。
5,通用的接口,除了ALIENTEKMiniSTM3开发板,该液晶模块还可以使用在优异特、STMSKY红牛等开发板上。
本节,我们以2.8寸的ALIENTEKTFTLCD模块为例介绍,该模块采用的是显尚光电的DST2001PHTFTLCDDST2001P的控制器为ILI9320,采用26万色的TFTLCD屏,分辨率为320X240,采用16位的80并口。
1.280并口
ALIENTEKTFTLCD模块采用80并口口方与外部链接,采用16位数据线(低了速度太慢,用彩色就没什么效果了)。
该模块的80并口有如下一些信号线:
CS:
TFTLCD片选信号。
WR:
向TFTLCD写入数据。
RD:
从TFTLCD读取数据。
D[15:
0]:
16位双向数据线。
RST:
硬复位TFTLCD。
RS:
命令/数据标志(0,读写命令;1,读写数据)。
TFTLCD模块的RST信号线和OLED模块一样,也是直接接到STM32的复位脚上,并不由软件控制,这样可以省下来一个10口。
另外我们还需要一个背光控制线来控制TFTLCD的背光。
所以,我们总共需要的IO口数目为21个。
1.3ILI9320
模块的控制器为ILI9320,该控制器自带显存,其显存总大小为172820(240*320*18/8),即18位模式(26万色)下的显存量。
模块的16位数据线与显寸的对应关系为565方式,如下图所示:
1stTransfer
1.4GRAM显示方向设置
1.5
TFTLCD显示需要的相关设置步骤如下
(1)设置STM3与TFTLC模块相连接的10。
这一步,先将我们与TFTLC模块相连的I0口设置为输出,具体使用哪些I0口,这里需要根据连接电路以及TFTLC模块的设置来确定。
(2)初始化TFTLC模块。
其实这里就是上和上面OLE模块的初始化过程差不多。
通过向TFTLC写入一系列的设置,来启动TFTLC的显示。
为后续显示字符和数字做准备。
(3)通过函数将字符和数字显示到TFTLC模块上。
这里就是通过我们设计的程序,将要显示的字符送到TFTLC模块就可以了,这些函数将在软件设计部分向大家介绍。
通过以上三步,我们就可以使用ALIENTEKTFTLCD模块来显示字符和数字了,并
且可以显示各种颜色的背景。
2.电路连线及资源分配
MiniSTM32开发板底板的LCD接口和ALIENTEKTFTLC模块直接可以对插连接如下图:
LCD_LED对应PC10;
LCD_CS对应PC9;
LCD_RS对应PC8;
LCD_WR对应PC7;
LCD_RD对应PC6;
LCD_D[17:
1]对应PB[15:
0];
这些线的连接,MiniSTM32的内部已经连接好了,我们只需要将就好了。
3.所用主要器件或模块说明
3.1TFT-LCD模块原理图
L5;.T
LW
LCDjrt,LCDMMT、i尿
DB]
DB4屉-
rar
DBE
CO'jG''
DSH
5FT
斑L0
X-
对订
w
I»L2
X-
ISL-L
se>Li
KC
SSLS
迓
I®L6
NC
3»L*
肚
LCMID
NC
LEDMLEDKI
LEDK2LBW
UZA
TETLB
TFT2
LCDBtST
DDE
Lbc
LB_E5LCp^-T
LE血
D3:
2
DB1J
DB2ES4
匸曰二
VCCV€CTOSCO
OXD
LED3C
列LgE0
H匸学:
対曰沁
咋1叱:
八
轧匸H熬丄
E&IfeT
:
:
r
fa3
^7^
:
1.J7PEy
IIT_CLK
ifm
147沁墾u尸口丁」EBP
LCD上3B
^■CLKRD
MTQD1
co:
nei
DB^DWDD!
DBL]CBIJ□BISEM-Lt
EC™>].S
^TOUGXD
KDBt^vnp
卜険3^
7JFE?
:
MD
TC3CLK
二_叱:
Tq
LCtTj±»LI时~
DB2dST
~^TTniTi
blJ.w
咖i
TCLK
3-■■HMf”:
T百■□
3.2TFT-LCD模块接口图
LCD!
LCDCS
1
2LCDRS
HD
3
!
rcn
RST
5
DB2
7
DBl
9
DB6
ii
DBS
"bm
DBll
D1313
17
DRIS
19
DBl?
21
\(X'3.3
GND
27
T\[冈订氏「TTs~
29
5T
33
LCDCS
RS
WR/CLK
RD
RST
DBl
DB2
DBS
DBt
DB5
DBG
DB7
DBS
DB10
DR1t
DR12
DB13
DD14
DB15
DD16
DB17
GND
BL
VDD33
VJUB.3
GND
GND
BL_VW
\nso
XfOST
TPEN
MO
TCS
CLK
4
IXDRD
6
DBl
DB3
"To"
DB5
ijl厂
DB7
■"nr
16
l)H12'i
DD14
20
DB16
22
GND\
VCC33
30T
y:
31TCLK
IFILCD
4.程序流程图
写入数据
读取数据
读取GRAM
5.调试心得
调试之前需将MiniSTM32开发板连接至PC并且安装好相应的驱动程序;在
调试程序的时候将错误程序下载到MiniSTM32中会导致LCD屏无法打开或者是白
屏的现象,程序与开发板不兼容也会产生同样现象;并且在使用Keil调试的时候没有进行正确的设置也会导致下载程序无法顺利进行。
所以在调试的时候要确保程序的正确及对Keil的正确的使用才能顺利完成实验。
):
调试结果(到屏幕的背景是不停切换的
AES常±
6.源代码
6.1LCD_WR_RE函数:
通过80并口向LCD模块写入8位的寄存器命令#ifLCD_FAST_IO==1//快速10
voidLCD_WR_REG(u8data)
{
LCD_RS_CLR;/写地址
LCD_CS_CLR;
DATAOUT(data);
LCD_WR_CLR;
LCD_WR_SET;
LCD_CS_SET;
}
#else〃正常IO
//写寄存器函数
voidLCD_WR_REG(u8data)
{
LCD_RS=O;〃写地址
LCD_CS=0;
DATAOUT(data);
LCD_WR=0;
LCD_WR=1;
LCD_CS=1;
}
#endif
6.2LCD_READREG用来读取某个寄存器的值
//读寄存器
u16LCD_ReadReg(u8LCD_Reg)
{
u16t;
LCD_WR_REG(LCD_Reg);写入要读的寄存器号
GPIOB->CRL=OX88888888;//PB0-7上拉输入
GPIOB->CRH=OX88888888;//PB8-15上拉输入
GPIOB->ODR=0XFFFF;//全部输出高
#ifLCD_FAST_IO==1//快速IO
LCD_RS_SET;
LCD_CS_CLR;
//读取数据(读寄存器时,并不需要读2次)
LCD_RD_CLR;
delay_us(5);//FOR8989,延时5us
LCD_RD_SET;
t=DATAIN;
LCD_CS_SET;
#else
LCD_RS=1;
LCD_CS=O;
//读取数据(读寄存器时,并不需要读2次)
LCD_RD=O;
LCD_RD=1;
t=DATAIN;
LCD_CS=1;
#endif
GPIOB->CRL=OX33333333;//PBO-7上拉输出
GPIOB->CRH=OX33333333;//PB8-15上拉输出
GPIOB->ODR=OXFFFF;//全部输出高
returnt;
}
6.3LCD_ReadRAM用来读取GRA啲值
//读取个某点的颜色值
〃x:
0~239
〃y:
0~319
//返回值:
此点的颜色
u16LCD_ReadPoint(u16x,u16y)
{_
u16t;
if(x>=LCD_W||y>=LCD_H)return0;//超过了范围,直接返回LCD_SetCursor(x,y);
LCD_WR_REG(R34);//选择GRAI地址
GPIOB->CRL=OX88888888;//PBO-7上拉输入
GPIOB->CRH=OX88888888;//PB8-15上拉输入
GPIOB->ODR=OXFFFF;//全部输出高
#ifLCD_FAST_IO==1//快速IO
LCD_RS_SET;
LCD_CS_CLR;
//读取数据(读GRA时,需要读2次)
LCD_RD_CLR;
LCD_RD_SET;
delay_us
(2);//FOR932O,延时2us
//dummyREAD
LCD_RD_CLR;
delay_us
(2);//FOR8989,延时2us
LCD_RD_SET;
t=DATAIN;
LCD_CS_SET;
#else
LCD_RS=1;
LCD_CS=O;
//读取数据(读GRAM,需要读2次)
LCD_RD=O;
LCD_RD=1;
//dummyREAD
LCD_RD=O;
LCD_RD=1;
t=DATAIN;
LCD_CS=1;
#endif
GPIOB->CRL=OX33333333;//PBO-7上拉输出
GPIOB->CRH=OX33333333;//PB8-15上拉输出
GPIOB->ODR=OXFFFF;//全部输出高if(DeviceCode==0X4531||DeviceCode==0X8989||DeviceCode==0XB505)returnt;//这几种IC直接返回颜色值
elsereturnLCD_BGR2RGB(t);
}
6.4LCD_SetCursor:
用于设置坐标
voidLCD_SetCursor(u16Xpos,u16Ypos)
{_
#ifUSE_HORIZONTAL==1
if(DeviceCode==0X8989)
{
LCD_WriteReg(0X4E,Ypos);
LCD_WriteReg(0X4F,319-Xpos);
}else
{
LCD_WriteReg(R32,Ypos);
LCD_WriteReg(R33,319-Xpos);
}
#else
if(DeviceCode==0X8989)
{
LCD_WriteReg(0X4E,Xpos);
LCD_WriteReg(0X4F,Ypos);
}else
{
LCD_WriteReg(R32,Xpos);
LCD_WriteReg(R33,Ypos);
}
#endif
}
6.5POINT_COLOR画点函数voidLCD_DrawPoint(u16x,u16y){
LCD_SetCursor(x,y);〃设置光标位置LCD_WR_REG(R34)开始写入GRAMLCD_WR_DATA(POINT_COLOR);
}
6.6LCD_ShowCha:
显示字符
//在指定位置显示一个字符
〃x:
0~234
〃y:
0~308
//num:
要显示的字符:
""--->"~"
//size:
字体大小12/16
//mode:
叠加方式
(1)还是非叠加方式(0)
voidLCD_ShowChar(u16x,u16y,u8num,u8size,u8mode)
{_
#ifUSE_HORIZONTAL==1
#defineMAX_CHAR_POSX312
#defineMAX_CHAR_POSY232
#else
#defineMAX_CHAR_POSX232
#defineMAX_CHAR_POSY312
#endif
u8temp;
u8pos,t;
u16x0=x;
u16colortemp=POINT_COLOR;
if(x>MAX_CHAR_POSX||y>MAX_CHAR_POSY)return;
//设置窗口
num=num-'';//得到偏移后的值
if(!
mode)//非叠加方式
{
for(pos=0;pos { if(size==12)temp=asc2_1206[num][pos];〃调用1206字体 elsetemp=asc2_1608[num][pos];//调用1608字体 for(t=0;t { if(temp&0x01)POINT_COLOR=colortemp; elsePOINT_COLOR=BACK_COLOR; LCD_DrawPoint(x,y); temp>>=1; X++; } X=X0; y++; } }else〃叠加方式 { for(pos=0;pos 调用1206字体调用1608字体 画一个点 { if(size==12)temp=asc2_1206[num][pos];〃elsetemp=asc2_1608[num][pos];// for(t=0;t { if(temp&0x01)LCD_DrawPoint(x+t,y+pos);〃temp>>=1; } } } POINT_COLOR=colortemp; } 6.7LCD_Init(简化): 初始化模块 voidLCD」nit(void) {_ u16DeviceCode; RCC->APB2ENR|=1<<3;先使能外设PORT时钟 RCC->APB2ENR|=1<<4;先使能外设PORT时钟 RCC->APB2ENR|=1<<0;/开启辅助时钟 AFI0->MAPR=0X04000000;/关闭JTAG //PORTC6~1复用推挽输出 GPIOC->CRH&=0XFFFFF000; GPIOC->CRH|=0X00000333; GPIOC->CRL&=0X00FFFFFF; GPIOC->CRL|=0X33000000; GPIOC->ODR|=0X07C0; //PORTB推挽输出 GPIOB->CRH=0X33333333; GPIOB->CRL=0X33333333; GPIOB->ODR=0XFFFF; Delay(5);//delay50ms LCD_WriteReg(0x0000,0x0001); Delay(5);//delay50ms DeviceCode=LCD_ReadReg(0x0000); //printf("ID: %d\n",DeviceCode); if(DeviceCode==0x9325||DeviceCode==0x9328)//ILI9325 { ……//9325/9328初始化代码 } elseif(DeviceCode==0x9320||DeviceCode==0x9300) { ……//9320/9300初始化代码 } elseif(DeviceCode==0x1505) {……//1505初始化代码 } elseif(DeviceCode==0x8989) { ……//8989初始化代码 } Delay(5000); LCD_Clear(WHITE); } 6.8输入以下代码(简化代码)来控制I/O口,当使用快速模式来控制的时候,就可以有效提升速度。 另外这段代码对颜色和驱动器的寄存器进行了很多宏定义: #ifndef__LCD_H #define__LCD_H #include"sys.h" #include"stdlib.h" //TFTLCD部分外要调用的函数 externu16POINT_COLOR;〃默认红色 externu16BACK_COLOR;//背景颜色.默认为白色 //-LCD端口定义 片选端口PC9数据/命令PC8 写数据PC7 读数据PC6 #defineLCD_LEDPCout(10)//LCD背光PC10 #defineLCD_CSPCout(9)//#defineLCD_RSPCout(8)//#defineLCD_WRPCout(7)//#defineLCD_RDPCout(6)////PB0~15,作为数据线 #defineDATAOUT(x)GPIOB->ODR=x;//数据输出 #defineDATAINGPIOB->IDR;//数据输入 //画笔颜色 #defineWHITE0xFFFF #defineBLACK0x0000 #defineBLUE0x001F #defineRED0xF800 #defineMAGENTA0xF81F #defineGREEN0x07E0 #defineCYAN0x7FFF #defineYELLOW0xFFE0 #defineBROWN0XBC40//棕色 #defineBRRED0XFC07//棕红色 #defineGRAY0X8430//灰色 #defineLGRAY0XC618//浅灰色 externu16BACK_COLORPOINT_COLOR; voidLCD」nit(void); voidLCD_Clear(u16Color); voidLCD_SetCursor(u8Xpos,u16Ypos); voidLCD_DrawPoint(u8x,u16y);〃画点 voidDraw_Circle(u8x0,u16y0,u8r); voidLCD_DrawLine(u8x1,u16y1,u8x2,u16y2); voidLCD_DrawRectangle(u8x1,u16y1,u8x2,u16y2); voidLCD_Fill(u8xsta,u16ysta,u8xend,u16yend,u16color); voidLCD_ShowChar(u8x,u16y,u8num,u8size,u8mode);//显示一个字符一 voidLCD_ShowNum(u8xu8y,u32num,u8len,u8size);//显示一个 数字 voidLCD_ShowString(u8x,u16y,constu8*p);//显示一个字符串, 16字体 voidLCD_WriteReg(u8LCD_Reg,u16LCD_RegValue); u16LCD_ReadReg(u8LCD_Reg); voidLCD_WriteRAM_Prepare(void); voidLCD_WriteRAM(u16RGB_Code); u16LCD_ReadRAM(void); //9320/9325LCD寄存器 #defineR00x00 #defineR10x01 #defineR20x02 ……//寄存器定义区 #defineR1920xC0 #defineR1930xC1 #defineR2290xE5 #endif 6.9Test中的main函数: 该部分代码将显示一些固定的字符,然后不停的切换背景颜色,每1s切换一次。 而LED0也会不停的闪烁,指示程序已经在运行 intmain(void) { u8x=0; SystemInit(); delay」nit(72);//延时初始化 NVIC_Configuration(); uart_init(9600); LED_Init(); KEY」nit(); LCD_Init(); POINT_COLOR=RED; while (1) { switch(x) { case0: LCD_Clear(WHITE);break; case1: LCD_Clear(BLACK);break; case2: LCD_Clear(BLUE);break; case3: LCD_Clear(RED);break; case4: LCD_Clear(MAGENTA);break; case5: LCD_Clear(GREEN);break; case6: LCD_Clear(CYAN);break; case7: LCD_Clear(YELLOW);break; case8: LCD_Clear(BRRED);break; case9: LCD_Clear(GRAY);break; case10: LCD_Clear(LGRAY);break; case11: LCD_Clear(BROWN);break; }_ POI
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 STM32 LCD 操作