datasheet

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

2018-06-25来源: eefocus 关键字:51单片机  LCD1602  液晶驱动

本文的主要内容目录:

一、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);  

}  


关键字:51单片机  LCD1602  液晶驱动

编辑:什么鱼 引用地址:http://www.eeworld.com.cn/mcu/article_2018062539961.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:51单片机之LCD1602的驱动程序
下一篇:51单片机学习笔记【五】——1602液晶屏

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

单片机A/D采样的原理

在A/D转换器中,因为输入的模拟信号在时间上式连续的,而输出的数字信号代码是离散的。所以A/D转换器在进行转换时,必须在一系列选定的瞬间(时间轴上的一些规定点上)对输入的模拟信号采样保持,然后再把这些采样值转换为数字量。因此,一般的A/D转换过程是通过采样保持、量化和编码这三个步骤完成的,即首先对输入的模拟电压采样保持,采样结束后进入保持时间,在这段时间内将采样的电压量转化为数字量,并按一定的编码形式给出转换结果,然后开始下一次采样。下图给出模拟量到数字量转换过程图:1、采样定理 可以证明,为了正确无误的用5.2.2图中所示的采样信号Vs表示模拟信号V1,必须满足: 因此,A/D转换器工作时采样频率必须高于上式所
发表于 2018-12-01
单片机A/D采样的原理

单片机C语言函数之中断函数

INT0请求标志位)和IE1由硬件自动清零;在电平触发方式下,不能自动清楚IE0和IE1。所以在中断返回前必须撤出INT0和INT1引脚的低电平,否则就会出现一次中断被CPU多次响应。     (3)串口中断中,CPU响应中断后,TI(串行口发送中断请求标志位)和RI(接收中断请求标志位)必须由软件清零。     (4)单片机复位后,TCON,SCON给位清零。C51语言允许用户自己写中断服务子程序(中断函数)首先来了解程序的格式:void 函数名() interrupt m [using n] {}关键字 interrupt m [using n] 表示这是一个
发表于 2018-12-01

STM32单片机串口的深思

其实学单片机使用的时候,往往大家都觉得简单,很快就过了,但其实有一些东西是值得深思的,我以前在写程序的时候往往都是发送数据,那么调用重写的printf()函数就可以了,但这次的项目中用到了NRF双全工通讯,这就需要串口的收发,这回就发生了写问题,具体的流水账就不说了。简单说就是串口收可比发讲究多了。void USART1_IRQHandler(void)                //串口1中断服务程序{u8 i;if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)//如果寄存器中有
发表于 2018-11-30

STM8L15x系列单片机独立看门狗配置

时钟采用LSI时钟,频率为38000Hz;为了使看门狗周期尽量大,将分频系数设置为256分频;因此在256分频情况下,看门狗超时时间最长,时间为1.7s左右:(254+1)*256/38000 = 1.717sTwdg = (C + 1) * PreDiv / f;其中:    C为计数值,取值范围为0~254;    PreDiv为分频系数,取固定值256;    f为LSI时钟频率,固定为38000;
发表于 2018-11-30

单片机/ARM死机的常见原因及解决方案

前几天在写ARM时经常死机,莫名其妙,在这搜集了一些比较好的解答和方案,给大家参考。可能原因:一 振荡器停止振荡又可以分为电源电压不稳,或者强干扰引起的振荡器停振。二 PC指针跑飞电源电压不稳或强干扰引起PC跑飞,如果看门狗不好,也会引起死机。三 设计上对长引出线的IO没有保护,静电打在IO口上引起单片机死锁,破坏了硬件逻辑功能,导致死机。四. 复位收到干扰,引起反复复位,在反复复位当中有可能会导致死机。五.电源电压 的地 不稳  ,造成电源电压 瞬间负电压 导致单片机故障 程序不发运行综上所述:设计电路时,应该注意:1.电源稳定2.IO保护3.振荡器PCB布线要注意4.复位电路设计和PCB布线5.电源,信号线干扰路径
发表于 2018-11-30
单片机/ARM死机的常见原因及解决方案

单片机看门狗的概念,原理,运用

的运行过程中,我们要在定时时间到之前对定时器进行复位如果出现死循环,或者说PC指针不能回来。那么定时时间到后就会使单片机复位。常用的WDT芯片如MAX813 ,5045, IMP 813等,价格4~10元不等.软件看门狗技术的原理和这差不多,只不过是用软件的方法实现,我们还是以51系列来讲,我们知道在51单片机中有两个定时器,我们就可以用这两个定时器来对主程序的运行进行监控。我们可以对T0设定一定的定时时间,当产生定时中断的时候对一个变量进行赋值,而这个变量在主程序运行的开始已经有了一个初值,在这里我们要设定的定时值要小于主程序的运行时间,这样在主程序的尾部对变量的值进行判断,如果值发生了预期的变化,就说明T0中断正常,如果没有发生变化则使
发表于 2018-11-29

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2018 EEWORLD.com.cn, Inc. All rights reserved
pt type="text/javascript" src="//v3.jiathis.com/code/jia.js?uid=2113614" charset="utf-8">