编写at89s52lcd1602程序
时间: 2023-08-08 10:04:19 浏览: 37
好的,下面是一个简单的 at89s52 控制 1602 LCD 模块的程序,使用 C 语言编写:
```c
#include <reg52.h>
#include <intrins.h>
#define FOSC 11059200L
#define BAUD 9600
sbit RS = P1^0; // 控制位 RS
sbit RW = P1^1; // 控制位 RW
sbit E = P1^2; // 使能位 E
void DelayMs(unsigned int ms);
void InitLcd(void);
void WriteCommand(unsigned char command);
void WriteData(unsigned char dat);
void main(void)
{
InitLcd(); // 初始化 LCD
while (1)
{
WriteCommand(0x80); // 设置显示位置为第一行第一列
WriteData('H'); // 在第一行第一列显示 'H'
WriteData('e'); // 在第一行第二列显示 'e'
WriteData('l'); // 在第一行第三列显示 'l'
WriteData('l'); // 在第一行第四列显示 'l'
WriteData('o'); // 在第一行第五列显示 'o'
WriteCommand(0xC0); // 设置显示位置为第二行第一列
WriteData('W'); // 在第二行第一列显示 'W'
WriteData('o'); // 在第二行第二列显示 'o'
WriteData('r'); // 在第二行第三列显示 'r'
WriteData('l'); // 在第二行第四列显示 'l'
WriteData('d'); // 在第二行第五列显示 'd'
DelayMs(1000); // 延时一秒
}
}
void InitLcd(void)
{
DelayMs(15); // 等待 LCD 稳定
WriteCommand(0x38); // 8 位数据接口,2 行显示,5×7 点阵字符
DelayMs(5); // 等待 LCD 稳定
WriteCommand(0x0C); // 显示器开,无光标,光标不闪烁
DelayMs(5); // 等待 LCD 稳定
WriteCommand(0x06); // 清屏后地址指向增加,不移动光标
DelayMs(5); // 等待 LCD 稳定
}
void WriteCommand(unsigned char command)
{
RS = 0; // 控制位 RS 设为 0,表示发送指令
RW = 0; // 控制位 RW 设为 0,表示写入模式
E = 1; // 使能位 E 设为 1
P2 = command; // 将指令写入 P2 总线
_nop_(); // 等待一段时间
E = 0; // 使能位 E 设为 0
}
void WriteData(unsigned char dat)
{
RS = 1; // 控制位 RS 设为 1,表示发送数据
RW = 0; // 控制位 RW 设为 0,表示写入模式
E = 1; // 使能位 E 设为 1
P2 = dat; // 将数据写入 P2 总线
_nop_(); // 等待一段时间
E = 0; // 使能位 E 设为 0
}
void DelayMs(unsigned int ms)
{
unsigned int i, j;
for (i = 0; i < ms; i++)
{
for (j = 0; j < 114; j++)
{
_nop_();
}
}
}
```
该程序定义了三个控制位 RS、RW 和 E,以及使用了一个 DelayMs 函数来进行延时操作。在主函数中,程序会不断在 LCD 上循环显示 "Hello World",并且每次显示后延时一秒。
需要注意的是,在使用 at89s52 控制 1602 LCD 模块时,需要将 P2 引脚分别连接到 LCD 模块的数据总线 D0~D7 引脚上,而控制位 RS、RW 和 E 引脚需要连接到 LCD 模块的 RS、RW 和 E 引脚上。