SPI-12864液晶简介
控制器项目因为用于低端流水线上,市面上的同款产品用到的也是小型液晶显示屏,经查后选用的是TX_12864液晶模块,该模块的参数列表如下:
手册的链接如下TX12864-T2手册:
- 低功耗:5 - 100mW(不带背光5mW,带背光不大于100mW);
- 128*64 点阵单色图片;
- 可选用1616 点阵或其他点阵的图片来自编汉字,按照1616 点阵汉字来计算可显示8字/行4 行。按照1212 点阵汉字来计算可显示10 字/行*4 行。
- 指令功能强:可组合成各种输入、显示、移位方式以满足不同的要求;
- 接口简单方便:可采用4 线SPI 串行接口。
序号 | 引脚名称 | 功能 |
---|---|---|
1 | ROM_IN | 字库芯片用 |
2 | ROM_OUT | 字库芯片用 |
3 | ROM_SCK | 字库芯片用 |
4 | ROM_CS | 字库芯片用 |
5 | LEDA0 | |
6 | VSS | GND |
7 | VDD | 3.3V |
8 | SCK | SPI |
9 | SDA | SPI |
10 | RS | 数据/指令 |
11 | RESET | 复位 |
12 | CS | CS |
TX_12864内部集成了一个UC1701X的芯片,此芯片功耗低,可以通过SPI进行通信。可显示8字4行的汉字(16*16)。
引脚的定义如下:
序号 | 引脚名称 | 功能 |
---|---|---|
1 | ROM_IN | 字库芯片用 |
2 | ROM_OUT | 字库芯片用 |
3 | ROM_SCK | 字库芯片用 |
4 | ROM_CS | 字库芯片用 |
5 | LEDA0 | |
6 | VSS | GND |
7 | VDD | 3.3V |
8 | SCK | SPI |
9 | SDA | SPI |
10 | RS | 数据/指令 |
11 | RESET | 复位 |
12 | CS | CS |
字库芯片价格约在1.2元,JLC价格在1.77元,产品的型号为16S1Y,由高通生产,数据手册的链接如下:
16S1Y数据手册
UC1701X通信的时序如下:
STM32的SPI相关库函数
初始化配置
uint16_t SPI_BaudRatePrescaler //波特率分频,SPI模块的最大速度为36M,SPI_BaudRatePrescaler_4,液晶的SPI支持60ns,也就是16M,我们设置为9M
uint16_t SPI_CPHA //SPI_CPHA_2Edge
uint16_t SPI_CPOL //待机为高电平SPI_CPOL_High
uint16_t SPI_CRCPolynomial //默认为7,我们不用,可以不设置
uint16_t SPI_DataSize //数据大小,我们这里选8位SPI_DataSize_8b
uint16_t SPI_Direction //方向一共有四种模式,我们这里用到了SPI_Direction_2Lines_FullDuplex,也就是全双工通信的模式
uint16_t SPI_FirstBit //液晶为高位在前SPI_FirstBit_MSB
uint16_t SPI_Mode //两种模式,主机和从机,我们这里选SPI_Mode_Master
uint16_t SPI_NSS //不使用SPI_NSS_Soft
这样,我们的初始化函数如下:
void LCD_GPIOInit(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA ,ENABLE);
//SCK
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
//SDA
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
//普通输出CS
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void SPI1_Init(void)
{
SPI_InitTypeDef SPI_InitStucture;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);
SPI_InitStucture.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_4;
SPI_InitStucture.SPI_CPHA=SPI_CPHA_2Edge;
SPI_InitStucture.SPI_CPOL=SPI_CPOL_High;
SPI_InitStucture.SPI_CRCPolynomial=7;
SPI_InitStucture.SPI_DataSize=SPI_DataSize_8b;
SPI_InitStucture.SPI_Direction=SPI_Direction_2Lines_FullDuplex;
SPI_InitStucture.SPI_FirstBit=SPI_FirstBit_MSB;
SPI_InitStucture.SPI_Mode=SPI_Mode_Master;
SPI_InitStucture.SPI_NSS=SPI_NSS_Soft;
SPI_Init(SPI1,&SPI_InitStucture);
SPI_Cmd(SPI1,ENABLE);
}
这样,发送命令和数据的函数如下,我们按照手册的内容进行初始化配置后,液晶开始显示
void TransCommand(uint8_t command)
{
GPIO_ResetBits(GPIOA,GPIO_Pin_3);
SPI_I2S_SendData(SPI1,command);
while(!SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE));
}
void TransData(uint8_t data)
{
GPIO_SetBits(GPIOA,GPIO_Pin_3);
SPI_I2S_SendData(SPI1,data);
while(!SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE));
}
void LCD_Reset(void)
{
GPIO_ResetBits(GPIOA,GPIO_Pin_4);
TransCommand(RESET);
TransCommand(PWR1);
TransCommand(PWR2);
TransCommand(PWR3);
TransCommand(0X23);//调节对比度,可选0x20~0x27
TransCommand(0X81);//调节对比度
TransCommand(0x28);//可选0x00~0x3f
TransCommand(SETBIAS);//常规操作模式
TransCommand(LINEMODE);
TransCommand(ROWMODE);
TransCommand(SETBIAS);
TransCommand(FIRSTLINE); //第一行开始显示
TransCommand(LCDON); //开启显示
GPIO_SetBits(GPIOA,GPIO_Pin_4);
}