嗨,大家好,昨天刚写好一个汇编程序,之前有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静态显示相关推荐

  1. python是高级程序语言_高级语言程序设计(Python)_中国大学MOOC(慕课)

    课程概述 "高级语言程序设计"类课程面向无编程基础的学生,培养其运用编程语言解决实际问题的编程能力,使学生掌握一门编程语言的基本语法.语句.控制结构以及结构化程序设计的基本思想和方 ...

  2. python设计五子棋程序报告_五子棋程序设计报告

    五子棋程序设计报告 宜宾学院 面向对象课程设计 学院 :_ 计算机与信息工程学院 _ 班级 : 2019 级 6 班 学生姓名 : 郑亮学号 :141106020 设计地点(单位) _________ ...

  3. java小程序例子_「小程序JAVA实战」java的聚合项目搭建(30)

    做了多年的开发,原来很多项目都是一个项目一个工程,如果用到其他的项目的依赖文件的时候的,直接手动copy过来就可以了,自从有了maven后,很多开源的项目和互联网公司都开始使用maven来构建聚合项目 ...

  4. c++调用cplex求解例子_视频教程 | 用Python玩转运筹优化求解器IBM CPLEX(二)

    编者按 优化求解器对于做运筹学应用的学生来说,意义重大. 然而直到今天,放眼望去,全网(包括墙外)几乎没有一个系统的Cplex中文求解器教程. 作为华人运筹学的最大的社区,『运筹OR帷幄』 责无旁贷, ...

  5. java可以调用python程序吗_我们可以从java调用python方法吗?

    是的,那可以做到.通常,这将通过创建PythonInterpreter对象然后使用它来调用python类来完成. 请考虑以下示例: Java: import org.python.core.PyIns ...

  6. c++调用cplex求解例子_递归算法的R语言实现 (罗汉塔、九连环、斐波那契数列等问题的求解)...

    递归算法用函数来实现,通俗地说就是函数对自身的调用,求解递归问题就转化为函数的调用关系问题.函数f(n)随自变量n的增加而变化,函数的调用关系也就表现为f(n)与f(n-1)或f(n-2)关系的问题. ...

  7. qtp启动java程序_转: QTP六脉神剑之调用Java程序

    查看( 1147 ) / 评论( 21 ) 六脉神剑之调用程 序0Xp1zLN_0版权声明:原创作品,转载请以链接方式注明出自http://www.51testing.com/?35,否则将追究法律责 ...

  8. 子程序调用与宏定义的异同_微机原理 宏指令及子程序设计实验:宏指令和子程序的区别...

    西安邮电学院 微机原理实验报告 题 目: 宏指令及子程序设计实验 院系名称: 班 级: 学生姓名: 学号(8位): 指导教师: 2.5 宏令及子程序设计实验 2.5.1 实验目的 1.熟悉宏指令.宏定 ...

  9. for循环10000次花多长时间_我的三菱FX PLC学习之子程序调用与循环

    戳上方蓝字 "技成电工课堂" 关注我们哦! 上次,我们学习了程序流程转移中的条件跳转CJ,这次,我们接着向子程序调用CALL和FOR循环发起进攻吧! 显然,子程序调用CALL和FO ...

最新文章

  1. 站长日常工作必备记录详细单
  2. python在abaqus中的应用代码下载_Python-(source-code)-in--Abaqus Python语言在Abaqus中的应用(源码) - 下载 - 搜珍网...
  3. vue异常——template SyntaxError: string literal contains an unescaped line break
  4. 虚拟机vcenter如何增加磁盘_如何在家搭建一套自己的实验平台(10)iSCSI 共享存储...
  5. idea创建包怎么让包分层_idea创建Spring项目的方法步骤(图文)
  6. 圆柱属于能滚动的物体吗_小班科学领域详细教案:会滚动的物体
  7. NameNode和SecondaryNameNode的工作机制
  8. Android中突发情况数据的保存和恢复
  9. soapui直接下载响应内容为本地的文件
  10. 【功能强大的国产Mac办公软件】WPS Office for Mac 1.1.0(1454)
  11. .NET银联支付开发(一):支付
  12. 老徐和阿珍的故事:缓存穿透、缓存击穿、缓存雪崩、缓存热点,傻傻分不清楚
  13. 幼儿园科学室创设特点
  14. Java操作MongoDB数据库(简明版)
  15. 如何群发邮件?群发邮件让发收件人互相不知道?邮箱群发邮件技巧
  16. Excel将多个单元格内容整理到1个单元的2种方法
  17. unity 双指触控(以及多指触摸的代码原理分析)
  18. java 读取ssh2协议得到的数据_Java通过SSH2协议执行远程Shell脚本
  19. fopen()、fwrite()、fread()函数使用说明与示例
  20. Python 自动化教程(2) : Excel自动化:使用pandas库

热门文章

  1. SpringBoot 服务监控机制,你了解多少?
  2. 优雅的实现对外接口,要注意哪些问题?
  3. 程序员必知必会的十大排序算法
  4. keyevent 封装_adb shell input keyevent 控制按键输入的数值(收藏版)
  5. Linux终端登录微信,Ubuntu18.04安装微信(Linux通用)
  6. 【2019.09.01】2019南京网络赛
  7. day22,ConfigParser,subprocess,xlrd三个模块
  8. crm高速开发之EntityCollection
  9. css3--弹性布局
  10. Razor 中的@rendersection