深入浅出:一文讲透LCD1602的4位控制模式,附51单片机完整驱动代码
51单片机是源自Intel 8051内核的8位单片机统称,广泛应用于工业控制、家电等领域。其典型型号包括AT89C51、STC89C52等,采用哈佛架构,集成CPU、存储器和外设接口。以LCD1602显示屏为例,51单片机可通过4位数据模式进行控制,分两次传输8位数据以节省I/O口资源。开发中需注意初始化时序、数据分时传输等关键点,配合Keil等工具链实现功能。这种经典架构在嵌入式教学中仍保持重要
51单片机详细介绍
概述
51单片机是指Intel的MCS-51系列单片机,后来被众多厂商生产兼容产品,成为全球最流行的8位单片机系列之一。

51单片机泛指兼容英特尔8051指令系统的8位单片机统称,技术源自Intel 1980年代推出的8051内核,广泛应用于家电控制、汽车电子、工业测控及通信设备领域,也是国内高校单片机教学的主要硬件平台 [3]。典型型号包括ATMEL的89C51、89S51及STC公司的增强型89C52等,主流厂商涵盖Atmel、STC、Philips等。
该系列采用哈佛架构,集成8位CPU、Flash程序存储器、RAM数据存储器及定时器/中断系统。新型号如89S51支持33MHz工作频率与ISP在线编程,内置双工UART、看门狗定时器及改进型加密算法,全系保持向下兼容特性 [1]。硬件层面配备40引脚PDIP封装,包含4组准双向I/O端口,支持宽电压供电(3.3V-5.5V)及外部晶振电路配置。开发工具链涵盖Keil集成环境与STC-ISP烧录软件。
核心架构
-
CPU:8位微处理器
-
ROM:4KB-64KB程序存储器
-
RAM:128B-1KB数据存储器
-
工作频率:通常0-24MHz(经典为12MHz)
-
指令周期:大多数指令为1-2个机器周期
51最小系统原理图

主要品牌及其产品
-
Atmel(艾特梅尔):89C51、89C52、89C2051,89S51(RC),89S52(RC)等;
-
STC(宏晶):STC89C51、STC90C51、STC11系列、STC15系列、STC8系列等。
LCD1602的4位数据口基本原理

4位模式 vs 8位模式
-
8位模式:使用8根数据线(D0-D7)一次性传输一个字节
-
4位模式:使用4根数据线(D4-D7)分两次传输一个字节
-
先传输高4位
-
再传输低4位
-
4位模式的优势
-
节省IO口:从8个数据引脚减少到4个
-
硬件简化:连接更简单,布线更少
-
功能完整:保持所有LCD功能
总结
4位数据口控制的核心原理是:
-
分时复用:用4根数据线分两次传输8位数据
-
高位优先:先传输高4位,再传输低4位
-
使能同步:每次4位数据传输都需要使能脉冲同步
-
初始化关键:必须按照特定序列切换到4位模式
这种方法在保证功能完整性的同时,大大节省了单片机的IO口资源。
LCD1602仿真图

代码实现
lcd1602.h代码实现:
#ifndef __LCD1602_H__
#define __LCD1602_H__
// LCD初始化
void lcd_init(void);
// 清屏
void lcd_clear(void);
// 显示字符串
void lcd_display_string(unsigned char x, unsigned char y, unsigned char *str);
// 显示字符
void lcd_display_char(unsigned char x, unsigned char y, unsigned char dat);
#endif
lcd1602.c代码实现:
#include <REGX52.H>
#include <intrins.h>
// 控制引脚定义
sbit RS = P2^0; // 数据/命令选择
sbit RW = P2^1; // 读/写选择
sbit EN = P2^2; // 使能信号
// 数据引脚定义 (4位模式,使用高4位)
sbit D4 = P2^3;
sbit D5 = P2^4;
sbit D6 = P2^5;
sbit D7 = P2^6;
// 延时函数
void delay_ms(unsigned int ms)
{
unsigned int i, j;
for(i = 0; i < ms; i++)
for(j = 0; j < 120; j++);
}
void delay_us(unsigned int us)
{
while(us--);
}
// 向LCD写入4位数据
void lcd_write_4bit(unsigned char Cdata)
{
D4 = (Cdata & 0x01) ? 1 : 0;
D5 = (Cdata & 0x02) ? 1 : 0;
D6 = (Cdata & 0x04) ? 1 : 0;
D7 = (Cdata & 0x08) ? 1 : 0;
EN = 1;
delay_us(5);
EN = 0;
delay_us(5);
}
// 向LCD写入命令
void lcd_write_cmd(unsigned char cmd)
{
RS = 0; // 命令模式
RW = 0; // 写模式
// 先写高4位
lcd_write_4bit(cmd >> 4);
// 再写低4位
lcd_write_4bit(cmd & 0x0F);
delay_ms(2); // 等待命令执行完成
}
// 向LCD写入数据
void lcd_write_data(unsigned char dat)
{
RS = 1; // 数据模式
RW = 0; // 写模式
// 先写高4位
lcd_write_4bit(dat >> 4);
// 再写低4位
lcd_write_4bit(dat & 0x0F);
delay_us(100);
}
// LCD初始化
void lcd_init(void)
{
delay_ms(15); // 等待LCD上电稳定
// 切换到4位模式
RS = 0;
RW = 0;
lcd_write_4bit(0x03);
delay_ms(5);
lcd_write_4bit(0x03);
delay_us(100);
lcd_write_4bit(0x03);
delay_us(100);
// 进入4位模式
lcd_write_4bit(0x02);
delay_ms(1);
// 设置显示模式:2行,5x8点阵
lcd_write_cmd(0x28);
// 显示开,光标关,闪烁关
lcd_write_cmd(0x0C);
// 清屏
lcd_write_cmd(0x01);
delay_ms(2);
// 输入模式:地址递增,显示不移动
lcd_write_cmd(0x06);
}
// 设置显示位置
void lcd_set_position(unsigned char x, unsigned char y)
{
unsigned char address;
if(x == 0)
address = 0x80 + y; // 第一行
else
address = 0xC0 + y; // 第二行
lcd_write_cmd(address);
}
// 清屏
void lcd_clear(void)
{
lcd_write_cmd(0x01);
delay_ms(2);
}
// 显示字符串
void lcd_display_string(unsigned char x, unsigned char y, unsigned char *str)
{
lcd_set_position(x, y);
while(*str != '\0')
{
lcd_write_data(*str);
str++;
}
}
// 显示字符
void lcd_display_char(unsigned char x, unsigned char y, unsigned char dat)
{
lcd_set_position(x, y);
lcd_write_data(dat);
}
主函数调用:
#include <REGX52.H>
#include "lcd1602.h"
void main()
{
lcd_init();//初始化
//显示字符串
lcd_display_string(0,0,"MCU-Hello!!");
lcd_display_string(1,0,"12345678910ABCDE");
while(1)
{
}
}
仿真效果:
proteus8.17 仿真51单片机控制lcd1602显示:

显示mcu hello,12345678910ABCDE,效果图:

更多推荐



所有评论(0)