### ST7920型液晶模块串行测试程序解析
#### 概述
ST7920型液晶模块是一款常见的128×64点阵图形液晶显示器控制器,广泛应用于各种电子设备上作为显示终端。该模块采用串行通信方式与主控芯片进行数据交换,支持多种指令操作以实现对显示内容的控制。本文将详细解析ST7920型液晶模块串行测试程序中的关键代码片段,并对其功能和工作原理进行深入分析。
#### 关键配置信息
- **晶振频率**:11.0592MHz
- **通信模式**:串行通信
- **作者**:来自JiangX.net
#### LCD控制器初始化与操作
在程序的实现中,首先定义了几个关键的寄存器引脚,包括选通控制信号`CS`、数据输入`SID`、时钟信号`SCLK`以及模式选择信号`PSB`。
##### 寄存器定义
```c
sbit CS = P2^0; // 选通控制
sbit SID = P2^1; // 数据输入
sbit SCLK = P2^2; // 时钟信号
sbit PSB = P2^3; // 模式选择
```
接下来,定义了一系列用于控制LCD显示状态的宏命令:
- `CLEAR_SCREEN`: 清除屏幕
- `AC_INIT`: 初始化地址计数器为00H
- `CURSE_ADD`: 设置光标移动模式
- `FUN_MODE`: 设置8位数据接口模式
- `DISPLAY_ON`: 显示开,显示光标关闭
- `DISPLAY_OFF`: 显示关
- `CURSE_DIR`: 设置地址计数器方向
- `SET_CG_AC`: 设置自定义字符地址计数器
- `SET_DD_AC`: 设置显示数据地址计数器
这些宏定义为后续的LCD控制器初始化提供了便利。
##### 延时函数
```c
void delayms(uint t) {
uint i;
while (t--) {
for (i = 0; i < 125; i++);
}
}
```
延时函数`delayms`用于产生指定毫秒的延时效果,这对于确保LCD指令的正确执行至关重要。
##### 数据发送与接收
- **发送字节**:
```c
void SendByte(uchar Dbyte) {
uchar i;
for (i = 0; i < 8; i++) {
SCLK = 0;
Dbyte = Dbyte << 1;
SID = CY;
SCLK = 1;
SCLK = 0;
}
}
```
该函数通过循环左移的方式逐位发送数据到`SID`引脚,并同步时钟信号`SCLK`。
- **接收字节**:
```c
uchar ReceiveByte(void) {
uchar i, temp1, temp2;
temp1 = 0;
temp2 = 0;
for (i = 0; i < 8; i++) {
temp1 = temp1 << 1;
SCLK = 0;
SCLK = 1;
SCLK = 0;
if (SID) temp1++;
}
for (i = 0; i < 8; i++) {
temp2 = temp2 << 1;
SCLK = 0;
SCLK = 1;
SCLK = 0;
if (SID) temp2++;
}
return ((0xf0 & temp1) + (0x0f & temp2));
}
```
接收字节函数通过两次循环分别读取高低四位数据,最终组合成一个完整的8位字节数据。
##### 检测忙状态
```c
void CheckBusy(void) {
do {
SendByte(0xfc); // 读取状态寄存器
} while (0x80 & ReceiveByte()); // BF(.7)=1 表示忙
}
```
此函数通过不断发送读取状态寄存器的命令并检查其返回值来判断LCD是否处于忙碌状态。
##### 写入命令与数据
- **写入命令**:
```c
void Lcd_WriteCmd(uchar Cbyte) {
CS = 1;
CheckBusy();
SendByte(0xf8); // 写命令
SendByte(0xf0 & Cbyte); // 发送低4位
SendByte(0xf0 & Cbyte << 4); // 发送高4位
CS = 0;
}
```
该函数负责向LCD写入控制命令。
- **写入数据**:
```c
void Lcd_WriteData(uchar Dbyte) {
CS = 1;
CheckBusy();
SendByte(0xfa); // 写数据
SendByte(0xf0 & Dbyte); // 发送低4位
SendByte(0xf0 & Dbyte << 4); // 发送高4位
CS = 0;
}
```
该函数用于向LCD写入实际显示的数据。
##### 初始化LCD
```c
void Lcd_Init(void) {
PSB = 0;
delayms(50);
Lcd_WriteCmd(0x30); // 选择8位数据接口模式
delayms(1);
Lcd_WriteCmd(0x30); // 选择8位数据接口模式
delayms(1);
Lcd_WriteCmd(0x0c); // 开显示,不显示光标
delayms(1);
Lcd_WriteCmd(0x06); // 自动光标增加
Lcd_WriteCmd(0x01); // 清屏
}
```
`Lcd_Init`函数用于初始化LCD,设置其工作模式为8位数据接口模式,开启显示功能,并清除屏幕内容,为后续的显示操作做好准备。
#### 结论
通过以上分析可以看出,该测试程序实现了对ST7920型液晶模块的基本控制功能,包括初始化、写命令、写数据等操作。通过对这些关键代码的理解,可以更好地掌握ST7920型液晶模块的工作原理及应用方法。这对于开发基于此类LCD的电子项目具有重要的指导意义。