UC1617点阵屏幕驱动

UC1617是一个单色点阵液晶屏驱动芯片,最大支持128*128分辨率。

芯片手册: https://download.csdn.net/download/qq446252221/11045952

首先要注意的是:这个驱动芯片与其它单色液晶驱动芯片有点不一样,因为它是支持4位灰度显示的!

所以它的一个像素点是2个比特,而不是普通单色屏幕那样一个像素1个比特。

1个字节8比特,对应屏幕上的4个像素点。

这个芯片支持IIC,SPI,8080通信接口,通信时序就不详细说了,看看手册就行了。

对于SPI接口:SCK上升沿时LCD采样数据,SCK下降沿LCD输出数据。

重点关注的是初始化命令,对寄存器的配置。

从手册得知,其命令编码规则是不定长编码,一个字节前面M个比特表示特定命令,剩于N比特表示数据。

M和N的长度每个命令基本都不一样。如下图所示:

验证硬件通信是否成功,应该先测试Get Status这个指令,连续读出3个字节,末尾两个字节可以判断通信是否正常。

正常情况应该是0x1E,0x00,0x74,其中第1个字节与配置有关,后面2个字节是固定值。

需要注意的时,SPI接口有特殊的命令来获取状态:

先要用SPI发送0xFE这个指令,再连续读3个字节,才是状态。

发送0xFE前CS0拉低,CD拉低表示指令,发送完0xFE后,把CD拉高表示数据,连续读3个字节,最后CS0拉高,通信结束。

伪代码如下:

void lcd_get_status(uint8_t state[3])
{
    lcd_send_cmd(0xfe);
    state[0] = lcd_recv_data();
    state[1] = lcd_recv_data();
    state[2] = lcd_recv_data();
}

手册上没有提到的SPI指令是读显存数据,与SPI读状态类似,读显存的命令字是0xFF。

以下是初始化命令伪代码:

void lcd_chip_setup(void)
{
    lcd_send_cmd(0xeb); //bias set 1/11
    lcd_send_cmd(0x24); //set tem compensation -0.15%
    lcd_send_cmd(0x2a); //set panel loading >40nF
    lcd_send_cmd(0x2F); //set pump PC[2];internal VLCD
    lcd_send_cmd(0x81); //set Vop PM[7:0]
    lcd_send_cmd(0x34); //PM[7:0]=0x34
    lcd_send_cmd(0x84); //set partial display
    lcd_send_cmd(0x8b); //set RAM address control AC[2:0]
    lcd_send_cmd(0xc0); //set LCD mapping control My Mx LC0,C2
    lcd_send_cmd(0xa3); //SET line rate  LC[4:3]
    lcd_send_cmd(0xad); //SET B/W MODE  AND DISPLAy ON  DC[ 3:2 ]
    
    //设置显示区域,默认值是就0 - 127,可以不用设置
    lcd_send_cmd(0xf4); //SET start x
    lcd_send_cmd(0x00); 
    lcd_send_cmd(0xf5); //SET start y
    lcd_send_cmd(0x00); 
    lcd_send_cmd(0xf6); //SET end x
    lcd_send_cmd(0x1f);
    lcd_send_cmd(0xf7); //SET end y
    lcd_send_cmd(0x7f);
}

写显存数据:

void lcd_flush_sram(void *data, uint32_t size)
{
    //写入前先设置起始坐标
    lcd_send_cmd(0x00); //set page start
    lcd_send_cmd(0x60); //Row start
    lcd_send_cmd(0x70); //Row start
    lcd_send_data(data, size);
}