51单片机对1602液晶控制
1602字符型液晶显示模块是专门用于显示字母、数字、符号等的点阵型液晶显示模块。可用 4 位和8 位数据传输方式。提供 57 点阵+光标和 510 点阵+光标显示模式。提供显示数据缓冲区 DDRAM,字符发生器 CGROM 和字符发生器 CGRAM。可以使用 CGRAM 来存储自已定义的最多 8 个 5*8点阵的图形字符的字模数据
接线
主机模块 P0.0~P0.7 口接到的 1602 数据总线 DB0~DB7 上。
主机模块 P2.0 接到扩展模块的 RS 端
主机模块 P2.1 接到扩展模块的 R/W 端
主机模块 P2.2 接到扩展模块的 E 端
/*要求:1602 显示
/* 单片机 P0 口(8 位)接显示模块-LCD1602 DB0-DB7
rs=P2^0
rw=P2^1
e =P2^2
/*********************************************************************/
#include <REGX52.H> // AT89S52 标准头文件
#include<intrins.h> // 包含_nop_(); // 大约 1us
sbit rs=P2^0;
sbit rw=P2^1;
sbit e =P2^2;
unsigned char code zifu1[]={" yunliang "};//这里共有 10 个数值,但在数组里有 11个最后一个是'\0'
unsigned char code zifu2[]={"xiaopeng"};
void delay(unsigned char ij)//一个不精确的时间延时
{
while(ij--);
}
bit mang()//判断是否忙 每次送完数据或命令 都要判断这个数据是否处理完毕,如果这条数据或命令没有处理完毕,那么就不能送下一条数据或命令
{
bit mang1;
rs=0;
rw=1;
e=1;
mang1=(bit)(P0&0x80);
e=0;
return mang1;
}
void xiezhiling(unsigned char cmd) //写指令
{
while(mang());
rs=0;
rw=0;
e=0;
P0=cmd;
e=1;
e=0;
}
void weizhi(unsigned char pos) //位置
{
xiezhiling(pos | 0x80);
}
void xieshuju(unsigned char dat) //写数据
{
while(mang());
rs=1;
rw=0;
e=0;
P0=dat;
e=1;
e=0;
}
void qingchu1(void) //清屏
{
xiezhiling(0x38);
delay(250);
xiezhiling(0x0f);
delay(250);
xiezhiling(0x06);
delay(250);
}
void main(void) //主函数
{
unsigned char i;
delay(255);
delay(255);
delay(255);
qingchu1();
delay(255);
delay(255);
i=0;
weizhi(0x00);//第一行的起始地址
while(zifu1[i] != '\0')//判断是否为数组的最后一个,见数组说明
{
xieshuju(zifu1[i]);
i++;
delay(50);
}
i=0;
weizhi(0x40);//第二行的起始地址
while(zifu2[i] != '\0')
{
xieshuju(zifu2[i]);
i++;
delay(50);
}
while(1);
}