51单片机控制lcd1602显示代码
时间: 2023-07-02 16:08:52 浏览: 715
以下是基于51单片机的LCD1602显示控制代码:
```c
#include <reg52.h> // 引入51单片机头文件
#define LCD_DB P0 // 定义LCD数据总线端口
sbit LCD_RS = P2^0; // 定义LCD寄存器选择端口
sbit LCD_RW = P2^1; // 定义LCD读写选择端口
sbit LCD_E = P2^2; // 定义LCD使能端口
void delay(unsigned int t) // 延时函数
{
unsigned int i, j;
for(i=0; i<t; i++)
for(j=0; j<100; j++);
}
void lcd_init() // 初始化LCD
{
LCD_RS = 0;
LCD_RW = 0;
LCD_E = 0;
delay(15); // 等待LCD上电稳定
LCD_DB = 0x38; // 设置8位数据总线,2行显示,5x7点阵字符
LCD_E = 1; // 使能信号
delay(5);
LCD_E = 0;
delay(5);
LCD_DB = 0x0C; // 打开显示,关闭光标
LCD_E = 1; // 使能信号
delay(5);
LCD_E = 0;
delay(5);
LCD_DB = 0x06; // 光标移动设置,右移
LCD_E = 1; // 使能信号
delay(5);
LCD_E = 0;
delay(5);
LCD_DB = 0x01; // 清除LCD显示
LCD_E = 1; // 使能信号
delay(5);
LCD_E = 0;
delay(5);
}
void lcd_write_cmd(unsigned char cmd) // 写入LCD命令
{
LCD_RS = 0;
LCD_RW = 0;
LCD_E = 0;
LCD_DB = cmd;
LCD_E = 1;
delay(5);
LCD_E = 0;
}
void lcd_write_data(unsigned char dat) // 写入LCD数据
{
LCD_RS = 1;
LCD_RW = 0;
LCD_E = 0;
LCD_DB = dat;
LCD_E = 1;
delay(5);
LCD_E = 0;
}
void lcd_position(unsigned char row, unsigned char col) // 设置LCD光标位置
{
unsigned char addr;
if(row == 0)
addr = 0x80 + col; // 第一行
else
addr = 0xC0 + col; // 第二行
lcd_write_cmd(addr); // 写入地址
}
void lcd_display_string(unsigned char row, unsigned char col, unsigned char *str) // 在LCD上显示字符串
{
lcd_position(row, col); // 设置光标位置
while(*str != '\0')
{
lcd_write_data(*str); // 写入数据
str++;
}
}
void main()
{
lcd_init(); // 初始化LCD
lcd_display_string(0, 0, "Hello, World!"); // 在第一行第一列显示字符串
lcd_display_string(1, 0, "From 51 MCU!"); // 在第二行第一列显示字符串
while(1);
}
```
在这个代码中,我们首先定义了LCD的数据总线端口以及寄存器选择和读写选择端口。然后定义了一个延时函数。接下来是LCD的初始化函数,我们在这个函数中设置LCD的显示模式、开启显示、关闭光标、设置光标移动方向并清空显示屏幕。
接着我们定义了写入LCD命令和数据的函数,其中写入命令时RS端口为0,写入数据时RS端口为1。然后我们定义了设置LCD光标位置和在LCD上显示字符串的函数,这些函数都是基于写入命令和数据的函数实现的。
在主函数中,我们首先调用LCD初始化函数来初始化LCD,然后使用lcd_display_string函数在LCD上显示两行文本。最后进入一个无限循环,保持程序不退出。
阅读全文