1 资料:
http://www.ultrachip.com/cn/habout.php?id=125
http://www.gifar.com.tw/upfiles/201541103114__GFG128064A.pdf
https://wenku.baidu.com/view/41bac4323968011ca3009189.html
2 原理图
3 芯片手册管脚
4 UC1601 管脚设置
Write Only 只有 写 没有读
12–BM1 — GND
13–BM0 —- V33
14–D7 —- GND
15 –D6 — GND
01—模式就是 SPI(S9)
3-wire SPI w/ 9-bit token
(S9: conventional)
5 SPI接口设置
void init_SPI3(void)
{
/* Configure as a master, clock idle low, 9-bit transaction, drive output on falling clock edge and latch input on rising edge. */
/* Set IP clock divider. SPI clock rate = 1MHz */
SPI_Open(SPI3, SPI_MASTER, SPI_MODE_0, 9, 1000000);
SPI_DisableAutoSS(SPI3);
}
5.1 如何确定SPI通信模式
5.2 如何确定SPI通信速度
5.3 如何测试确定SPI 通信成功
6 读写命令
忽略 W/R 和 Read Data Byte 和 Get Status
UC1601 和UC1601s 不同
void init_LCD(void)
{
init_SPI3();
lcdWriteCommand(0xEB);
lcdWriteCommand(0x81);
lcdWriteCommand(0xA0);
lcdWriteCommand(0xC0);
lcdWriteCommand(0xAF); // Set Display Enable
}
0xAF = 1010 1111
对应上图中的16 行,Set Display Enable
0xC0 = 1100 0000
对应上图中的17 行 Set LCD Mapping Control
0xA0 = 1010 0000
对应上图中的13 行 Set Frame Rate
0x81 = 1000 0001
0xEB = 1110 1011
对应上图中的21 行 Set LCD Bias Ratio
7. UC1601 芯片的特点
支持65 x 132 的 点阵面板
支持 行顺序 或者 列顺序 呈现 显示RAM Buffer 中的内容。
8 . uc1601 寄存器以及行列定义
64行 128列
9 . 显示图像
CA — Column Address
RA — Row Address
WA— Wrap Around
PA — Page Address
MX—- Column Mirroring
MY —- Row Mirroring
SL —– Start Line
Fixed Line(FLT)
11 . 显示内容:
unsigned char Test8x16[]={
/* */
0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,
0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0
};
序号 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|---|
0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
2 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
3 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
5 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
6 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
7 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
上图是 0x0F的内容
显示效果如下:
显示的是 8x16 是横向 8 ,竖直方向上 16
12. 数据与映射
该LCD显示,PA 和CA,一起对应一个RAM 地址,往该地址写一个8位的字节数据,其显示方法为,竖直方向上,从上到下,bit0 到bit7.
13. 编写程序 注意
看到的例子程序是,每往LCD的RAM 中 写一次数据,都是先设置地址,然后再写数据。
SPI的时钟设置为1Mhz,写一次的时间为,
启动了4次SPI发送,每次是9个字节。
36 x 1us = 36 us。
设置屏上的8个点的时间为 36us,
写满整个屏的时间为,36us x 8 page x 128 = 36864us = 36.865ms
不大于50ms。
如果还想快一点,就把SPI的速度设置为2Mhz。但是不知道 LCD 是否支持这个速度。
lcdSetAddr((y/8),(LCD_Xmax+1-x-i));
lcdWriteData(Font5x7[ascii_code*5+i]);
// Set Address to LCD
void lcdSetAddr(uint8_t PageAddr, uint8_t ColumnAddr)
{
// Set PA
SPI_SET_SS0_LOW(SPI3);
SPI_WRITE_TX0(SPI3, 0xB0 | PageAddr); // Write Data
SPI_TRIGGER(SPI3); // Trigger SPI data transfer
while(SPI_IS_BUSY(SPI3)); // Check SPI3 busy status
SPI_SET_SS0_HIGH(SPI3);
// Set CA MSB
SPI_SET_SS0_LOW(SPI3);
SPI_WRITE_TX0(SPI3, 0x10 | (ColumnAddr>>4)&0xF); // Write Data
SPI_TRIGGER(SPI3); // Trigger SPI data transfer
while(SPI_IS_BUSY(SPI3)); // Check SPI3 busy status
SPI_SET_SS0_HIGH(SPI3);
// Set CA LSB
SPI_SET_SS0_LOW(SPI3);
SPI_WRITE_TX0(SPI3, 0x00 | (ColumnAddr & 0xF)); // Write Data
SPI_TRIGGER(SPI3); // Trigger SPI data transfer
while(SPI_IS_BUSY(SPI3)); // Check SPI3 busy status
SPI_SET_SS0_HIGH(SPI3);
}
// Wrtie data to LCD
void lcdWriteData(uint8_t temp)
{
SPI_SET_SS0_LOW(SPI3);
SPI_WRITE_TX0(SPI3, 0x100 + temp); // Write Data
SPI_TRIGGER(SPI3); // Trigger SPI data transfer
while(SPI_IS_BUSY(SPI3)); // Check SPI3 busy status
SPI_SET_SS0_HIGH(SPI3);
}
14. arduino IDE 控制 OLED
一定要用u8g2,u8g的第一版是不支持的。
接口选我上面的那个,我试了很多,这个兼容性最好。
15. SPI 时钟
假设为50ns ,1000 ns = 1us 就是 ,20个50ns。对应的是20Mhz。
可以将SPI的时钟设置为4MHZ。 这样刷屏的速度为 10ms以内。
fps是屏幕自身的刷新频率,对应于 电脑的液晶显示屏的刷新频率。
16 . 9位 数据格式。
最高为 0 表示 命令
最高为1 表示为数据,
接下来的8位为 真实的数据内容。
17 好例子
SW_Nu_LB_NUC140_v1.0\Nu_LB_NUC140_BSP\SampleCode\Nu-LB-NUC140\LCD_Bmp\
这个例子,动态的循环显示3个图片,切换速度比较快,没有拖影。效果不错。