实验(四):LCD1602显示实验

news2025/8/7 7:47:58

一、实验目的与任务

        实验目的:

                1. 掌握LCD1602显示控制方法;

                2. 掌握利用Proteus进行单片机控制系统的仿真及调试方法。

                3. 掌握单片机开发板的使用。

        任务:

                1.根据要求编写程序,并写出原理性注释;

                2. 将检查程序运行的结果,分析一下是否正确;

                3. 完成所建工程的仿真及调试;

                4. 将设计程序下载至开发板验证实验结果。

二、实验内容

        设计51单片并行口实现LCD1602的显示控制,要求在Protues中设计接口电路图,并编程实现在LCD1602上显示出双行字符(显示具体内容自定)。

三、实验步骤

(1)软件实现:

实验步骤:

        1.运行Keil uVision5开发环境,按照“模块化单片机教学实验平台配套的实验指导书1.2.3 节”介绍的方法建立程esimlab4. uvproj,CPU 为AT89S51,包含启动文件STARTUP.A51。

        2.输入源程序,在Keil uVision5 开发环境中,建立源程序esimlab4.c,将上述程序加入该程序文件。并将该文件加入工程esimlab4.uvproj。

        3.设置工程esimlab4. uvproj 属性,将其晶振频率设置为11.0592MHz,选择输出可执行文件(HEX 文件),仿真方式为“Use Simulator”。

        4.构造(Build)工程esimlab4.uvproj。如果输入有误进行修改,直至调试正确,生成可执行程序 esimlab4.hex 为止。

(2)Proteus仿真:

实验步骤:

        1.运行Proteus 开发环境,建立工程,新建原理图设计文件esimlab4.pdsprj,参考图一。

图一 LCD1602显示实验仿真图

        2.设置单片机属性,将其晶振频率设置为11.0592MHz,载入KEIL生成的文件esimlab4.hex。

        3.运行仿真并观察结果。

 

图二 LCD1602显示实验原理图

(3)开发板实验验证:

        (此步骤因为条件所限,本次实验可略去,身边有开发板的同学可以下载验证)

实验步骤:

        1.关掉实验箱电源。将CPU 板插接在JK1、JK2 上,注意CPU 板的插接方向。将 LCD1602 插接在主板的 J19 上,注意插接方向。按照表1连接关系表将硬件连接好。

表1

杜邦线连接关系

线序号

线端A插接位置

线端B插接位置

开发板

端子

开发板

端子

S1

CPU_51

P2:P1.5

MAIN_BOARD

J20: E

S2

CPU_51

P2:P1.6

MAIN_BOARD

J20:RW

S3

CPU_51

P2:P1.7

MAIN_BOARD

J20:RS

P1

CPU_51

P3:P0.0~0.7

MAIN_BOARD

J18:D0-D7

        2.在仿真器断电情况下将仿真器插在 CPU 板的 CPU 插座上。将仿真器与开发 PC 机的 USB 通信口连接好,母板上电。

        3.通过PROGISP 烧写软件,利用ISP 下载线(见“模块化单片机教学实验平台配套的实验指导书1.3 节”)把HEX (esimlab4.hex)文件下载到单片机中。

        4.下载成功后,观察液晶显示器效果是否达到预期。

四、实验小结

esimlab4.c

#include <REGX51.H>
#include "LCD1602.h"//调用LCD1602文件

void main(){
	LCD_Init();//初始化LCD1602
	LCD_ShowString(1,4,"Welcome To");//调用LCD_ShowString函数
	LCD_ShowString(2,6,"ZZULI");//调用LCD_ShowString函数
	while(1);
}

LCD1602.c 

#include <REGX52.H>
#include "INTRINS.H"
//引脚配置:
/*
sbit LCD_RS=P2^6; //开发板用
sbit LCD_RW=P2^5;
sbit LCD_EN=P2^7;
*/
#define LCD_DataPort P0

sbit LCD_RS=P2^0;//仿真使用
sbit LCD_RW=P2^1;
sbit LCD_EN=P2^2;


//函数定义:
/**
  * @brief  LCD1602延时函数,11.0592MHz调用可延时1ms
  * @param  无
  * @retval 无
  */
void LCD_Delay()	
{
	unsigned char i, j;

	_nop_();
	_nop_();
	_nop_();
	i = 11;
	j = 190;
	do
	{
		while (--j);
	} while (--i);
}
/**
  * @brief  LCD1602写命令
  * @param  Command 要写入的命令
  * @retval 无
  */
void LCD_WriteCommand(unsigned char Command)
{
	LCD_RS=0;
	LCD_RW=0;
	LCD_DataPort=Command;
	LCD_EN=1;
	LCD_Delay();
	LCD_EN=0;
	LCD_Delay();
}

/**
  * @brief  LCD1602写数据
  * @param  Data 要写入的数据
  * @retval 无
  */
void LCD_WriteData(unsigned char Data)
{
	LCD_RS=1;
	LCD_RW=0;
	LCD_DataPort=Data;
	LCD_EN=1;
	LCD_Delay();
	LCD_EN=0;
	LCD_Delay();
}

/**
  * @brief  LCD1602设置光标位置
  * @param  Line 行位置,范围:1~2
  * @param  Column 列位置,范围:1~16
  * @retval 无
  */
void LCD_SetCursor(unsigned char Line,unsigned char Column)
{
	if(Line==1)
	{
		LCD_WriteCommand(0x80|(Column-1));
	}
	else if(Line==2)
	{
		LCD_WriteCommand(0x80|(Column-1+0x40));
	}
}

/**
  * @brief  LCD1602初始化函数
  * @param  无
  * @retval 无
  */
void LCD_Init()
{
	LCD_WriteCommand(0x38);//八位数据接口,两行显示,5*7点阵
	LCD_WriteCommand(0x0c);//显示开,光标关,闪烁关
	LCD_WriteCommand(0x06);//数据读写操作后,光标自动加一,画面不动
	LCD_WriteCommand(0x01);//光标复位,清屏
}

/**
  * @brief  在LCD1602指定位置开始显示所给字符串
  * @param  Line 起始行位置,范围:1~2
  * @param  Column 起始列位置,范围:1~16
  * @param  String 要显示的字符串
  * @retval 无
  */
void LCD_ShowString(unsigned char Line,unsigned char Column,char *String)
{
	unsigned char i;
	LCD_SetCursor(Line,Column);
	for(i=0;String[i]!='\0';i++)
	{
		LCD_WriteData(String[i]);
	}
}

LCD1602.h 

#ifndef __LCD1602_H__
#define __LCD1602_H__

//用户调用函数:
void LCD_Init();
void LCD_ShowString(unsigned char Line,unsigned char Column,char *String);

#endif

仿真结果

 

        通过本次实验,掌握LCD1602显示控制方法,练习了模块化编程的使用,掌握了单片机开发板的使用。

        LCD1602显示字符首先要先解决待显示字符的ASCII码的产生问题。用户只需要在C51程序中写入欲显示的字符常量或字符串常量,C51程序编译后会自动生成其标准的ASCII码,然后将生成的ASCII码送入DDRAM,内部控制电路就会自动将该ASCII码对应的字符在LCD1602上显示出来。

        要使用LCD1602显示字符,首先要对其控制器进行初始化设置,还必须对有无光标,光标的移动方向,光标是否闪烁和字符移动的方向等进行设置,才可能获得所需要的显示效果。对LCD1602的初始化、读、写、光标设置、显示数据的指针设置等,都是通过LCD1602写入命令字来实现的。

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

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

相关文章

Java入门项目——读书管理系统

Java简单实现读书管理系统一、前言二、思路及整体框架三、代码展示1.有关读书包&#xff08;Book&#xff09;2.有关用户包3.有关操作书的包一、前言 相信有很多小伙伴学习完了【JavaSE】基础语法&#xff0c;想知道自己到底学的怎么样&#xff0c;或则学完不知道这么把知识点…

JavaFX之Scene Builder的使用(开发一款GUI小工具原来这么简单)

文章目录一、前言二、JavaFX与Scene Builder下载三、Scene Builder的使用四、详细教学&#xff08;示例&#xff09;4.1 环境配置4.2 创建fxml文件以及Controller类文件4.3 自定义界面4.4 运行我们的程序五、拓展总结博主个人社区&#xff1a;开发与算法学习社区 博主个人主页&…

创建.gitignore文件并使用

创建 .gitignore文件 第一种方式 在项目根目录下直接创建一个文件&#xff0c;后缀改成 .gitignore 即可。 第二种方式 用git创建&#xff0c;到根目录下&#xff0c;执行 touch .gitignore&#xff0c;即可看见目录下已经出现了该忽略文件。 添加忽略规则 # 忽略所有以 …

httpOnly对于抵御Session劫持的个人小结

Ⅰ 什么是http only?起到什么防护作用&#xff1f; cookie中设置了HttpOnly属性&#xff0c;那么通过js脚本将无法读取到cookie信息&#xff0c;主要防护的攻击手段&#xff1a;XSS不能通过document对象直接获取cookie Ⅱ 怎么绕过http only的防护&#xff08;三种&#xff…

5、CSS——三种样式和样式优先级、CSS中颜色设置方式、标签选择器和基本选择器的优先级

目录 一、行内样式 二、内部样式 三、外部样式 1、创建外部样式步骤 2、引入外部样式的两种方式 2.1 第一种 2.2 第二种 3、style标签内的注释符号 四、样式优先级 五、CSS中颜色设置方式 1、使用颜色的英文单词 2、使用十六进制表示法 3、使用rgb()表示法…

Redis分区/分片详解

分区/分片详解 分区是分割数据到多个Redis实例的处理过程&#xff0c;因此每个实例只保存key的一个子集。 如果只使用一个redis实例时&#xff0c;其中保存了服务器中全部的缓存数据&#xff0c;这样会有很大风险&#xff0c;如果单台redis服务宕机了将会影响到整个服务。解决的…

easyExcel不同版本按照模板导出

Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存&#xff0c;poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题&#xff0c;但POI还是有一些缺陷&#xff0c;比如07版Excel解压缩以及解压后存储都是在内存中完成的…

力扣(LeetCode)7. 整数反转(C++)

模拟 整数反转&#xff0c;需要一个中间变量 ansansans &#xff0c; 循环存入 xxx 的最低位 x%10x\%10x%10&#xff0c; 然后 xx/10x x/10xx/10 &#xff0c;得到 xxx 新的最低位 。如果进入新的循环&#xff0c;ans10ans\times 10ans10 &#xff0c;让上一次的 ansansans 十…

Makefile 基础(一) —— 自定义变量、预定义变量、自动变量

目录 一、自定义变量 1、定义变量 2、使用变量 3、修改变量的值 二、预定义变量 三、自动变量 一、自定义变量 1、定义变量 变量定义有两种方式&#xff0c;一种会在使用的时候递归展开&#xff0c;一种是直接赋值。两种定义方式如下&#xff1a; 递归展开&#xff1a…

Servlet的基本使用

目录 一、Servlet是什么 二、Servlet的基本使用 1、创建项目 2、引入依赖 3、创建目录 4、编写代码 5、打包程序 6、部署程序 7、验证程序 三、优化部署方式 1、安装Smart Tomcat 2、使用Smart Tomcat 四、使用Servlet时常见的错误 1、404 2、405 3、500 4、…

Linux文件目录之查看篇【cat、more、less、head、tail、>、>>】【简直不要太详细】

目录cat 查看文件内容morelessecho&#xff1a;将输入内容到控制台>指令和>>指令&#xff1a; >输出重定向 &#xff0c;>>追加head:tailcat 查看文件内容 cat【选项】 【要查看的文件】 -n 显示行号 注意&#xff1a;cat只能浏览文件&#xff0c;并不能修…

第二章--应用层

2.1应用层协议原理 研发网络应用程序的核心是写出能够运行在不同的端系统和同构网络彼此通信的程序&#xff0c;将应用软件限制在端系统&#xff0c;从而促进大量的网络应用程序的迅速研发和部署。 2.1.1网络应用程序体系结构 应用程序的体系不同于网络的体系结构&#xff0c…

实验(二):单片机数据区传送程序设计

一、实验目的与任务 实验目的&#xff1a; 1. 掌握单片机C语言程序设计和调试方法&#xff1b; 2. 了解单片机RAM中的数据操作。 任务&#xff1a; 1.根据要求编写程序&#xff0c;并写出原理性注释&#xff1b; 2. 检查程序运行的结果&#xff0c;分析一下是否正确&#xff1…

leetcode 42.接雨水,leetcode 503. 下一个更大元素Ⅱ

“即使到不了远方&#xff0c;心中也要有远方的模样。” 文章目录1.leetcode 503. 下一个更大元素Ⅱ1.1 详细思路及步骤1.2 java版代码示例2.leetcode 42.接雨水2.1 详细思路及步骤2.2 java版代码示例1.leetcode 503. 下一个更大元素Ⅱ 1.1 详细思路及步骤 这题基本上和昨天总结…

GoWeb从无到有(读取配置文件、gin、gorm)

GoWeb从无到有 – 读取配置文件、gin、gorm 创建go项目&#xff0c;结构如下 1. golang读取配置文件 引入包 go get -u gopkg.in/ini.v1在main.go的同级目录创建config文件夹&#xff0c;在文件夹中创建配置文件 config.ini # 项目配置 [app] Port8010 # mysql配置 [mysql] …

C++初阶 Stack和Queue的介绍和使用

作者&#xff1a;小萌新 专栏&#xff1a;C初阶 作者简介&#xff1a;大二学生 希望能和大家一起进步 本篇博客介绍&#xff1a;本篇博客会简单的介绍STL中的栈和队列 本章目标 复习下栈这种数据结构特点知道怎么使用STL中的栈复习下队列这种数据结构的特点知道怎么使用STL中…

多功能螯合剂FAPI-04-NH2,FAPI04-氨基,含有DOTA配体显示出良好的药代动力学

NH2-FAPI-04产品描述&#xff1a; FAPI是FAP的特异性抑制剂。在这些FAPI中&#xff0c;含有DOTA配体(FAPI-04)的[68Ga]Ga-DOTA-FAPI-04 PET/CT能显示出良好的体内药代动力学&#xff0c;导致快速kidney​清除和注射后10分钟至3小时的低背景活性。不久之后&#xff0c;[68Ga]Ga-…

Mybatis+Mybatis-plus+SpringBoot整合(完整版)

文章目录一、Mybatis&#xff08;一&#xff09;Mybatis简介1、Mybatis历史2、Mybatis特性3、Mybatis下载4、和其它持久化层技术对比&#xff08;二&#xff09;搭建Mybatis1、MySQL不同版本的注意事项2、创建Maven工程1、引入依赖3、创建MyBatis的核心配置文件3.1、核心配置文…

SpringMVC学习笔记

目录 SpringMVC 为什么出现了SpringMVC? 什么是SpringMVC? 简单使用 SpringMVC工作流程 设置bean加载控制 在服务器启动时加载SpringConfig 后台接受五种类型参数传递 REST风格 描述 RESTful入门 新建以下目录 实体类 控制器 统一异常处理 新建Code类用于记…

c#反序列化json

语句&#xff1a;JsonConvert.DeserializeObject(json); json字符串&#xff1a; [ { "id": "130000", "cityList": [ { "cityList": [ { …