Proteus在线仿真1602液晶串行显示之四线模式

2025-10-25 21:20:25

1、【1】打开Proteus仿真软件,找到所需的元器件。

MCU搜索AT89C52

LCD1602搜索LM016L

排阻搜索RESPACK-8

【2】用元件器绘制好仿真电路图。

LCD1602数据地址引脚连接在P0口,P0口默认是高阻状态,加排阻使其初始状态为高电平状态。

LCD1602两个控制引脚接在P2口,LCD1602_RW引脚直接接地。

P0口只是用低四位,高四位未使用。

说明:

因为是仿真所以有些部分可以省略不管,节约时间。本经验只讲解往LCD 1602里写数据,不讲解从LCD 1602里读出数据,所以第3引脚,即读写控制引脚WR直接接地即可。

MCU选用Proteus里最常见的AT89C52单片机,其他单片机原理相似。

MCU的复位电路和振荡电路可以省略不画,但是在做事物电路图时复位电路和振荡电路必须有。

Proteus在线仿真1602液晶串行显示之四线模式

Proteus在线仿真1602液晶串行显示之四线模式

2、【1】打开Keil uVision4软件,建立好相应的工程。

【2】在工程中添加分组一下分组Core、User、Delay、LCD。

Core存放启动代码STARTUP.A51,该启动代码用汇编编写的,初学者可以不用理会。

User存放main.c文件,主函数所在的文件。

Delay存放delay.c和delay.h文件,主要用于简答延时函数。

LCD存放lcd.c和lcd.h文件主要是LCD1602相关的函数,比如写指令函数、写数据函数、初始化函数等

【3】设置IDE生成.hex文件,.hex文件通过烧录软件直接烧录到MCU中运行,仿真中也需要加载这么文件,才能看到效果。

【4】添加头文件路径。只要整个工程中的文件有.h结尾的都需要添加相应的文件路径。

【5】在main.c文件中编写主函数,然后编译下看是否有错,有错,检测并更改错误,知道没错为止。

#include<reg52.h>

void main(void)

{

while(1)

{

}

}

Proteus在线仿真1602液晶串行显示之四线模式

Proteus在线仿真1602液晶串行显示之四线模式

Proteus在线仿真1602液晶串行显示之四线模式

Proteus在线仿真1602液晶串行显示之四线模式

Proteus在线仿真1602液晶串行显示之四线模式

Proteus在线仿真1602液晶串行显示之四线模式

Proteus在线仿真1602液晶串行显示之四线模式

Proteus在线仿真1602液晶串行显示之四线模式

3、【1】编写延时函数、LCD1602 GIOP引脚的定义与初始化、LCD1602写数据函数、LCD1602写指令函数、LCD1602初始化函数等等。

【2】延时函数:

void vDelay(int i)

{

int x=0, y=0;

for(x=0; x<100; x++)

for(y=0; y<i; y++);

}

【3】LCD1602 GIOP引脚的定义:

sbit LCD1602_RS_Pin = P2^0;

sbit LCD1602_EN_Pin = P2^1;

sbit LCD1602_DB4_Pin = P0^0;

sbit LCD1602_DB5_Pin = P0^1;

sbit LCD1602_DB6_Pin = P0^2;

sbit LCD1602_DB7_Pin = P0^3;

#define LCD1602_EN_SET() LCD1602_EN_Pin = 1

#define LCD1602_EN_CLR()        LCD1602_EN_Pin = 0

#define LCD1602_RS_SET()        LCD1602_RS_Pin = 1

#define LCD1602_RS_CLR()        LCD1602_RS_Pin = 0

#define LCD1602_DB4_SET() LCD1602_DB4_Pin = 1

#define LCD1602_DB4_CLR() LCD1602_DB4_Pin = 0

#define LCD1602_DB5_SET() LCD1602_DB5_Pin = 1

#define LCD1602_DB5_CLR() LCD1602_DB5_Pin = 0

#define LCD1602_DB6_SET() LCD1602_DB6_Pin = 1

#define LCD1602_DB6_CLR() LCD1602_DB6_Pin = 0

#define LCD1602_DB7_SET() LCD1602_DB7_Pin = 1

#define LCD1602_DB7_CLR() LCD1602_DB7_Pin = 0

【4】LCD1602 GIOP引脚初始化

static void vLCD1602_GPIO_Configuration(void)

{

LCD1602_EN_CLR();

LCD1602_RS_CLR();

LCD1602_DB4_CLR();

LCD1602_DB5_CLR();

LCD1602_DB6_CLR();

LCD1602_DB7_CLR();

}

【5】LCD1602写数据函数:

void vLCD1602_Write_Data(unsigned char dat)

{

    if((dat>>7)%2==1){LCD1602_DB7_SET();}else{LCD1602_DB7_CLR();}

if((dat>>6)%2==1){LCD1602_DB6_SET();}else{LCD1602_DB6_CLR();}

if((dat>>5)%2==1){LCD1602_DB5_SET();}else{LCD1602_DB5_CLR();}

if((dat>>4)%2==1){LCD1602_DB4_SET();}else{LCD1602_DB4_CLR();}

LCD1602_RS_SET();

LCD1602_EN_SET();

vDelay(5);

LCD1602_EN_CLR();

if((dat>>3)%2==1){LCD1602_DB7_SET();}else{LCD1602_DB7_CLR();}

if((dat>>2)%2==1){LCD1602_DB6_SET();}else{LCD1602_DB6_CLR();}

if((dat>>1)%2==1){LCD1602_DB5_SET();}else{LCD1602_DB5_CLR();}

if((dat>>0)%2==1){LCD1602_DB4_SET();}else{LCD1602_DB4_CLR();}

LCD1602_RS_SET();

LCD1602_EN_SET();

vDelay(5);

LCD1602_EN_CLR();

}

【6】LCD1602写指令函数

void vLCD1602_Write_Command(unsigned char cmd)

{

    if((cmd>>7)%2==1){LCD1602_DB7_SET();}else{LCD1602_DB7_CLR();}

if((cmd>>6)%2==1){LCD1602_DB6_SET();}else{LCD1602_DB6_CLR();}

if((cmd>>5)%2==1){LCD1602_DB5_SET();}else{LCD1602_DB5_CLR();}

if((cmd>>4)%2==1){LCD1602_DB4_SET();}else{LCD1602_DB4_CLR();}

LCD1602_RS_CLR();

LCD1602_EN_SET();

vDelay(5);

LCD1602_EN_CLR();

if((cmd>>3)%2==1){LCD1602_DB7_SET();}else{LCD1602_DB7_CLR();}

if((cmd>>2)%2==1){LCD1602_DB6_SET();}else{LCD1602_DB6_CLR();}

if((cmd>>1)%2==1){LCD1602_DB5_SET();}else{LCD1602_DB5_CLR();}

if((cmd>>0)%2==1){LCD1602_DB4_SET();}else{LCD1602_DB4_CLR();}

LCD1602_RS_CLR();

LCD1602_EN_SET();

vDelay(5);

LCD1602_EN_CLR();

}

【7】LCD1602初始化函数

void vLCD1602_Initialization(void)

{

vLCD1602_GPIO_Configuration();

vDelay(5);

vLCD1602_Write_Command(0x33);

vDelay(5);

vLCD1602_Write_Command(0x32);

vDelay(5);

vLCD1602_Write_Command(0x28);

vDelay(5);

vLCD1602_Write_Command(0x0C);

vDelay(5);

vLCD1602_Write_Command(0x01);

vDelay(5);

}

【8】LCD1602显示字符串函数

void vLCD1602_Show_String(unsigned char line, unsigned char x, unsigned char *str)

{

    unsigned char WriteAdd = 0;

if(line == LINE1)

WriteAdd = LINE1_HEAD_ADDRESS + x;

else if(line == LINE2)

  WriteAdd = LINE2_HEAD_ADDRESS + x;

if((WriteAdd<LINE1_HEAD_ADDRESS) || (WriteAdd>LINE2_END_ADDRESS) || ((WriteAdd>LINE1_END_ADDRESS)&&(WriteAdd<LINE2_HEAD_ADDRESS)))

  return;

 

vLCD1602_Write_Command(WriteAdd);//LCD1602_Write_Command

  while(*str)

{

  vLCD1602_Write_Data(*str);//LCD1602_Write_Data

str++;

x++;

WriteAdd++;

if(x>=16)

{

  if(WriteAdd>=LINE2_END_ADDRESS)

{

  vLCD1602_Write_Command(LINE1_HEAD_ADDRESS);//LCD1602_Write_Command

WriteAdd = LINE1_HEAD_ADDRESS;

}

  else//WriteAdd>LINE1_END_ADDRESS

{

  vLCD1602_Write_Command(LINE2_HEAD_ADDRESS);//LCD1602_Write_Command

WriteAdd = LINE2_HEAD_ADDRESS;

}

x = 0;

}

}

}

所需要的宏定义:

#define LINE1 1

#define LINE2 2

#define LINE1_HEAD_ADDRESS 0X80

#define LINE1_END_ADDRESS 0X8F

#define LINE2_HEAD_ADDRESS 0XC0

#define LINE2_END_ADDRESS 0XCF

说明:

再开始编写代码时先要有一份1602的数据手册,

1602数据手册手册网上很多随便找一份就好。主要看LCD 1602的读写时序,最主要是写时序,包括写数据和写地址。

因为我们只往1602里写数据,所以读时序可以暂时不用看。还要明白一些基本的操作指令,这就够了,这就可以开始写程序了。

Proteus在线仿真1602液晶串行显示之四线模式

Proteus在线仿真1602液晶串行显示之四线模式

Proteus在线仿真1602液晶串行显示之四线模式

Proteus在线仿真1602液晶串行显示之四线模式

Proteus在线仿真1602液晶串行显示之四线模式

Proteus在线仿真1602液晶串行显示之四线模式

Proteus在线仿真1602液晶串行显示之四线模式

Proteus在线仿真1602液晶串行显示之四线模式

Proteus在线仿真1602液晶串行显示之四线模式

Proteus在线仿真1602液晶串行显示之四线模式

Proteus在线仿真1602液晶串行显示之四线模式

Proteus在线仿真1602液晶串行显示之四线模式

4、 编写主函数测试程序。每隔一段时间加1,并显示在LCD1602上。

#include "lcd.h"

void main(void)

{

unsigned char i = 0;

unsigned char dat = 0;

vLCD1602_Initialization(); //vLCD1602_Initialization

vLCD1602_Show_String(LINE1, 1, "System Running");

vLCD1602_Show_String(LINE2, 2, "Count:");

while(1)

{

i++;

dat = i / 100 + 0x30;

vLCD1602_Write_Command(LINE2_HEAD_ADDRESS + 9);

vLCD1602_Write_Data(dat);

dat = (i / 10) % 10 + 0x30;

vLCD1602_Write_Data(dat);

dat = i%10 + 0x30;

vLCD1602_Write_Data(dat);

vDelay(100);

}

}

Proteus在线仿真1602液晶串行显示之四线模式

5、将.hex文件加载到仿真中,验证效果。

Proteus在线仿真1602液晶串行显示之四线模式

Proteus在线仿真1602液晶串行显示之四线模式

Proteus在线仿真1602液晶串行显示之四线模式

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢