51单片机控制lcd1602显示代码
时间: 2023-09-01 12:07:38 浏览: 41
以下是基于51单片机的LCD1602显示控制代码:
```c
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit SDA=P2^0; //IIC数据总线
sbit SCL=P2^1; //IIC时钟总线
sbit RS=P1^0; //LCD1602命令/数据选择
sbit RW=P1^1; //LCD1602读/写选择
sbit EN=P1^2; //LCD1602使能信号
void Delay5ms() //5ms延时函数
{
uint x,y;
for(x=5;x>0;x--)
for(y=520;y>0;y--);
}
void IIC_Start() //IIC开始信号
{
SDA=1;
SCL=1;
Delay5ms();
SDA=0;
Delay5ms();
SCL=0;
}
void IIC_Stop() //IIC结束信号
{
SDA=0;
SCL=1;
Delay5ms();
SDA=1;
Delay5ms();
}
void IIC_SendByte(uchar dat) //IIC发送数据
{
uchar i;
for(i=0;i<8;i++)
{
if((dat<<i)&0x80) SDA=1;
else SDA=0;
SCL=1;
Delay5ms();
SCL=0;
Delay5ms();
}
SDA=1;
SCL=1;
Delay5ms();
SCL=0;
Delay5ms();
}
void Write_Cmd(uchar cmd) //写命令
{
RS=0;
RW=0;
IIC_Start();
IIC_SendByte(0x78); //写地址
IIC_SendByte(0x00); //写命令
IIC_SendByte(cmd);
IIC_Stop();
}
void Write_Data(uchar dat) //写数据
{
RS=1;
RW=0;
IIC_Start();
IIC_SendByte(0x78); //写地址
IIC_SendByte(0x40); //写数据
IIC_SendByte(dat);
IIC_Stop();
}
void Init() //初始化
{
Write_Cmd(0x38); //16*2显示,5*7点阵,8位数据接口
Write_Cmd(0x0c); //显示开,光标关,光标闪烁关
Write_Cmd(0x06); //读/写数据后地址指针加/减1,不移动光标
Write_Cmd(0x01); //清屏
}
void Display(uchar x,uchar y,uchar *str) //在指定位置显示字符串
{
uchar i;
if(x==0) Write_Cmd(0x80+y);
else Write_Cmd(0xc0+y);
for(i=0;str[i]!='\0';i++) Write_Data(str[i]);
}
void main()
{
Init();
Display(0,0,"Hello, world!");
while(1);
}
```
该代码使用了51单片机的GPIO口控制LCD1602显示屏,通过I2C总线协议与LCD1602进行通信。其中,通过函数`Write_Cmd()`和`Write_Data()`来向LCD1602写入命令和数据,通过函数`Display()`在指定位置显示字符串。主函数中先进行初始化操作,然后在第一行第一列显示"Hello, world!",程序进入死循环。