在本篇文章中,将探讨如何使用Nokia 3510i LCD显示屏通过SPI通信进行图形显示。首先,需要了解LCD显示屏的基本硬件连接方式,然后通过软件编程实现SPI通信,最后设置合适的颜色模型以获得最佳显示效果。
首先,需要从eBay购买一个带有SD卡插槽的LCD扩展板。该扩展板的引脚布局如下:
GND
VCC
NC
NC
NC
LCD RESET
LCD A0 (R/S)
LCD SDA
LCD SCK
LCD CS
SD SCK
SD MISO
SD MOSI
SD CS
LED+
LED-
其中,LCD控制器ST7735使用SPI通信,只需要5条数据线,分别是RESET、A0、SDA、SCK和CS。特别需要注意的是A0线,也称为R/S,它指示传输的字节应该被解释为命令还是像素数据。虽然SPI通信最好使用硬件SPI模块(PIC24FJ64GA002上有两组)以获得更快的显示速度,但如果硬件SPI不可用,也可以通过软件实现。
下面是一个使用软件实现SPI通信的示例函数:
void write_spi_byte(unsigned char c) {
char x;
for (x = 0; x < 8; x++) {
LCD_SCK = 0;
LCD_SDA = 0;
if (c & 0x80)
LCD_SDA = 1;
LCD_SCK = 1;
c <<= 1;
}
}
为了在Microchip C30编译器下编译Adafruit的Arduino库,将其转换为适用于PIC24FJ64GA002的代码,这样LCD就能很好地绘制一些图形了。
使用随附的SD卡插槽和Microchip MDD库,结合自定义的5×7字体,能够在LCD上显示一些SD卡信息。
购买的板子上有一个AMS1117内置稳压器,它期望至少5V供电到VCC,以便能够为LCD和SD卡生成3.3V。起初,错误地将3.3V供电到VCC,结果发现SD卡工作不稳定,而LCD仍然工作良好。如果在这个模块上遇到SD卡问题,请检查是否是这种情况。
ST7735控制器支持高达262,144(2^18)种颜色。然而,为了使用262K颜色,每个像素需要通过SPI传输18位数据。由于这会增加复杂性,决定使用65,536种颜色(16位),这样每个像素数据可以通过2次SPI写入来实现。
在16位颜色模式下,LCD期望像素数据以RGB565格式传输。以下是从众所周知的RGB888(24位颜色)格式转换为RGB565的示例:
#define RGB565(r,g,b) ((((r>>3)<<11) | ((g>>2)<<5) | (b>>3)))
值得注意的是,LCD似乎有两种略有不同的变体。如果模块带有黑色标签,每个像素的蓝色和红色字节将会被交换,导致显示错误的颜色。如果模块有红色或绿色标签,每个像素的字节顺序将是正确的。
要解决这个问题,可以改变上述RGB565宏来交换红色和蓝色字节,或者在初始化期间改变MADCTL寄存器的值:
writecommand(ST7735_MADCTL);
// R和B字节被交换
// writedata(0xC8);
// 正常的RGB顺序
writedata(0xC0);