Proteus8仿真:51单片机LCD1602显示

news2024/11/18 6:34:45

51单片机LCD1602显示

  • 元器件
  • 原理图部分
  • 代码
    • main.c
  • 工程文件

元器件

元器件名称
排阻RESPACK-8
51单片机AT89C51
LCD1602LM016L
按键BUTTON

原理图部分

在这里插入图片描述

LCD1602驱动:
HD44780显示主要有8位操作8位两行显示,4位操作8位一行显示,8位操作8位一行显示。
LCD1602主要由HD44780进行驱动,首先查看HD44780数据手册看相关引脚的作用
在这里插入图片描述

引脚作用
RS选择寄存器
RW读写控制
EA使能读和写
D0-D3数据线低四位
D4-47数据线高四位

在这里插入图片描述
然后HD44780有两个8位的寄存器,IR和DR,IR写命令,DR写数据。
在这里插入图片描述
通过RS和RW位进行寄存器操作控制。

RSRW作用
00IR写入内部操作
01读flag(DB7繁忙位)和DB0-DB6地址
11DR读内部操作
10DR写入内部操作

读时序+程序
在这里插入图片描述

uint_8 Lcd1602_read(bit Flag)
{
	uint_8 Data;
	E=0;
	RW=1;
	if(Flag==1) RS=0;  //读繁忙位
	else RS=1; //读DR寄存器
	E=1;
	Data=P0;
	E=0;
	return Data;
}

写时序+程序
在这里插入图片描述

void Lcd1602_write(bit Comm,uint_8 Data)
{
	while(Lcd1602_read(1)==1);//如果繁忙就暂停
	E=0;
	RW=0;
	if(Comm==1) RS=0; //写指令
	else RS=1; //写数据
	E=1;
	P0=Data;
	E=0;
}

然后就可以根据数据手册查看先对应的命令:
在这里插入图片描述
对于的说明由于篇幅太长就择选几个讲一下:

#define Clear_Display 0X01  //清屏
#define Display_On 0X0E //打开屏幕显示光标不闪烁  
#define Display_Off 0X00 //关闭屏幕不显示光标不闪烁 
//0000 1DCB D:1打开显示0关闭显示 C:1打开光标0关闭光标 B:1光标闪烁0光标不闪
#define Bit8_Line2_Display 0X38 //8位2行显示
#define Entry_Mode_Set 0X06 //光标右移显示器不移动
//0000 0 1 I/D S //I/D1模式自增一向右0模式自减一向左 S1光标不移动显示器移动0显示器不移动
#define Set_CGRAM00 0X80 //第一行
#define Set_CGRAM10 0XC0 //第二行
#define Shift_Function 0X14 //光标右移

然后就是根据数据手册编写初始化代码(8位操作8位2行显示):
值得注意的是在进行指令操作是不能够读取FLAG(繁忙位),通过数据手册,繁忙位为DB0-7的最高位。

void Lcd1602_init(void)
{
	Lcd1602_write(1,Bit8_Line2_Display); //设置为8位2行显示
	Lcd1602_write(1,Set_CGRAM00);//起始位置设置
	Lcd1602_write(1,Display_On); //打开显示和光标
    Lcd1602_write(1,Shift_Function);//光标右移
	Lcd1602_write(1,Entry_Mode_Set);//光标右移显示器不移动
}

这是手册中给的字模。
由于CGRAM会生成字库,所以能够自动显示字符串
在这里插入图片描述
显示函数:

void Show_String(uint_8 *line1,uint_8 *line2)
{
	uint_8 i=0;
	Lcd1602_write(1,Set_CGRAM00);
	for(i=0;i<strlen(line1);i++)
	{
		Lcd1602_write(0,line1[i]);
	}
	Lcd1602_write(1,Set_CGRAM10);
	for(i=0;i<strlen(line2);i++)
	{
		Lcd1602_write(0,line2[i]);
	}	
}

代码

本次实验由LCD1602显示时间。

main.c

代码如下:

#include <reg51.h>
#include "string.h"

#define Clear_Display 0X01  //清屏
#define Display_On 0X0E //打开屏幕显示光标不闪烁  
#define Display_Off 0X00 //关闭屏幕不显示光标不闪烁 
//0000 1DCB D:1打开显示0关闭显示 C:1打开光标0关闭光标 B:1光标闪烁0光标不闪
#define Bit8_Line2_Display 0X38 //8位2行显示
#define Entry_Mode_Set 0X06 //光标右移显示器不移动
//0000 0 1 I/D S //I/D1模式自增一向右0模式自减一向左 S1光标不移动显示器移动0显示器不移动
#define Set_CGRAM00 0X80 //第一行
#define Set_CGRAM10 0XC0 //第二行
#define Shift_Function 0X14 //光标右移
#define Cursor_Close 0X0C

//-----------Writer:CSDN 月明Mo----------------------------------------------------------------------------------------------------------------------
//-----------引脚连接------------------------------------------------------------------------------------------------------------
//RS -------- P10
//选择寄存器。
//0: 指令寄存器(用于写入)繁忙标志:
//地址计数器(供阅读)
//1: 数据寄存器(用于写入和读取)

//RW -------- P11
//0 写
//1 读

//EA -------- P12
//使能读和写

//D0-D3 数据线低四位
//D4-47 数据线高四位
//D0 -------- P00 
//D1 -------- P01
//---------
//D7 -------- P07
sbit RS=P1^0;
sbit RW=P1^1;
sbit E=P1^2;

typedef unsigned char uint_8;
typedef unsigned int uint_16;

//------------函数说明-------------------------------------------------------------------------------------------------
void Lcd1602_init(void); //初始化函数
uint_8 Lcd1602_read(bit Flag); //Lcd1602读函数
//Flag为1时读取忙碌为
//为0时读取DR寄存器
void Lcd1602_write(bit Comm,uint_8 Data);
//Comm为1时写指令,为0写数据
//Data为要写的数据
void Lcd1602_Clear(void);
//清屏
void Show_String(uint_8 *line1,uint_8 *line2);
//line1为第一行要显示的字符
//line2为第二行要显示的字符


void tim_init(void);
void delay_ms(uint_16 ms);

uint_8 mcount=55,fcount=59,scount=23; //时间定义

void main(void)
{
	uint_8 a=0;
	uint_8 line1[]="    time show"; 
	uint_8 line2[]="    00:00:00"; 
	Lcd1602_init();
	tim_init();
	while(1)
	{
		//加48是因为0和’0‘的ASCII值差48,将数字变为字符
		line2[4]=scount/10+48; //显示时十位
		line2[5]=scount%10+48;//显示时个位
		line2[7]=fcount/10+48;//显示分十位
		line2[8]=fcount%10+48;//显示分个位
		line2[10]=mcount/10+48;//显示秒十位
		line2[11]=mcount%10+48;//显示秒个位
		if(mcount>=60){mcount=0;fcount++;}//秒大于60清零
		if(fcount>=60){fcount=0;scount++;}//分大于60清零
		if(scount>=24){scount=0;}//时大于24清零
		Show_String(line1,line2);
	};
}

void Show_String(uint_8 *line1,uint_8 *line2)
{
	uint_8 i=0;
	Lcd1602_write(1,Set_CGRAM00);
	for(i=0;i<strlen(line1);i++)
	{
		Lcd1602_write(0,line1[i]);
	}
	Lcd1602_write(1,Set_CGRAM10);
	for(i=0;i<strlen(line2);i++)
	{
		Lcd1602_write(0,line2[i]);
	}	
}

void Lcd1602_init(void)
{
	Lcd1602_write(1,Bit8_Line2_Display); //设置为8位2行显示
	Lcd1602_write(1,Set_CGRAM00);//起始位置设置
	Lcd1602_write(1,Display_On); //打开显示和光标
  Lcd1602_write(1,Shift_Function);//光标右移
	Lcd1602_write(1,Entry_Mode_Set);//光标右移显示器不移动
	Lcd1602_write(1,Cursor_Close);
}

void Lcd1602_Clear(void)
{
	Lcd1602_write(1,Clear_Display);
}

void Lcd1602_write(bit Comm,uint_8 Data)
{
	while(Lcd1602_read(1)==1);//如果繁忙就暂停
	E=0;
	RW=0;
	if(Comm==1) RS=0; //写指令
	else RS=1; //写数据
	E=1;
	P0=Data;
	E=0;
}

uint_8 Lcd1602_read(bit Flag)
{
	uint_8 Data;
	E=0;
	RW=1;
	if(Flag==1) RS=0;  //读繁忙位
	else RS=1; //读DR寄存器
	E=1;
	if(Flag==1)Data=((P0&0x80)>>7);
	else Data=P0;
	E=0;
	return Data;
}

//定时器中断50ms
uint_8 t;
void time() interrupt 1
{
	t++;//每50ms进来一次
	if(t>=20){t=0;mcount++;} //50×20 ==1000 == 1s,秒加一
}

//定时器0初始化函数
void tim_init(void)
{
	TH0=(65535-50000)/255; //设置初始时间高八位
	TL0=(65535-50000)%255; //设置初始时间低八位
	EA=1;//打开总中断
	ET0=1; //打开定时器0中断
	TMOD=0X01; //定时器模式选择
	TR0=1;//开始计数
}

//延时函数
void delay_ms(uint_16 ms)
{
	uint_16 i,j;
	for(i=0;i<ms;i++)
	for(j=71;j>0;j--);
}


运行效果如图:
在这里插入图片描述

工程文件

工程文件含HD44780文档

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/96251.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Python】循环语句

目录 1.while 循环 2. for 循环 3. continue 4. break 1.while 循环 基本语法格式 while 条件&#xff1a; 循环体 条件为真&#xff0c;则执行循环体代码 条件为假&#xff0c;则结束循环 例1&#xff1a;打印 1 - 10 的整数 num 1 while num < 10:print(num)num 1 …

【AI with ML】第 10 章 :创建 ML 模型以预测序列

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

MySQL底层索引

目录 一、什么是索引&#xff1f; 二、MySQL索引结构分析【MySQL底层采用的是BTree】 1、为什么不使用二叉树&#xff1f; 2、为什么不使用红黑树&#xff1f; 3、为什么不使用Hash&#xff1f; 4、BTree与B-Tree的区别&#xff1f; 三、MySQL数据库的表结构、索引、数据 1、M…

基于Sharfetter-Gummel和改进的Sharfetter-Gummel计算对流扩散方程的通量(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

1. Arthas的命令

万恶淫为首&#xff0c;百善孝为先 Arthas命令 可以查看相应的文档: https://arthas.aliyun.com/doc/命令.html 如: https://arthas.aliyun.com/doc/grep.html https://arthas.aliyun.com/doc/cat.html 基础命令 help 查看命令帮助信息 cat 查看当前arthas 系统中的任意文件…

【算法】八月算法打卡

2022-08-01 低配版 promise class MyPromise {constructor(executor) {// 成功回调队列this._resolveQueue [];// 失败回调队列this._rejectQueue [];let resolve (val) > {while (this._resolveQueue.length) {const callback this._resolveQueue.shift();callback(v…

【iOS】对象,消息,运行期

文章目录对象&#xff0c;消息&#xff0c;运行期属性属性特质原子性方法名在对象内部尽量直接访问实例变量对象等同性特定类所具有的等同性判断等同性判定的执行深度容器中可变类的等同性以“类族模式”隐藏实现细节创建类族Cocoa里的类族在既有类中使用关联对象存放自定义数据…

原型,原型链,原型的继承

原型的作用? 1.节省内存空间 2.实现数据共享(继承) 什么是原型? 任何一个函数都有propotype属性,它本身是一个对象,我们称之为原型 构造函数,实例化对象与原型之间的关系? 1.任何一个函数都有prototype属性,它本身是一个对象,我们称之为原型 2.构造函数也是函数,也都…

C语言中头文件(.h)编写,头文件的包含<>和““很大不同

头文件书写技巧 1、头文件主要作用&#xff0c;提前声明函数&#xff0c;因为在c语言中必须先声明或定义才能使用 2、在使用到.c文件中需要把这个.h文件进行包含格式是#include <h文件>或#include "h文件名"&#xff0c;但**强烈建议用引号**&#xff0c;尖括…

【码极客精讲】do while语句

上次讲了while语句&#xff0c;这次讲一下do while语句。 do...while 循环是 while 循环的变体。在检查while()条件是否为真之前&#xff0c;该循环首先会执行一次do{}之内的语句&#xff0c;然后在while()内检查条件是否为真&#xff0c;如果条件为真的话&#xff0c;就会重复…

binder调用流程分析

binder是一个非常好的跨进程通信工具&#xff0c;Android对其进行了各种封装&#xff0c;虽然我们用起来简单&#xff0c;但是理解起来却比较困难。 1.自己设计一个跨进程通信机制 在理解binder之前呢&#xff0c;首先我们想一下&#xff0c;如果我们自己设计一个跨进程通信的…

关于树形dp问题的解决

文章目录解决套路案例展示一、二叉树的最大深度二、判断是不是平衡二叉树三、判断是不是二叉搜索树四、判断是否是满二叉树五、二叉树节点间的最大距离六、派对的最大快乐值解决套路 实际上就是设计一个递归函数&#xff0c;该递归函数一定要包含 basecase&#xff0c;即让函数…

[附源码]Python计算机毕业设计高校选课系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等…

[附源码]Python计算机毕业设计共享自习室管理系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等…

【C++】STL-string的使用

文章目录1.为什么学习string类&#xff1f;1.1 C语言中的字符串OJ题目1&#xff1a;字符串相加2.标准库中的string类2.1 string类(了解)总结&#xff1a;2.2 string类的常用接口说明1. string类对象的常见构造2.string类对象的容量操作max_sizereserve和resize3. string类对象的…

Spirng 痛苦源码学习(三)——Spring中的几个核心老大

文章目录前言一、基础接口1.Resource2.ResourceLoader3.BeanFactory&#xff08;1&#xff09;总览&#xff08;2&#xff09;继承如下&#xff08;3&#xff09;重要的工厂4. ApplicationContext前言 一开始学习spring我们首先还是要搞清楚他的整体架构&#xff0c;就是他是干…

[附源码]Node.js计算机毕业设计互联网教学平台Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

C++ Reference: Standard C++ Library reference: Containers: map: multimap: end

C官网参考链接&#xff1a;https://cplusplus.com/reference/map/multimap/end/ 公有成员函数 <map> std::multimap::end C98 iterator end(); const_iterator end() const; C11 iterator end() noexcept; const_iterator end() const noexcept;返回指向结束的iterator …

HTTP简介(GET,POST)

HTTP简介(GET,POST) 简介 HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff0c;规定了浏览器和服务器之间数据传输的规则。 演示 HTTP协议的特点 基于TCP协议: 面向连接&#xff0c;安全 TCP是一种面向连接的(建立连接之前是需要经过三次握手)、可靠的、基于…

[附源码]Python计算机毕业设计SSM基于Java家庭财务管理系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…