KEYBUF   EQU   40H   ;键号存放单元

ORG 0000H

LJMP MAIN

ORG 0030H

MAIN:    MOV KEYBUF,#0    ;初始键号设位0,也可以为任意值

MOV R0,#30H      ;显示首地址

MOV R2,#0CH      ;计算数据存放单元个数

CLR A

QING:    MOV @R0,A        ;将数据存放单元清零

INC R0

DJNZ R2,QING

MOV P0,#8FH      ;关闭显示

MOV R1,#30H      ;将显示首地址存放R1里

;===============================================

;五位无符号显示子程序

DIS1:    MOV R0,#30H      ;把显示数据第一位放在R0里

MOV R2,#04H      ;把显示的位码放在R2里

MOV R3,#05H      ;把显示的长度放在R3里

DIS2:    MOV A,@R0

ANL A,#0FH       ;屏蔽显示数据的高四位

MOV B,A

MOV A,R2

ANL A,#0FH       ;屏蔽位码的高四位

SWAP A

ORL A,B

MOV P0,A         ;送总显示数据到P0显示

LCALL DELY4ms    ;调用延时4ms

INC R0           ;取下一个显示数据

DEC R2

DJNZ R3,DIS2     ;四位显示晚后重新开始显示

;===================================================

;键盘扫描子程序

WAIT:    MOV P1,#0FFH        ;P1口送高电平

CLR P1.0            ;第一行清零

MOV A,P1            ;读P1口

ANL A,#0F0H         ;低位屏蔽

XRL A,#0F0H         ;判断低位是否有低电平 ,即判断是否有按键按下

JZ NOKEY1           ;地位有低电平继续扫描,否者跳到第而行去扫描

LCALL DELY10ms      ;延时10ms去抖在进行判断是否有按键按下

MOV A,P1            ;继续读P1口

ANL A,#0F0H         ;判断低位是否有低电平

CJNE A,#0E0H,NK1    ;如果扫描数据不为0E0H就转到NK1

MOV KEYBUF,#0       ;否者判断为0号键

AJMP DK             ;转DK1查表程序

NK1:     CJNE A,#0D0H,NK2    ;如果扫描数据不为0D0H就转到NK2

MOV KEYBUF,#1       ;否者判断为1号键

AJMP DK             ;转DK2查表程序

NK2:     CJNE A,#0B0H,NK3    ;如果扫描数据不为0B0H就转到NK3

MOV KEYBUF,#2       ;否者判断为2号键

AJMP DK             ;转DK3查表程序

NK3:     CJNE A,#70H,NK4     ;如果扫描数据不为70H就转到NK4

LJMP SAN_CHU

NK4:     NOP

NOKEY1:  MOV P1,#0FFH        ;和上面相同

CLR P1.1

MOV A,P1

ANL A,#0F0H

XRL A,#0F0H

JZ NOKEY2

LCALL DELY10MS

MOV A,p1

ANL A,#0F0H

XRL A,#0F0H

JZ NOKEY2

MOV A,P1

ANL A,#0F0H

CJNE A,#0E0H,NK5

MOV KEYBUF,#3

AJMP DK

NK5:     CJNE A,#0D0H,NK6

MOV KEYBUF,#4

AJMP DK

NK6:     CJNE A,#0B0H,NK7

MOV KEYBUF,#5

AJMP DK

NK7:     CJNE A,#70H,NK8

MOV KEYBUF,#10       ;否者判断为3号键

AJMP DK             ;转DK4查表程序

NK8:     NOP

NOKEY2:  MOV P1,#0FFH

CLR P1.2

MOV A,P1

ANL A,#0F0H

XRL A,#0F0H

JZ NOKEY3

LCALL DELY10MS

MOV A,P1

ANL A,#0F0H

XRL A,#0F0H

JZ NOKEY3

MOV A,P1

ANL A,#0F0H

CJNE A,#0E0H,NK9

MOV KEYBUF,#6

AJMP DK

NK9:     CJNE A,#0D0H,NK10

MOV KEYBUF,#7

AJMP DK

NK10:    CJNE A,#0B0H,NK11

MOV KEYBUF,#8

AJMP DK

NK11:    CJNE A,#70H,NK12

LJMP DENG_HAO

NK12:    NOP

NOKEY3:  MOV P1,#0FFH

CLR P1.3

MOV A,P1

ANL A,#0F0H

XRL A,#0F0H

JZ NOKEY4

LCALL DELY10MS

MOV A,P1

ANL A,#0F0H

XRL A,#0F0H

JZ NOKEY4

MOV A,P1

ANL A,#0F0H

CJNE A,#0E0H,NK13

LJMP CHU

NK13:    CJNE A,#0D0H,NK14

LJMP CHENG

NK14:    CJNE A,#0B0H,NK15

LJMP JIAN

NK15:    CJNE A,#70H,NK16

LJMP JIA

NK16:    NOP

;=======================================================

;查表求键值程序

DK:      MOV B,#00H

MOV A,KEYBUF         ;查表程序 查对应的键号数据

MOV DPTR,#TABLE      ;把表头地址放入DPTR

MOVC A,@A+DPTR       ;A里面存放的为键号,利用A和表头地址找到对应的键号数据

MOV B,A              ;把查到的数据送往显示单元

INC R1               ;取下一个显示单元

MOV A,R1

CJNE A,#36H,DKA1     ;判断显示单元是否已满

MOV R1,#35H          ;35H,36H单元用于更好的控制五位显示

AJMP DKA

DKA1:    MOV 34H,33H          ;按键代码按左移显示,先按先显示

MOV 33H,32H

MOV 32H,31H

MOV 31H,30H

MOV 30H,B

DKA:     MOV A,P1             ;读P1口

ANL A,#0F0H          ;屏蔽高四位

XRL A,#0F0H          ;地位是有低电平

JNZ DKA              ;如果有低电平继续读P1口,否者向下执行,查找第二行

NOKEY4:  LJMP DIS1

;===================================

;功能按键功能设定

DENG_HAO:MOV DPTR,#JI_SUAN    ;等号键功能通过加、减、乘、除设定的偏移量来调用子程序

MOV A,3CH            ;3CH存放的为功能程序入口地址偏移量

JMP @A+DPTR          ;转移到按键功能程序

JI_SUAN: AJMP JIA1            ;加计算子程序

AJMP JIAN1           ;减计算子程序

AJMP CHENG1          ;乘计算子程序

AJMP CHU             ;除计算子程序

;=======删除键功能

SAN_CHU: ACALL QING_DIS

AJMP DKA

;=======加键功能

JIA:     MOV 3CH,#00H

ACALL CUN_SHU

ACALL QING_DIS

AJMP DKA

;=======减键功能

JIAN:    MOV 3CH,#02H

ACALL CUN_SHU

ACALL QING_DIS

AJMP DKA

;=======乘键功能

CHENG:   MOV 3CH,#04H

ACALL CUN_SHU

ACALL QING_DIS

AJMP DKA

;=======除键功能

CHU:     MOV 3DH,#06H

ACALL CUN_SHU

ACALL QING_DIS

AJMP DKA

;=================================

;存被加(减、乘、除)数,存放在37H~3BH里

CUN_SHU: MOV 37H,30H    ;36H存放的为最低位

MOV 38H,31H

MOV 39H,32H

MOV 3AH,33H

MOV 3BH,34H    ;3AH存放的为最高位

RET

;================================

;清除显示单元

QING_DIS: MOV R1,#30H

QING1:    MOV @R1,#00H

INC R1

MOV A,R1

CJNE A,#36H,QING1

MOV R1,#30H

LOP1:     RET

;================================

;十进制加法子程序

JIA1:

MOV A,37H      ;个位被加数

ADD A,30H      ;个位被加数+加数

MOV B,#10      ;十六进制除10转换成BCD码

DIV AB

MOV 30H,B      ;余数即个位存放在30H

MOV 37H,A      ;商存放在37H

MOV A,38H      ;十位被加数

ADD A,31H      ;十位被加数+加数

ADD A,37H      ;加上个位之和的进位

MOV 37H,#00H   ;清除37H

MOV B,#10      ;十六进制除10转换成BCD码

DIV AB

MOV 31H,B      ;余数即十位存放在31H

MOV 38H,A      ;商存放在38H

MOV A,39H      ;百位计算同十位

ADD A,32H

ADD A,38H

MOV 38H,#00H

MOV B,#10

DIV AB

MOV 32H,B

MOV 39H,A

MOV A,3AH      ;千位计算同十位

ADD A,33H

ADD A,39H

MOV 39H,#00H

MOV B,#10

DIV AB

MOV 33H,B

MOV 3AH,A

MOV A,3BH      ;万位计算同十位

ADD A,34H

ADD A,3AH

MOV 3AH,#00H

MOV B,#10

DIV AB

MOV 34H,B

MOV 3BH,#00H

AJMP DKA

;=====================

JIAN1:   AJMP DKA

CHENG1:  AJMP DKA

CHU1:    AJMP DKA

;=============================================

;延时程序和查表表格

DELY4ms: MOV R6,#8        ;延时4毫秒

D1:      MOV R7,#248

DJNZ R7,$

DJNZ R6,D1

RET

DELY10ms:MOV R6,#20       ;延时10毫秒

D2:      MOV R7,#248

DJNZ R7,$

DJNZ R6,D2

RET

TABLE:   DB 07H, 04H, 01H  ; /   本表格是以键盘为参考   7   8   9   /

DB 08H, 05H, 02H  ; *                          4   5   6   *

DB 09H, 06H, 03H  ; -                          1   2   3   -

DB 00H, 00H ;=      +                         清除 0   =   +

END

寻路机器人单片机程序示例_单片机4*4键盘汇编语言控制示例 计算器 带proteus仿真及源程序...相关推荐

  1. 51单片机PID算法控制无刷直流电机proteus仿真

    51单片机PID算法控制无刷直流电机proteus仿真 1.五个按键,停止/启动,正转,反转,加速,减速 2.显示lcd1602,第一行设置速度set= 3.第二行实际速度speed= r/min 4 ...

  2. 【51单片机】七段数码管和矩阵键盘的综合实验——计算器(思路+仿真电路+源代码)

    系列文章目录 [51单片机]矩阵键盘逐行扫描法仿真实验+超详细Proteus仿真和Keil操作步骤 [51单片机]点阵LED的显示实验 [51单片机]七段数码管显示实验+详细讲解 [51单片机]矩阵键 ...

  3. 单片机I2C总线AT24C02读写、扩展keil工程多个实例及Proteus仿真

    1.对I2C总线上挂接多个AT24C02的读写操作源代码如下: //对I2C总线上的2个AT24C02(U2和U3)的读写/*I2C总线系统中器件地址包括固定部分和可编程部分. 可编程部分必须根据A0 ...

  4. 51单片机对SPI总线上挂接多个25AA040的读写操作+Proteus仿真

    51单片机对SPI总线上挂接多个X5045的读写操作+Proteus仿真 Proteus仿真图 实例代码 //对SPI总线上挂接多个25AA040的读写操作 #include<reg51.h&g ...

  5. 51单片机开发 矩阵键盘中断实验与简易计算器及proteus仿真

    51单片机开发 矩阵键盘中断实验与简易计算器及proteus仿真 文章目录 51单片机开发 矩阵键盘中断实验与简易计算器及proteus仿真 实验内容 一.实验一 矩阵键盘中断实验 数码管显示 1.仿 ...

  6. 51单片机对I2C总线上挂接多个AT24C02的读写操作+Proteus仿真

    51单片机对I2C总线上挂接多个AT24C02的读写操作+Proteus仿真 Proteus仿真图 实例代码 //对I2C总线上挂接多个AT24C02的读写操作 #include <reg51. ...

  7. 单片机蓝牙初始化_单片机程序那些事

    最近在做一个项目的时候,需要进行增量式固件升级,因为固件特别大,一共有900+K,通过蓝牙4.0接口升级,这个数据量非常大,不可能每次全部更新,我们只需要将修改过的函数更新进去就好了,那么就必须要将函 ...

  8. 数字时钟单片机程序c语言,单片机数字时钟C语言程序

    单片机程序 /********************************************************/ #include // 包含51单片机寄存器定义的头文件 unsign ...

  9. 单片机七阶音符_(单片机问题)让蜂鸣器发出do,ri,mi,fa,so,la,si,按这个顺序发声,每个音符各发声1秒....

    问题描述: (单片机问题)让蜂鸣器发出do,ri,mi,fa,so,la,si,按这个顺序发声,每个音符各发声1秒. 蜂鸣器接在单片机的P2.4口,用C语言来编写,求具体的单片机程序,不要框架型的程序 ...

最新文章

  1. Memcached初探
  2. linux 网络下载命令 wget 使用技巧
  3. 貌离神合的RNN与ODE:花式RNN简介
  4. 关于文档的基本操作---ElasticSearch
  5. Java Enterprise软件与应有的内容
  6. 元素在父元素内垂直居中的思路
  7. IDEA将项目打包为指定class文件的jar
  8. ios 可以为空声明_iOS开发中使用OC和swift的对比(2)
  9. 区块链 FISCO BCOS智能合约存储存放位置
  10. git 查看修改明细_Git(查看修改记录)
  11. 第68天-内网安全-域横向 PTHPTKPTT 哈希票据传
  12. 大众点评有多少用户2019_据说2019年度大众点评排名第一
  13. ASM文件类型和模板
  14. 对话阿里云弹性计算负责人褚霸:把计算做到极致,关键还加量不加价!
  15. Ps 2022 版新增功能及改进
  16. Jquery获取所有子元素
  17. 超简单集成华为HMS Scankit 扫码SDK实现扫一扫二维码
  18. python为自己龟蜗速更新的小说生成词云
  19. Vss2005使用相关文章
  20. android contacts电话查询头像,Androidの通过查询电话号码或ID获取联系人头像

热门文章

  1. 如何解锁物联网低代码平台操作日志功能?
  2. Mybatis学习(狂神)
  3. 爬虫python代码网易云_使用python爬取网易云歌曲下载时为0KB的解决方法 | ZPY博客...
  4. 积极应对APP风险问题,海云安力保移动应用安全
  5. 什么是soft matting方法_宜家的娃娃为什么这么”丑“
  6. java pg数据库事务回滚,基于Postgresql 事务的提交与回滚解析
  7. 激光雷达+imu_无人驾驶技术入门(四):无人车传感器 IMU 深入剖析
  8. 案例分析企业微信带来的功能效果?
  9. [安卓刷机实战]小米/红米手机刷机降系统图文教程-解锁小米手机-K30 5G版[开箱可用][解锁+刷机全步骤教程]
  10. Python识别身份证信息,并保存在excel当中