### 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的电子项目具有重要的指导意义。
- 粉丝: 0
- 资源: 4
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助