65.9K
CodeProject 正在变化。 阅读更多。
Home

在 PIC 上试验 ST7920 128×64 图形 LCD

2023年5月7日

CPOL

2分钟阅读

viewsIcon

4195

在 PIC 上试验 ST7920 128×64 图形 LCD

这是一个单色 128×64 图形 LCD,使用 ST7920 控制器,我从 eBay 购买的。

该模块使用 20 针的标准 2.54mm 连接器,使其易于在面包板上进行原型开发。

通信模式

根据数据手册,支持以下通信模式:

  • 8 位模式。数据或指令字节通过引脚 DB7-DB0 传输。
  • 4 位模式。数据或指令字节分为两部分。较高的 4 位将通过 DB7-DB4 传输,然后是较低的 4 位。DB3-DB0 引脚将不使用,应连接到地。
  • 串行模式。通过将 PSB 引脚拉低来实现。启用后,通信总共只需要 4 个引脚。串行模式仅支持写入数据。

不幸的是,我购买的板子的 PSB 引脚永久连接到 VCC。因此,只能进行并行通信。为了减少所需的输出引脚数量,我选择了 4 位模式,而不是 8 位模式。

LCD 支持图形和文本模式。

  • 文本模式下最多 16 个字符 x 4 行。
  • 图形模式下 128×64 分辨率。

初始化代码

以下代码执行 LCD 初始化,并配置文本模式下的 4 位通信。

void LCD_Init(void)
{
 LCD_REST=1;
 LCD_REST=0;
 delay_ms(5);
 LCD_REST=1;  

 delay_ms(50);

 LCD_WriteCommand(0b00100000);
 delay_ms(5);

 LCD_WriteCommand(0b00100000);
 delay_ms(5);
 
 LCD_WriteCommand(0b00001100);
 delay_ms(5);

 LCD_WriteCommand(0x01);
 delay_ms(5);

 LCD_WriteCommand(0x06);
 delay_ms(5);

 LCD_WriteCommand(0b00000010);
 delay_ms(5);
}

LCD 初始化后,以下函数将在 LCD 上显示一个 字符串

void LCD_TextDisplayString(unsigned char line, char* string)
{  
    unsigned char addr,i;
    if(line==1)
        addr=0x80; //The first line address
    else if(line==2)
        addr=0x90; //The second line address
    else if(line==3)
        addr=0x88;   //The third line address
    else if(line==4)
        addr=0x98;    //The fourth line address

    LCD_WriteCommand(addr);

    for(i=0;i<16;i++)
        LCD_WriteData(*string++);
}

这是显示四行文本时的样子。

显示图形

尽管屏幕分辨率很大,但默认文本模式由于字体较粗,只能让我显示最多 64 个字符在屏幕上。我的下一个尝试是使用图形模式,以便我可以使用我的 自定义字体 并显示更多字符。以下代码显示了如何在 LCD 上启用和禁用图形模式。

void LCD_EnableGraphics(void)
{
 LCD_WriteCommand(0x20);  
 delay_ms(1);
 LCD_WriteCommand(0x24);
 delay_ms(1);
 LCD_WriteCommand(0x26);
 delay_ms(1);
}

void LCD_DisableGraphics(void)
{
 LCD_WriteCommand(0x20);
 delay_ms(1);
}

Nokia 5110 LCD 类似,此 LCD 上的每个 8 个像素将在显示内存空间中消耗一个字节。有了这个知识,我能够快速使用我的自定义 5×7 位图字体并显示更多字符。下图显示了显示与 PIC24FJ64GA002 接口的各种传感器信息的显示屏。它可以显示最多 16×8=128 个字符。

我在该 LCD 上成功显示的各种图形。

此 LCD 的完整 C30 源代码可以从 这里 下载。如果您有兴趣,本文中源代码的语法高亮显示是使用此 工具 完成的。

© . All rights reserved.