编写at89s52 控制 12864 模块的程序,使用 C 语言编写:
时间: 2024-02-11 08:05:40 浏览: 81
好的,下面是一个简单的 at89s52 控制 12864 LCD 模块的程序,使用 C 语言编写:
```c
#include <reg52.h>
#include <intrins.h>
#define FOSC 11059200L
#define BAUD 9600
sbit RS = P2^5; // 控制位 RS
sbit RW = P2^6; // 控制位 RW
sbit E = P2^7; // 使能位 E
void DelayUs(unsigned int us);
void InitLcd(void);
void WriteCommand(unsigned char command);
void WriteData(unsigned char dat);
void main(void)
{
InitLcd(); // 初始化 LCD
while (1)
{
WriteCommand(0x34); // 扩充指令集,设置 CGRAM 地址为 0
WriteCommand(0x36); // 打开扩充指令集,设置 SEGMENT 方向为从左往右,COM 方向为从上往下
WriteCommand(0x30); // 关闭扩充指令集,回到基本指令集
WriteCommand(0x80); // 设置显示位置为第一行第一列
WriteData('H'); // 在第一行第一列显示 'H'
WriteData('e'); // 在第一行第二列显示 'e'
WriteData('l'); // 在第一行第三列显示 'l'
WriteData('l'); // 在第一行第四列显示 'l'
WriteData('o'); // 在第一行第五列显示 'o'
WriteCommand(0x90); // 设置显示位置为第二行第一列
WriteData('W'); // 在第二行第一列显示 'W'
WriteData('o'); // 在第二行第二列显示 'o'
WriteData('r'); // 在第二行第三列显示 'r'
WriteData('l'); // 在第二行第四列显示 'l'
WriteData('d'); // 在第二行第五列显示 'd'
DelayUs(500); // 延时 500us
}
}
void InitLcd(void)
{
WriteCommand(0x30); // 关闭扩充指令集,回到基本指令集
WriteCommand(0x01); // 清屏
WriteCommand(0x06); // 清屏后地址指向增加,不移动光标
WriteCommand(0x0C); // 显示器开,无光标,光标不闪烁
}
void WriteCommand(unsigned char command)
{
RS = 0; // 控制位 RS 设为 0,表示发送指令
RW = 0; // 控制位 RW 设为 0,表示写入模式
E = 1; // 使能位 E 设为 1
P0 = command; // 将指令写入 P0 总线
DelayUs(1); // 等待一段时间
E = 0; // 使能位 E 设为 0
}
void WriteData(unsigned char dat)
{
RS = 1; // 控制位 RS 设为 1,表示发送数据
RW = 0; // 控制位 RW 设为 0,表示写入模式
E = 1; // 使能位 E 设为 1
P0 = dat; // 将数据写入 P0 总线
DelayUs(1); // 等待一段时间
E = 0; // 使能位 E 设为 0
}
void DelayUs(unsigned int us)
{
unsigned int i;
while (us--)
{
for (i = 0; i < 12; i++)
{
_nop_();
}
}
}
```
该程序定义了三个控制位 RS、RW 和 E,以及使用了一个 DelayUs 函数来进行微秒级延时操作。在主函数中,程序会不断在 LCD 上循环显示 "Hello World",并且每次显示后延时 500us。
需要注意的是,在使用 at89s52 控制 12864 LCD 模块时,需要将 P0 引脚分别连接到 LCD 模块的数据总线 D0~D7 引脚上,而控制位 RS、RW 和 E 引脚需要连接到 LCD 模块的 RS、RW 和 E 引脚上。