写一个51单片机用IIC驱动LCD1602的驱动代码
时间: 2024-01-25 10:02:11 浏览: 122
下面是一个简单的51单片机用IIC驱动LCD1602的驱动代码示例:
```
#include <reg52.h>
#define LCD1602_I2C_ADDR 0x27 // IIC通信地址
sbit SDA = P1^0; // SDA引脚
sbit SCL = P1^1; // SCL引脚
void delay_us(unsigned int us) // 微秒级延时函数
{
while (us--)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
void i2c_start(void) // 发送IIC起始信号
{
SDA = 1;
SCL = 1;
delay_us(5);
SDA = 0;
delay_us(5);
SCL = 0;
}
void i2c_stop(void) // 发送IIC停止信号
{
SDA = 0;
SCL = 1;
delay_us(5);
SDA = 1;
delay_us(5);
}
void i2c_write_byte(unsigned char dat) // 向IIC总线发送一个字节数据
{
unsigned char i;
for (i = 0; i < 8; i++)
{
SDA = (dat & 0x80) >> 7;
dat <<= 1;
SCL = 1;
delay_us(5);
SCL = 0;
delay_us(5);
}
}
void lcd1602_write_cmd(unsigned char cmd) // 向LCD1602写入指令
{
i2c_start();
i2c_write_byte(LCD1602_I2C_ADDR << 1);
i2c_write_byte(0x00); // 写入指令
i2c_write_byte(cmd);
i2c_stop();
}
void lcd1602_write_data(unsigned char dat) // 向LCD1602写入数据
{
i2c_start();
i2c_write_byte(LCD1602_I2C_ADDR << 1);
i2c_write_byte(0x40); // 写入数据
i2c_write_byte(dat);
i2c_stop();
}
void lcd1602_init(void) // 初始化LCD1602
{
lcd1602_write_cmd(0x38); // 8位数据总线,显示2行,5×7点阵字符
lcd1602_write_cmd(0x08); // 关闭显示
lcd1602_write_cmd(0x01); // 清屏
lcd1602_write_cmd(0x06); // 光标右移
lcd1602_write_cmd(0x0C); // 开启显示,光标不闪烁
}
void lcd1602_display_string(unsigned char x, unsigned char y, unsigned char *str) // 在指定位置显示字符串
{
unsigned char i;
if (y == 0)
{
lcd1602_write_cmd(0x80 + x); // 第一行
}
else
{
lcd1602_write_cmd(0xC0 + x); // 第二行
}
for (i = 0; str[i] != '\0'; i++)
{
lcd1602_write_data(str[i]);
}
}
void main(void)
{
lcd1602_init(); // 初始化LCD1602
lcd1602_display_string(0, 0, "Hello, world!"); // 在第一行显示字符串
while (1);
}
```
该代码使用了51单片机的两个引脚进行IIC通信,通过向LCD1602写入指令和数据来控制LCD1602的显示。其中,`lcd1602_init()`函数初始化LCD1602,`lcd1602_display_string()`函数在指定位置显示字符串,`i2c_start()`、`i2c_stop()`、`i2c_write_byte()`函数实现了IIC通信协议。
阅读全文