芯嵌stm32_LCD转接板原理图
- 格式:pdf
- 大小:10.71 KB
- 文档页数:1
STM32的SPI应用之LCD开始本来先玩串口,虽然程序已经跑通,但是由于网上类似文章很多,就先来个SPI 玩玩,与上次GPIO一样,技术含量仍然不高,仅是业余学习玩玩。
1、首先来开硬件电路,个人觉得是编写程序的第2步;第1步当然是先看STM32的手册了,SPI的详细介绍见STM32的中文使用手册。
这个电路的正确性是以我把它点亮为依据的,不是我设计的,我也不会,但是我驱动它关心的是那几个信号引脚怎么接的。
这里采用的是SPI口,加上几根控制线。
关于SPI口的介绍不大清楚的朋友可以查下相关资料,一般具有SPI接口的处理器的手册都有比较详细的介绍。
结合STM32的手册对引脚的描述:可以看出,SPI1的4根引脚MISO、MOSI、SCK(CLK)、CSN(CS)分别对应的引脚为GPIO的:PA6、PA7、PA5、PA4。
所以LCD的控制线与处理器的GPIO具体对应如下:LCD_RST--------------PC7LCD_RS------------------PC8LCD_CLK-----------------------PA5LCD_SDO-----------------------PA7LCD_CS----------------------PA8LCD_PWR----------------PC1其实也就这六根信号线就能驱动LCD了。
2、这里必须关心的是SPI口对应的4根线,这里只用到了两根MOSI(PA7)、CLK(PA5),片选CSN用的是通用IO口PA8代替,至于MISO这里可以不用使用。
所以在初始化SPI口是有如下程序:void SetupSPI(void){SPI_InitTypeDef SPI_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;/*允许SPI1 和GPIOA时钟,这两个外设都是挂在APB2总线上的*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1 | RCC_APB2Periph_GPIOA, ENABLE);/*配置SPI1 引脚,由于这里只用到了SCK,和MOSI ,所以只对PA5和PA7进行了初始化*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//关于这个参数的描述可以见GPIO的H文件GPIO_Init(GPIOA, &GPIO_InitStructure);/* 配置PA.4作为推挽输出,因为这里用来作为SPI口的片选,既选中LCD操作*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);/* 初始化片选为高,不选种LCD */GPIO_ResetBits(GPIOA, GPIO_Pin_8);//PA8;/* SPI1 配置,关于这个怎么配置见STM32的手册,为什么这样配置见下*/SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx;SPI_InitStructure.SPI_Mode = SPI_Mode_Master;SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;SPI_Init(SPI1, &SPI_InitStructure);SPI_Cmd(SPI1, ENABLE);}关于SPI的配置,这里还要多说点。
STM32系列第14篇--TFTLCD驱动原理
ALINETEK2.8 寸TFTLCD 模块特点240*320 分辨率
16 位真彩显示(65536 色)
自带电阻触摸屏
自带背光电路注意:模块是3.3V 供电的,不支持5V 电压的MCU,如果是
5VMCU,必须在信号线串接120R 电阻使用。
ALINETEK2.8 寸TFTLCD 接口说明(16 位80 并口)LCD_CS:LCD 片选信号
LCD_WR:LCD 写信号
LCD_RD:LCD 读信号
DB[17:1]:16 位双向数据线。
LCD_RST:硬复位LCD 信号
LCD_RS:命令/数据标志(0:命令,1:数据)
BL_CTR:背光控制信号
T_MISO/T_MOSI/T_PEN/T_CS/T_CLK,触摸屏接口信号
引脚电路图如下图:
驱动时序图:
驱动流程:
RGB565 格式说明(16 色):
指令集:0XD3 指令:用于读取LCD 控制器的ID
0X36 指令:用于控制读写方向
0X2A 指令:用于设置横坐标起始位置和终止位置(x 坐标)
0X2B 指令:用于设置纵坐标起始位置和终止位置(y 坐标)。
L C D与单片机的连接电路图和L C D显示程序(总6页)本页仅作为文档封面,使用时可以删除This document is for reference only-rar21year.MarchLCD与单片机的连接电路图和LCD显示程序/LCD测试程序3.2.5 LCD显示电路液晶显示器简称LCD显示器,它是利用液晶经过处理后能改变光线的传输方向的特性来显示信息的。
要使用点阵型LCD显示器,必须有相应的LCD控制器、驱动器来对LCD显示器进行扫描、驱动,以及一定空间的ROM和RAM来存储写入的命令和显示字符的点阵。
现在往往将LCD控制器、驱动器、RAM、ROM和LCD 显示器连接在一起,称为液晶显示模块。
液晶显示模块是一种常见的人机界面,在单片机系统中的应用极其广泛。
液晶显示模块既可以显示字符,又可以显示简单的图形。
本系统采用的是1602的LCD接口。
1602是一种点阵字符型液晶显示模块,可以显示两行共32个字符。
根据LCD型号的不同,所需要的背光电阻大小会不同,可自行调节。
本系统采用的LCD为RT-1602C,其主要引脚的功能如下:RS:数据/命令选择端,高电平时选择数据寄存器,低电平时选择指令寄存器。
RW:读/写选择端,高电平时进行读操作,低电平时进行写操作。
当RS和RW共同为低电平时,可以写入指令或者显示地址;当RS为低电平、RW为高电平时,可以读忙信号;当RS为高电平、RW为低电平时,可以写入数据。
E:使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
图3-9 LCD显示电路LCD测试程序#include <>/********IO引脚定义***********************************************************/ sbit LCD_RS=P2^7;//定义引脚sbit LCD_RW=P2^6;sbit LCD_E=P2^5;/********宏定义***********************************************************/ #define LCD_Data P0#define Busy 0x80 //用于检测LCD状态字中的Busy标识/********数据定义*************************************************************/ unsigned char code uctech[] = {"Happy every day"};unsigned char code net[] = {""};/********函数声明*************************************************************/void WriteDataLCD(unsigned char WDLCD); //写数据void WriteCommandLCD(unsigned char WCLCD,BuysC); //写命令unsigned char ReadDataLCD(void); //读数据unsigned char ReadStatusLCD(void); //读状态void LCDInit(void);//初始化void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);//相应坐标显示字节内容void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);//相应坐标开始显示一串内容void Delay5Ms(void); //延时void Delay400Ms(void);//延时/***********主函数开始********************************************************/void main(void){Delay400Ms(); //启动等待,等LCD讲入工作状态LCDInit(); //初始化Delay5Ms(); //延时片刻(可不要)DisplayListChar(0, 0, uctech);DisplayListChar(1, 5, net);ReadDataLCD(); //测试用句无意义while(1);}/***********写数据********************************************************/void WriteDataLCD(unsigned char WDLCD){ReadStatusLCD(); //检测忙LCD_Data = WDLCD;LCD_RS = 1;LCD_RW = 0;LCD_E = 0; //若晶振速度太高可以在这后加小的延时LCD_E = 0; //延时LCD_E = 1;}/***********写指令********************************************************/void WriteCommandLCD(unsigned char WCLCD,BuysC) //BuysC为0时忽略忙检测{if (BuysC) ReadStatusLCD(); //根据需要检测忙LCD_Data = WCLCD;LCD_RS = 0;LCD_RW = 0;LCD_E = 0;LCD_E = 0;LCD_E = 1;}/***********读数据********************************************************/unsigned char ReadDataLCD(void){LCD_RS = 1;LCD_RW = 1;LCD_E = 0;LCD_E = 0;LCD_E = 1;return(LCD_Data);}/***********读状态*******************************************************/unsigned char ReadStatusLCD(void){LCD_Data = 0xFF;LCD_RS = 0;LCD_RW = 1;LCD_E = 0;LCD_E = 0;LCD_E = 1;while (LCD_Data & Busy); //检测忙信号return(LCD_Data);}/***********初始化********************************************************/void LCDInit(void){LCD_Data = 0;WriteCommandLCD(0x38,0); //三次模式设置,不检测忙信号Delay5Ms();WriteCommandLCD(0x38,0);Delay5Ms();WriteCommandLCD(0x38,0);Delay5Ms();WriteCommandLCD(0x38,1); //显示模式设置,开始要求每次检测忙信号WriteCommandLCD(0x08,1); //关闭显示WriteCommandLCD(0x01,1); //显示清屏WriteCommandLCD(0x06,1); //显示光标移动设置WriteCommandLCD(0x0C,1); //显示开及光标设置}/***********按指定位置显示一个字符*******************************************/void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData){Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1 if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;X |= 0x80; //算出指令码WriteCommandLCD(X, 0); //这里不检测忙信号,发送地址码WriteDataLCD(DData);}/***********按指定位置显示一串字符*****************************************/void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData) {unsigned char ListLength;ListLength = 0;Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1 while (DData[ListLength]>=0x20){ //若到达字串尾则退出if (X <= 0xF){ //X坐标应小于0xFDisplayOneChar(X, Y, DData[ListLength]); //显示单个字符ListLength++;X++;}}}/***********短延时********************************************************/void Delay5Ms(void){unsigned int TempCyc = 5552;while(TempCyc--);}/***********长延时********************************************************/void Delay400Ms(void){unsigned char TempCycA = 5;unsigned int TempCycB;while(TempCycA--){TempCycB=7269;while(TempCycB--);}}LCD与单片机连接的引脚并不是固定的,如有不同只需要在程序里改一下引脚即可。