子程序调用编程序例子_汇编程序设计:LCD1602静态显示
嗨,大家好,昨天刚写好一个汇编程序,之前有bug,不能正确显示,经过一天的调试修改终于改好了,和大家分享一下。
我今天给大家介绍的是LCD1602的显示,该程序是用汇编语言来写的。我们先来看一下实物效果:
LCD1602实物效果图
背面接线
伪指令定义,可以写在ORG 0000H的前面。
LCD_RS BIT P1.3 ; 伪指令,定义LCD的RS引脚 LCD_RW BIT P1.5 ;伪指令,定义LCD的RW引脚LCD_E BIT P1.4 ;伪指令,定义LCD的E引脚LCD_Status EQU 20H ;定义LCD的忙状态
以下为程序中用到的量含义说明:在Keil中应该写成注释
LCD_Status:存放LCD忙状态信息,=0,为不忙R6 存放LCD的命令字,LCD_Write_Command的入口参数R5 存放要显示的数据,LCD_Write_Dat的入口参数R4 存放显示位置,LCD_Position的入口参数R3 存放要显示的数组长度30H 延时函数的入口参数,通过给30H单元赋值,可以实现不同的延时时间。
ORG 0000H LJMP MAIN;
/**************************
主程序:MAIN
功能:主函数
************************/
ORG 0030HMAIN: MOV SP,#40H LCALL LCD_Init; MOV 30H,#5; LCALL Delay; LCALL LCD_Display; MOV 30H,#5; LCALL Delay; LJMP MAIN;
/*********************************
子程序:Nop4
功 能:6个机器周期延时
*********************************/
Nop6: NOP NOP NOP NOP NOP NOP RET // 6个空操作
/******************************************
子 程 序:LCD_Busy_Check
功 能:LCD忙检测
出口参数:LCD_Status,LCD_Status=0,说明LCD不忙;
*****************************************/
LCD_Busy_Check: CLR LCD_RS ;LCD_RS=0 SETB LCD_RW ;LCD_RW=1 SETB LCD_E ;LCD_E=1 LCALL Nop6 ;延时4个机器周期 ANL P2,#80H ;LCD_Status=P0&0x80 MOV LCD_Status,P2 ;LCD_Status=P0&0x80 CLR LCD_E RET
/***************************
子 程 序:LCD_Write_Command
功 能:向LCD发布命令
入口参数:R6,在调用该程序前应该对R6进行赋值,即LCD的命令字。
出口参数:无
*******************************/
LCD_Write_Command: NOPNEXT1: LCALL LCD_Busy_Check ; MOV A,LCD_Status ; JNZ NEXT1 ; A不等于0,说明LCD为忙状态,继续检测 CLR LCD_RS ;LCD_RS=0 CLR LCD_RW ;LCD_RW=0 CLR LCD_E ;LCD_E=0 MOV P2,R6 ;将LCD命令字送入P2口 LCALL Nop6 SETB LCD_E; LCALL Nop6 CLR LCD_E ; RET
/*********************
子 程 序:LCD_Write_Dat
功 能:向LCD发送数据
入口参数:R5,在调用该程序前应该对R5进行赋值,即向LCD写入的数据。
出口参数:无
*******************/
LCD_Write_Dat: NOPNEXT2: LCALL LCD_Busy_Check; MOV A,LCD_Status ;LCD_Status JNZ NEXT2 ; A不等于0,说明LCD为忙状态,继续检测; A=0,说明LCD不忙了。 SETB LCD_RS ; CLR LCD_RW ; CLR LCD_E ; MOV P2,R5 ;将LCD数据送入P2口 LCALL Nop6 SETB LCD_E ; LCALL Nop6 CLR LCD_E RET
/***************************
子 程 序:LCD_Position
功 能:向LCD发布命令
入口参数:R4,在调用该程序前应该对R4进行赋值。
出口参数:R6,将或运算后的数据送入R6,作为LCD_Write_Command的入口参数
**************************/
LCD_Position: MOV A,R4 ;将位置数据送入A ORL A,#80H ;设置LCD的当前显示位置 MOV R6,A ;将位置存入R6; ACALL LCD_Write_Command; RET ;
/****************************
子 程 序:LCD_Display
功 能:显示
入口参数:R4,在调用该程序前应该对R4进行赋值。
出口参数:R6,将或运算后的数据送入R6,作为LCD_Write_Command的入口参数
***************************/
LCD_Display: MOV R4,#00; LCALL LCD_Position ; 设置第一行的显示位置:00H开始 MOV DPTR,#TAB1; MOV R3,#16 LOOP1: CLR A MOVC A,@A+DPTR MOV R5,A; LCALL LCD_Write_Dat; INC DPTR; DJNZ R3,LOOP1 MOV R4,#41H ; 设置第二行的显示位置:41H开始 LCALL LCD_Position MOV DPTR,#TAB2; MOV R3,#16LOOP2: CLR A MOVC A,@A+DPTR MOV R5,A; LCALL LCD_Write_Dat; INC DPTR; DJNZ R3,LOOP2 RET;
/****************************
子 程 序:LCD_Init
功 能:LCD初始化,
入口参数:无
出口参数:无
***************************/
LCD_Init: MOV R6,#38H; LCALL LCD_Write_Command; MOV 30H,#10 LCALL DELAY MOV R6,#0FH; LCALL LCD_Write_Command; MOV 30H,#10 LCALL DELAY MOV R6,#06H; LCALL LCD_Write_Command; MOV 30H,#10 LCALL DELAY MOV R6,#01H; LCALL LCD_Write_Command; MOV 30H,#10 LCALL DELAY RET
/************************
子 程 序:Delay
功 能:延时函数
入口参数:30H
出口参数:无
***************************/
DELAY: ;误差 0us MOV R2,30H;DL0: MOV R1,#5FH DJNZ R1,$ DJNZ R2,DL0 RET
要显示的字符串,用DB进行定义
TAB1: DB "I Love MCU BY"TAB2: DB "2020.5.27 LY" END
子程序调用编程序例子_汇编程序设计:LCD1602静态显示相关推荐
- python是高级程序语言_高级语言程序设计(Python)_中国大学MOOC(慕课)
课程概述 "高级语言程序设计"类课程面向无编程基础的学生,培养其运用编程语言解决实际问题的编程能力,使学生掌握一门编程语言的基本语法.语句.控制结构以及结构化程序设计的基本思想和方 ...
- python设计五子棋程序报告_五子棋程序设计报告
五子棋程序设计报告 宜宾学院 面向对象课程设计 学院 :_ 计算机与信息工程学院 _ 班级 : 2019 级 6 班 学生姓名 : 郑亮学号 :141106020 设计地点(单位) _________ ...
- java小程序例子_「小程序JAVA实战」java的聚合项目搭建(30)
做了多年的开发,原来很多项目都是一个项目一个工程,如果用到其他的项目的依赖文件的时候的,直接手动copy过来就可以了,自从有了maven后,很多开源的项目和互联网公司都开始使用maven来构建聚合项目 ...
- c++调用cplex求解例子_视频教程 | 用Python玩转运筹优化求解器IBM CPLEX(二)
编者按 优化求解器对于做运筹学应用的学生来说,意义重大. 然而直到今天,放眼望去,全网(包括墙外)几乎没有一个系统的Cplex中文求解器教程. 作为华人运筹学的最大的社区,『运筹OR帷幄』 责无旁贷, ...
- java可以调用python程序吗_我们可以从java调用python方法吗?
是的,那可以做到.通常,这将通过创建PythonInterpreter对象然后使用它来调用python类来完成. 请考虑以下示例: Java: import org.python.core.PyIns ...
- c++调用cplex求解例子_递归算法的R语言实现 (罗汉塔、九连环、斐波那契数列等问题的求解)...
递归算法用函数来实现,通俗地说就是函数对自身的调用,求解递归问题就转化为函数的调用关系问题.函数f(n)随自变量n的增加而变化,函数的调用关系也就表现为f(n)与f(n-1)或f(n-2)关系的问题. ...
- qtp启动java程序_转: QTP六脉神剑之调用Java程序
查看( 1147 ) / 评论( 21 ) 六脉神剑之调用程 序0Xp1zLN_0版权声明:原创作品,转载请以链接方式注明出自http://www.51testing.com/?35,否则将追究法律责 ...
- 子程序调用与宏定义的异同_微机原理 宏指令及子程序设计实验:宏指令和子程序的区别...
西安邮电学院 微机原理实验报告 题 目: 宏指令及子程序设计实验 院系名称: 班 级: 学生姓名: 学号(8位): 指导教师: 2.5 宏令及子程序设计实验 2.5.1 实验目的 1.熟悉宏指令.宏定 ...
- for循环10000次花多长时间_我的三菱FX PLC学习之子程序调用与循环
戳上方蓝字 "技成电工课堂" 关注我们哦! 上次,我们学习了程序流程转移中的条件跳转CJ,这次,我们接着向子程序调用CALL和FOR循环发起进攻吧! 显然,子程序调用CALL和FO ...
最新文章
- 站长日常工作必备记录详细单
- python在abaqus中的应用代码下载_Python-(source-code)-in--Abaqus Python语言在Abaqus中的应用(源码) - 下载 - 搜珍网...
- vue异常——template SyntaxError: string literal contains an unescaped line break
- 虚拟机vcenter如何增加磁盘_如何在家搭建一套自己的实验平台(10)iSCSI 共享存储...
- idea创建包怎么让包分层_idea创建Spring项目的方法步骤(图文)
- 圆柱属于能滚动的物体吗_小班科学领域详细教案:会滚动的物体
- NameNode和SecondaryNameNode的工作机制
- Android中突发情况数据的保存和恢复
- soapui直接下载响应内容为本地的文件
- 【功能强大的国产Mac办公软件】WPS Office for Mac 1.1.0(1454)
- .NET银联支付开发(一):支付
- 老徐和阿珍的故事:缓存穿透、缓存击穿、缓存雪崩、缓存热点,傻傻分不清楚
- 幼儿园科学室创设特点
- Java操作MongoDB数据库(简明版)
- 如何群发邮件?群发邮件让发收件人互相不知道?邮箱群发邮件技巧
- Excel将多个单元格内容整理到1个单元的2种方法
- unity 双指触控(以及多指触摸的代码原理分析)
- java 读取ssh2协议得到的数据_Java通过SSH2协议执行远程Shell脚本
- fopen()、fwrite()、fread()函数使用说明与示例
- Python 自动化教程(2) : Excel自动化:使用pandas库
热门文章
- SpringBoot 服务监控机制,你了解多少?
- 优雅的实现对外接口,要注意哪些问题?
- 程序员必知必会的十大排序算法
- keyevent 封装_adb shell input keyevent 控制按键输入的数值(收藏版)
- Linux终端登录微信,Ubuntu18.04安装微信(Linux通用)
- 【2019.09.01】2019南京网络赛
- day22,ConfigParser,subprocess,xlrd三个模块
- crm高速开发之EntityCollection
- css3--弹性布局
- Razor 中的@rendersection