×
单片机 > 单片机程序设计 > 详情

基于51单片机的LCD1602液晶驱动实现

发布时间:2020-05-30 发布时间:
|

本文的主要内容目录:

一、LCD1602的基本介绍

二、LCD1602液晶驱动的实现


    根据对现有的LCD1602液晶的驱动进行分析,总感觉写的有些乱,有些麻烦,说白了就是不好用,这里打算自己写一个,既简单又实用的。

一、LCD1602的基本介绍

开发环境:keil, 睿智51开发板

LCD1602的液晶原理图如下:

引脚对应关系:

    P2.0  : 状态引脚,为0时表示指令或者状态,为1时表示数据

    P2.1  :读写引脚,为0时表示写,为1时表示读

    P2.2  :使能引脚,为1时使能

    P0.0 ~ P0.7 :数据引脚,用来传输数据

经过分析,整个液晶时序的核心就是两个:写命令、写数据,它们的时序如下:

寄存器的设置以及如何使用请参考LCD1602的芯片手册,这里主要说驱动的实现。


二、LCD1602液晶驱动的实现

    通过上面的分析可以看出,整个驱动的核心就是实现写命令和写数据这两个部分。

1、写命令,具体实现函数如下:

/* 写命令的函数 */  

void lcd1602_write_cmd(unsigned char cmd)  

{  

    RS = 0;  

    RW = 0;  

    P0 = cmd;   /* 写入的命令 */  

    delay_us(1);  

    EN = 1;  

    delay_us(2);  

    EN = 0;  

    RW = 1;  

}  

2、写数据,具体的实现如下:


/* 写数据的函数 */  

void lcd1602_write_data(unsigned char dat)  

{  

    RS = 1;  

    RW = 0;  

    P0 = dat;   /* 要写入的数据 */  

    delay_us(1);  

    EN = 1;  

    delay_us(2);  

    EN = 0;  

    RW = 1;  

    RS = 0;  

}  

3、LCD1602的初始化函数,主要是通过写命令、写数据来实现。


/* lcd1602的初始化函数 */  

void lcd1602_init()  

{  

    delay_us(200);  

    lcd1602_write_cmd(0x38);    /* 设置显示模式 */  

    delay_us(50);  

    lcd1602_write_cmd(0x38);  

    delay_us(50);  

    lcd1602_write_cmd(0x38);  

    delay_us(50);  

    lcd1602_write_cmd(0x0C);    /* 打开显示和设置光标 */  

    delay_us(50);  

    lcd1602_write_cmd(0x06);    /* 显示光标移动设置 */  

    delay_us(50);  

    lcd1602_write_cmd(0x01);    /* 清屏 */  

    delay_us(50);  

}  


4、实现一个具体的LCD1602液晶显示的例子:在液晶屏上面显示一个字符串,完整的代码如下所示。


#include  

  

/* 定义与LCD1602液晶相连的引脚 */  

sbit RS = P2^0;     // 状态引脚,为0时表示状态或指令,为1时表示数据  

sbit RW = P2^1;     // 读写引脚,为0时表示写,为1时表示读  

sbit EN = P2^2;     // 使能引脚,为1时使能  

  

/*  进行一段时间的软件延时,满足LCD1602液晶的时序需要 

 */  

void delay_us(int us)  

{  

    int i = 0;  

    int j = 0;  

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

        for(j = 0; j < 12; j++);  

}  

  

/* 写命令的函数 */  

void lcd1602_write_cmd(unsigned char cmd)  

{  

    RS = 0;  

    RW = 0;  

    P0 = cmd;   /* 写入的命令 */  

    delay_us(1);  

    EN = 1;  

    delay_us(2);  

    EN = 0;  

    RW = 1;  

}  

  

/* 写数据的函数 */  

void lcd1602_write_data(unsigned char dat)  

{  

    RS = 1;  

    RW = 0;  

    P0 = dat;   /* 要写入的数据 */  

    delay_us(1);  

    EN = 1;  

    delay_us(2);  

    EN = 0;  

    RW = 1;  

    RS = 0;  

}  

  

/* lcd1602的初始化函数 */  

void lcd1602_init()  

{  

    delay_us(200);  

    lcd1602_write_cmd(0x38);    /* 设置显示模式 */  

    delay_us(50);  

    lcd1602_write_cmd(0x38);  

    delay_us(50);  

    lcd1602_write_cmd(0x38);  

    delay_us(50);  

    lcd1602_write_cmd(0x0C);    /* 打开显示和设置光标 */  

    delay_us(50);  

    lcd1602_write_cmd(0x06);    /* 显示光标移动设置 */  

    delay_us(50);  

    lcd1602_write_cmd(0x01);    /* 清屏 */  

    delay_us(50);  

}  

  

/* 在LCD1602液晶上显示字符串的函数 */  

void lcd1602_show_string(unsigned char *str)  

{  

    int i = 0;  

  

    lcd1602_write_cmd(0x00 + 0x80);  

    for(i = 0; str[i] != '\0'; i++)  

        lcd1602_write_data(str[i]);  

}  

  

/* 程序的入口函数 */  

void main()  

{  

    lcd1602_init();     /* 液晶的初始化函数 */  

  

    lcd1602_show_string("TECH-PRO");    /* 在液晶上显示字符串:TECH-PRO */  

  

    while(1);  

}  



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
浅谈AVR中定时器几种工作模式