51单片机系列——学习LCD1602液晶显示-8总线-显示一串字符

小编今天重温一下LCD1602液晶显示的内容,做了个8总线方式显示一串字符“ First Try ”的实验
仿真图如下:
图1
代码如下:
LCD1602.h

#ifndef _LCD1602_H_
#define _LCD1602_H_

#include <reg52.h>

//重定义关键字
#ifndef uchar
#define uchar unsigned char
#endif

#ifndef uint 
#define uint unsigned int
#endif

/**********************************
PIN口定义
**********************************/
#define Lcd1602DataPin P0
sbit LCD1602_E=P2^7;
sbit LCD1602_RW=P2^5;
sbit LCD1602_RS=P2^6;

/**********************************
函数声明
**********************************/
/*在51单片机12MHZ时钟下的延时函数*/
void Lcd1602_Delay1ms(uint c);   //误差 0us
/*LCD1602写入8位命令子函数*/
void LcdWriteCom(uchar com);
/*LCD1602写入8位数据子函数*/ 
void LcdWriteData(uchar dat) ;
/*LCD1602初始化子程序*/  
void Lcd1602Init();

#endif

LCD1602.c

#include "lcd1602.h"
/*******************************************************************************
* 函 数 名         : Lcd1602_Delay1ms
* 函数功能     : 延时函数
* 输    入         : c
* 输    出         : 无
*******************************************************************************/
void Lcd1602_Delay1ms(uint c){//延时函数
    uchar a,b;
 for (; c>0; c--){
   for (b=199;b>0;b--){
     for(a=1;a>0;a--);
   }      
 }    
}

/*******************************************************************************
* 函 数 名         : LcdWriteCom
* 函数功能     : 向LCD写入一个字节的命令
* 输    入         : com
* 输    出         : 无
*******************************************************************************/
void LcdWriteCom(uchar com)   //写入命令
{
 LCD1602_E = 0;     //使能
 LCD1602_RS = 0;    /*选择发送命令*/
 LCD1602_RW = 0;    //选择写入

Lcd1602DataPin = com;     //放入命令
Lcd1602_Delay1ms(1);  //等待数据稳定
LCD1602_E = 1;           //根据写数据时序图,拉高写入时序(数据)
Lcd1602_Delay1ms(5);   //保持时间
LCD1602_E = 0;     //再拉低数据写完了,释放
}

/*******************************************************************************
* 函 数 名         : LcdWriteData
* 函数功能     : 向LCD写入一个字节的数据
* 输    入         : dat
* 输    出         : 无
*******************************************************************************/     
void LcdWriteData(uchar dat)   //写入数据
{
 LCD1602_E = 0; //使能清零
 LCD1602_RS = 1; /*选择输入数据*/
 LCD1602_RW = 0; //选择写入

Lcd1602DataPin = dat; //写入数据
Lcd1602_Delay1ms(1);
LCD1602_E = 1;   //写入时序
Lcd1602_Delay1ms(5);   //保持时间
LCD1602_E = 0;
}

/*******************************************************************************
* 函 数 名       : Lcd1602Init()
* 函数功能   : 初始化LCD屏
* 输    入       : 无
* 输    出       : 无
*******************************************************************************/     
void Lcd1602Init()        //LCD初始化子程序
{
 LcdWriteCom(0x38);  //开显示,设置为8总线,2行显示,5*7点阵,这是“功能设定指令”
 LcdWriteCom(0x0c);  //开显示不显示光标,“显示开关控制指令”
 LcdWriteCom(0x06);  //写一个指针加1,“进入模式设置指令”
 LcdWriteCom(0x01);  //清屏,“清屏指令”
 LcdWriteCom(0x80);  //设置数据指针起点,第一个字符是在0x00,位置,但写入的数据地址格式必须是0x**+0x80,因此在这提前加地址加一个0x80;这里不写也行但必须在main函数中调用前将数据要写入的地址+0x80
}

main.c

#include <reg52.h>
#include"lcd1602.h"

#define uint unsigned int
#define uchar unsigned char

uchar DisplayData[]=" First Try "; //定义要显示的字符串,空格也算一个字符
void main(void){
 uchar i;
 Lcd1602Init(); //调用LCD1602的初始化函数,初始化函数中用到了写命令函数的调用
 for(i=0;i<11;i++){ //循环调用LCD1602写数据函数,分别写入字符
  LcdWriteData(DisplayData[i]);
 }
 while(1); //死循环在这儿,这样数据就能一直静态显示:因为数据输入LCD1602后会一直存放在DDRAM中,直至改变
}

实验结果:
图2
总结使用LCD1602的方法:
1、先进行LCD1602的初始化,即初始化函数Lcd1602Init();
需要初始化的内容有
(1):图3(2):图4
(3):图5
(4):图6
初始化时必须对这些进行设定,通过自己编写的写命令函数将这些功能命令字节写入LCD1602中
在我们的程序中我们还将光标的位置进行了设置,也就是数据在哪个点阵开始显示的。当然了你可以不在初始化中写确定显示地址命令,在mian.c文件中显示之前确定显示地址即可。
(5):确定显示地址命令:图7

2、初始化完后,就可以通过自己写的写数据函数,向LCD的DDRAM写入要显示的字符了。

问题:
1、都是写入数据,都是写入一个字节,为啥要整一个写命令函数“”和“写数据函数”呢?
答:原因就在于写命令和写数据时对LCD1602_RS引脚的高低电平要求不一样。
写命令:LCD1602_RS=0;
写数据:LCD1602_RS=1;
因此要分开写两个函数实现功能。

2、确定显示的地址,为什么在地址+0x80
答:上图(5)写入显示地址命令的固定格式:0x80+显示地址

3、写时序:
图8
4、怎么单独显示一个字符

uchar dat=1;
dat=dat+0x30;
LcdWriteData(dat);//这样就可以了,ASCII码的形式

5、怎么在第二行显示

//实现在第二行显示:
 LcdWriteCom(0x40+0x80);  //通过写命令函数,先重新确认光标的位置
 for(i=0;i<11;i++){ //再循环调用LCD1602写数据函数,分别写入字符
  LcdWriteData(DisplayData[i]);
}

5、LCD1602的RAM地址映射
图9
结束语:静心的去学习,才能有收获,哪有什么一蹴而就的成功。

  • 4
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于单片机的的LCD1602显示,C语言编程。#include "lcd.h" void Lcd1602_Delay1ms(uint c) { uchar a,b; for (; c>0; c--) { for (b=199;b>0;b--) { for(a=1;a>0;a--); } } } /******************************************************************************* * 函 数 名 : LcdWriteCom * 函数功能 : 写命令 * 输 入 : com * 输 出 : 无 *******************************************************************************/ void LcdWriteCom(uchar com) { LCD1602_E = 0; LCD1602_RS = 0; LCD1602_RW = 0; LCD1602_DATAPINS = com; Lcd1602_Delay1ms(1); LCD1602_E = 1; Lcd1602_Delay1ms(5); LCD1602_E = 0; } /******************************************************************************* * 函 数 名 : LcdWriteData * 函数功能 : 写数据 * 输 入 : dat * 输 出 : 无 *******************************************************************************/ void LcdWriteData(uchar dat) { LCD1602_E = 0; LCD1602_RS = 1; LCD1602_RW = 0; LCD1602_DATAPINS = dat; Lcd1602_Delay1ms(1); LCD1602_E = 1; Lcd1602_Delay1ms(5); LCD1602_E = 0; } /******************************************************************************* * 函 数 名 : LcdInit() * 函数功能 : 初始化LCD屏 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void LcdInit() { LcdWriteCom(0x38); //开显示 LcdWriteCom(0x0c); //开显示显示光标 LcdWriteCom(0x06); //写一个指针加1 LcdWriteCom(0x01); //清屏 LcdWriteCom(0x80); //设置数据指针起点 } /******************************************************************************* * 函 数 名 : LcdIdiszhu() * 函数功能 : 主屏显示 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void lcddiszhu() { uchar i; uchar lcd1[]="Model i ii iii"; uchar lcd2[]="Choose 1 2 3 "; LcdWriteCom(0x80); for(i=0;i<15;i++) { LcdWriteData(lcd1[i]); } LcdWriteCom(0x80+0x40); fo
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值