基于STM32的LCD操作Word格式文档下载.docx
- 文档编号:20218899
- 上传时间:2023-01-20
- 格式:DOCX
- 页数:17
- 大小:962.40KB
基于STM32的LCD操作Word格式文档下载.docx
《基于STM32的LCD操作Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《基于STM32的LCD操作Word格式文档下载.docx(17页珍藏版)》请在冰豆网上搜索。
ALIENTEKTFTLCD模块采用80并口口方与外部链接,采用16位数据线(低了速度太慢,用彩色就没什么效果了)。
该模块的80并口有如下一些信号线:
CS:
TFTLCD片选信号。
WR:
向TFTLCD写入数据。
RD:
从TFTLCD读取数据。
D[15:
0]:
16位双向数据线。
RST:
硬复位TFTLCD。
RS:
命令/数据标志(0,读写命令;
1,读写数据)。
TFTLCD模块的RST信号线和OLED模块一样,也是直接接到STM32的复位脚上,并不由软件控制,这样可以省下来一个IO口。
另外我们还需要一个背光控制线来控制TFTLCD的背光。
所以,我们总共需要的IO口数目为21个。
1.3ILI9320
模块的控制器为ILI9320,该控制器自带显存,其显存总大小为172820(240*320*18/8),即18位模式(26万色)下的显存量。
模块的16位数据线与显寸的对应关系为565方式,如下图所示:
1.4GRAM显示方向设置
1.5TFTLCD显示需要的相关设置步骤如下
(1)设置STM32与TFTLCD模块相连接的IO。
这一步,先将我们与TFTLCD模块相连的IO口设置为输出,具体使用哪些IO口,这里需要根据连接电路以及TFTLCD模块的设置来确定。
(2)初始化TFTLCD模块。
其实这里就是上和上面OLED模块的初始化过程差不多。
通过向TFTLCD写入一系列的设置,来启动TFTLCD的显示。
为后续显示字符和数字做准备。
(3)通过函数将字符和数字显示到TFTLCD模块上。
这里就是通过我们设计的程序,将要显示的字符送到TFTLCD模块就可以了,这些函数将在软件设计部分向大家介绍。
通过以上三步,我们就可以使用ALIENTEKTFTLCD模块来显示字符和数字了,并且可以显示各种颜色的背景。
2.电路连线及资源分配
MiniSTM32开发板底板的LCD接口和ALIENTEKTFTLCD模块直接可以对插,连接如下图:
图中绿色线圈出来的部分就是连接TFTLCD模块的接口,这里在硬件上,TFTLCD模块与MiniSTM32开发板的IO口对应关系如下:
LCD_LED对应PC10;
LCD_CS对应PC9;
LCD_RS对应PC8;
LCD_WR对应PC7;
LCD_RD对应PC6;
LCD_D[17:
1]对应PB[15:
0];
这些线的连接,MiniSTM32的内部已经连接好了,我们只需要将TFTLCD模块插上去就好了。
3.所用主要器件或模块说明
3.1TFT-LCD模块原理图
3.2TFT-LCD模块接口图
4.程序流程图
5.调试心得
调试之前需将MiniSTM32开发板连接至PC并且安装好相应的驱动程序;
在调试程序的时候将错误程序下载到MiniSTM32中会导致LCD屏无法打开或者是白屏的现象,程序与开发板不兼容也会产生同样现象;
并且在使用Keil调试的时候没有进行正确的设置也会导致下载程序无法顺利进行。
所以在调试的时候要确保程序的正确及对Keil的正确的使用才能顺利完成实验。
调试结果(到屏幕的背景是不停切换的):
6.源代码
6.1LCD_WR_REG函数:
通过80并口向LCD模块写入8位的寄存器命令
#ifLCD_FAST_IO==1//快速IO
voidLCD_WR_REG(u8data)
{
LCD_RS_CLR;
//写地址
LCD_CS_CLR;
DATAOUT(data);
LCD_WR_CLR;
LCD_WR_SET;
LCD_CS_SET;
}
#else//正常IO
//写寄存器函数
LCD_RS=0;
LCD_CS=0;
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=0X88888888;
//PB0-7上拉输入
CRH=0X88888888;
//PB8-15上拉输入
ODR=0XFFFF;
//全部输出高
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=0;
LCD_RD=0;
LCD_RD=1;
LCD_CS=1;
CRL=0X33333333;
//PB0-7上拉输出
CRH=0X33333333;
//PB8-15上拉输出
returnt;
}
6.3LCD_ReadRAM:
用来读取GRAM的值
//读取个某点的颜色值
//x:
0~239
//y:
0~319
//返回值:
此点的颜色
u16LCD_ReadPoint(u16x,u16y)
{
if(x>
=LCD_W||y>
=LCD_H)return0;
//超过了范围,直接返回
LCD_SetCursor(x,y);
LCD_WR_REG(R34);
//选择GRAM地址
//读取数据(读GRAM时,需要读2次)
delay_us
(2);
//FOR9320,延时2us
//dummyREAD
//FOR8989,延时2us
LCD_RD=1;
//dummyREAD
//全部输出高
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);
}
LCD_WriteReg(0X4E,Xpos);
LCD_WriteReg(0X4F,Ypos);
LCD_WriteReg(R32,Xpos);
LCD_WriteReg(R33,Ypos);
}
#endif
6.5POINT_COLOR:
画点函数
voidLCD_DrawPoint(u16x,u16y)
//设置光标位置
//开始写入GRAM
LCD_WR_DATA(POINT_COLOR);
6.6LCD_ShowChar:
显示字符
//在指定位置显示一个字符
0~234
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
u8temp;
u8pos,t;
u16x0=x;
u16colortemp=POINT_COLOR;
MAX_CHAR_POSX||y>
MAX_CHAR_POSY)return;
//设置窗口
num=num-'
'
;
//得到偏移后的值
if(!
mode)//非叠加方式
for(pos=0;
pos<
size;
pos++)
{
if(size==12)temp=asc2_1206[num][pos];
//调用1206字体
elsetemp=asc2_1608[num][pos];
//调用1608字体
for(t=0;
t<
size/2;
t++)
{
if(temp&
0x01)POINT_COLOR=colortemp;
elsePOINT_COLOR=BACK_COLOR;
LCD_DrawPoint(x,y);
temp>
>
=1;
x++;
}
x=x0;
y++;
}
}else//叠加方式
0x01)LCD_DrawPoint(x+t,y+pos);
//画一个点
temp>
}
POINT_COLOR=colortemp;
6.7LCD_Init(简化):
初始化模块
voidLCD_Init(void)
u16DeviceCode;
RCC->
APB2ENR|=1<
<
3;
//先使能外设PORTB时钟
4;
//先使能外设PORTC时钟
0;
//开启辅助时钟
AFIO->
MAPR=0X04000000;
//关闭JTAG
//PORTC6~10复用推挽输出
GPIOC->
CRH&
=0XFFFFF000;
CRH|=0X00000333;
CRL&
=0X00FFFFFF;
CRL|=0X33000000;
ODR|=0X07C0;
//PORTB推挽输出
GPIOB->
Delay(5);
//delay50ms
LCD_WriteReg(0x0000,0x0001);
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"
stdlib.h"
//TFTLCD部分外要调用的函数
externu16POINT_COLOR;
//默认红色
externu16BACK_COLOR;
//背景颜色.默认为白色
//-----------------LCD端口定义----------------
#defineLCD_LEDPCout(10)//LCD背光PC10
#defineLCD_CSPCout(9)//片选端口PC9
#defineLCD_RSPCout(8)//数据/命令PC8
#defineLCD_WRPCout(7)//写数据PC7
#defineLCD_RDPCout(6)//读数据PC6
//PB0~15,作为数据线
#defineDATAOUT(x)GPIOB->
ODR=x;
//数据输出
#defineDATAINGPIOB->
IDR;
//数据输入
//画笔颜色
#defineWHITE0xFFFF
#defineBLACK0x0000
#defineBLUE0x001F
#defineRED0xF800
#defineMAGENTA0xF81F
#defineGREEN0x07E0
#defineCYAN0x7FFF
#defineYELLOW0xFFE0
#defineBROWN0XBC40//棕色
#defineBRRED0XFC07//棕红色
#defineGRAY0X8430//灰色
#defineLGRAY0XC618//浅灰色
externu16BACK_COLOR,POINT_COLOR;
voidLCD_Init(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(u8x,u8y,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
6.9Test中的main函数:
该部分代码将显示一些固定的字符,然后不停的切换背景颜色,每1s切换一次。
而LED0也会不停的闪烁,指示程序已经在运行
intmain(void)
u8x=0;
SystemInit();
delay_init(72);
//延时初始化
NVIC_Configuration();
uart_init(9600);
LED_Init();
KEY_Init();
LCD_Init();
POINT_COLOR=RED;
while
(1)
{
switch(x)
case0:
break;
case1:
LCD_Clear(BLACK);
case2:
LCD_Clear(BLUE);
case3:
LCD_Clear(RED);
case4:
LCD_Clear(MAGENTA);
case5:
LCD_Clear(GREEN);
case6:
LCD_Clear(CYAN);
case7:
LCD_Clear(YELLOW);
case8:
LCD_Clear(BRRED);
case9:
LCD_Clear(GRAY);
case10:
LCD_Clear(LGRAY);
case11:
LCD_Clear(BROWN);
POINT_COLOR=RED;
LCD_ShowString(30,50,"
MiniSTM32^_^"
);
LCD_ShowString(30,70,"
2.4'
/2.8'
TFTLCDTEST"
LCD_ShowString(30,90,"
ATOM@ALIENTEK"
LCD_ShowString(30,110,"
2010/12/30"
x++;
if(x==12)x=0;
LED0=!
LED0;
delay_ms(1000);
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 STM32 LCD 操作