PIC单片机与诺基亚3510i和5110 LCD的接口





0/5 (0投票)
如何将PIC单片机与诺基亚3510i和5110 LCD连接
最近,我开始重新对嵌入式系统产生了一些兴趣,并开始尝试使用 PIC 微控制器。 在用 HD44780 控制器成功尝试了一些标准字符 LCD 后,我决定从 eBay 上购买一些诺基亚 LCD 模块进行探索。
我购买的 2 个 LCD 模块适用于 3510i 和 5110 型号。 两者都具有内置控制器,使用串行外设接口 (SPI)。 以下是我的模块的引脚分配,请注意,引脚分配可能略有不同。
LCD 引脚分配
诺基亚 5110
诺基亚 3510i
这里唯一的区别是引脚 #5,它用作 5110 的数据/命令选择,而 3510i 则未使用。
电压差异:5.5v vs 3V
两个 LCD 都设计为使用 3.3V,但由于内部电压钳位,只要在每条线上串联一个限流电阻(约 10k),就可以使用 5V 用于 SCLK、SDATA、REST、D/C 和 CS。 3.3V 仍应应用于 VCC 和 LED 电源。 我尝试使用分压器,但没有成功,这可能是由于 LCD 内部电阻和电流消耗的变化。
通过上述连接,我们只能写入 LCD,但无法读回 LCD 响应,因为 3.3v 不足以在 PIC 中注册为逻辑“1”。 幸运的是,基本操作不需要从 LCD 读取; 所需要的只是在每次操作后有足够的延迟,以确保 LCD 准备好执行下一个命令。
我选择了 PIC16f88,仅仅因为它在我的垃圾箱里。 为简单起见,我决定使用位操作来发送数据,而不是 PIC 内置的 SPI 模块。 虽然这通常意味着复杂的代码和较低的吞吐量,但这并不重要,因为我只想让 LCD 显示一些有用的东西。
LCD 内存映射
5110 LCD 是单色的,使用 PCD8544 控制器,分辨率为 48 行 × 84 列。 单个列上的每 8 个像素会占用 LCD 内存映射中的一个字节。 填充整个 LCD 需要 504 个字节。
3510i LCD 的分辨率为 97×66,可以在 256 或 4096 种颜色下运行。 由于 256 色和 4096 色在小分辨率下似乎差别不大,我选择了 256 色以简化操作。 LCD 上的每个像素都由一个字节表示,在 256 色(8 位)模式下填充整个 LCD 需要 6402 个字节。
示例代码:显示测试图案
以下代码显示了如何在诺基亚 5110 LCD 上显示所有黑色像素。 请注意,未显示 LCD 初始化代码。
void lcd_5110_clear()
{
for (int i=0; i<84;i++)
{
unsigned char row;
for (row=0;row<6;row++)
{
//all black pixels
char data = 0xFF;
lcd_5110_send(0x40 + row,0); //Y address
lcd_5110_send(0x80 + i,0); //X address
//write to display memory
lcd_5110_send(data,1);
}
}
}
以下代码显示了如何在 3510i LCD 上显示所选颜色
void addset(unsigned char x1,unsigned char y1,unsigned char x2,unsigned char y2)
{
send(0x2a,0); //column address set
send(x1, 1);
send(x2, 1);
send(0x2B, 0); //page address set
send(y1, 1);
send(y2, 1);
send(0x2C,0 ); //memory write
}
void LCD_Clear(unsigned int value,unsigned char Color)
{
unsigned char x, y;
addset(0,0,97,66);
for(y = 0; y < 67; y ++)
{
for(x = 0; x < 98; x ++)
{
send(Color, 1);
}
}
}
显示文本和图形
到目前为止,您只能在 LCD 上显示测试图案。 如果您想显示任何有用的文本,则需要使用位图字体(和额外的代码)。 我为 3510i LCD 选择了 8×12 的字体,为 5110 LCD 选择了 5×8 的字体。 字库以及要显示的任何图形都将存储在 24C64 (8Kbytes) I2C EEPROM 中。 为了对 EEPROM 进行编程,我使用了 PonnyProg 编程器的 I2C 版本。 请注意,这可能无法在较新的 PC 上运行,因为串行端口的可用电流是有限的,并且永远无法与 USB 转串行转换器一起使用。 在我的实验中,我犯了一个愚蠢的错误,通过一个 470 欧姆的电阻添加了一个 LED 来显示编程期间的活动。 这会导致编程后数据损坏和验证错误,原因是电流消耗过大。 将电阻改为 2k 效果很好,尽管 LED 暗淡得多。
通过使用 EEPROM 存储字库和图形,5110 LCD 现在可以显示文本和一些单色位图
3510i LCD 可以做得更好。
请注意,串行端口连接器仅用于调试目的。
完整的源代码附在这里。 EEPROM 的内容包含在源代码中,名为 *eeprom.bin*。