LCD屏幕使用记录
1-屏幕简介
因项目使用到屏幕,做以简单记录备份
屏幕使用128*64点阵屏
型号为ST7567G+UC1701E
使用SPI驱动
屏幕点阵显示原理简述:
-
屏幕为128*64像素点
每位(bit)控制一个像素点 -
使用LCD_RAM[8][128]数组缓存
X轴—128对应0-127 横坐标
Y轴—8 对应0-7页 纵坐标 -
函数封装:
X轴以像素点为单位写入
Y轴以页为单位写入 -
取模大小为16 16
字符为8 16
汉字为16 * 16 -
1个像素点使用1bit控制
一个字符为8 16,占用16个字节,
一个汉字为16 16,占用32个字节 -
字符示例:
2-ST7567G屏幕
- 支持SPI和IIC驱动
-
屏幕IO接口
RSTB+CSB+A0+RWR - 读写屏幕状态和数据
- 屏幕写入数据示例:
3-UC1701屏幕
- 读写屏幕数据
4-代码示例
/*
***传输LCD数据-SPI
***以页为单位
***写入数据页, 列, 数据, 长度
***页0-7
*/
void LCD_WriteDataString(uint8_t page,uint8_t colume,uint8_t* Data,uint8_t DataLen)
{
//屏幕区别命令
if( LCD.DrvVer == UC1701)
{
//传输命令
LCD_WriteCmd(0xB0 + page); //设置页地址(0~7)
LCD_WriteCmd(0x04); //列地址 高字节
LCD_WriteData(0x00); //列地址 低字节
LCD_WriteCmd(0x01); //写入数据
}
else if( LCD.DrvVer == LCD_T_ST7567 )
{
//传输命令
LCD_WriteCmd(0xB0 + page);//设置页地址(0~7)
LCD_WriteCmd(0x10 ); //设置列地址 高字节
LCD_WriteCmd(0x00 ); //设置列地址 低字节
}
else
{
return ;
}
//传输数据
LCD_DRV_CSB_LOW();
LCD_DRV_A0_HIGH();
spi_master_tx_rx((void*)lcd_spi_base_address,DataLen,Data, NULL);
LCD_DRV_CSB_HIGH();
}
4-备忘点
1.自动识别两款屏幕的原理
上电时根据两款屏幕不同的读写指令
可以自动识别出是哪一款屏幕
UC1701-CMD=0X02
ST7567-CMD=0XFD
相当于屏幕有唯一的读写指令
2. 支持热拔插的原理
周期读写屏幕的数据,如屏幕读取异常时,
复位引脚初始化屏幕,刷新缓存
参考1
//屏幕区别命令
if(lcd_param.l_p_device_type == LCD_T_UC1701)
{
//传输命令
LCD_WriteCmd(0xB0 + page); //设置页地址(0~7)
LCD_WriteCmd(0x04); //列地址 高字节
LCD_WriteData(0x00); //列地址 低字节
LCD_WriteCmd(0x01); //写入数据
}
else if(lcd_param.l_p_device_type == LCD_T_ST7567)
{
//传输命令
LCD_WriteCmd(0xB0 + page); //设置页地址(0~7)
LCD_WriteCmd(0x10 ); //设置列地址 高字节
LCD_WriteCmd(0x00 ); //设置列地址 低字节
}
参考2
59 指定字符起始的 页码值 page 和列 column
60 */
61 void Lcd_address(unsigned char page , unsigned char column )
62 {
63 column = column - 1; //从数字1 开始计数
64 page = page - 1; //从数字1 开始计数
65 Transform_Cmd(0xb0 + page); //设置页开始的地址
66 Transform_Cmd( ((column>>4)&0x0f) + 0x10 ); //设置行开始的地址 高四位
67 Transform_Cmd(column&0x0f); //低四位
68 }
参考3
void Set_Pos(unsigned char x, unsigned char y) {
Write_IIC_Command(0xb0 + y); // 设置目标显示位置页起始地址 取值范围 0xb0 ~ 0xb7 一共8页
Write_IIC_Command(((x & 0xf0) >> 4) | 0x10); // 设置列起始地址高位 只有低4位可用 最后与上 0x10
Write_IIC_Command(x & 0x0f); // 设置列起始地址低位 只有低4位可用
参考4
//写地址
if(lcd_param.l_p_device_type == LCD_T_UC1701)
{
LCD_WriteCmd(0xB0 + y); //设置页地址(0~7)
LCD_WriteCmd(0x04); //列地址 高字节
LCD_WriteData(0x00 + x); //列地址 低字节
LCD_WriteCmd(0x01); //写入数据
}
else if(lcd_param.l_p_device_type == LCD_T_ST7567)
{
LCD_WriteCmd(0xB0 + y); //设置页地址(0~7)
LCD_WriteCmd(0x10 + ((x&0xF0)>>4) ); //设置列地址 高字节
LCD_WriteCmd(0x00 + (x&0x0F) ); //设置列地址 低字节
}
//写数据
LCD_WriteData(string);
这是一个标准可示例:
**//写地址
if(lcd_param.l_p_device_type == LCD_T_UC1701)
{
LCD_WriteCmd(0xB0 + y); //设置页地址(0~7)
LCD_WriteCmd(0x04); //列地址 高字节
LCD_WriteData(0x00 + x); //列地址 低字节
LCD_WriteCmd(0x01); //写入数据
}
else if(lcd_param.l_p_device_type == LCD_T_ST7567)
{
LCD_WriteCmd(0xB0 + y); //设置页地址(0~7)
LCD_WriteCmd(0x10 + ((x&0xF0)>>4) ); //设置列地址 高字节
LCD_WriteCmd(0x00 + (x&0x0F) ); //设置列地址 低字节
}
//写数据
LCD_WriteData(string);**