📄 calculator.lst
字号:
A51 MACRO ASSEMBLER CALCULATOR 08/05/2006 11:29:50 PAGE 1
MACRO ASSEMBLER A51 V8.00
OBJECT MODULE PLACED IN Calculator.OBJ
ASSEMBLER INVOKED BY: e:\Program Files\Keil\C51\BIN\A51.EXE Calculator.asm SET(SMALL) DEBUG EP
LOC OBJ LINE SOURCE
0030 1 DBUF EQU 30H
0040 2 TEMP EQU 40H
0050 3 YJ EQU 50H ;结果存放
0051 4 YJ1 EQU 51H ;中间结果存放
0052 5 GONG EQU 52H ;功能键存放
00B0 6 DIN BIT 0B0H ;P3.0
00B1 7 CLK BIT 0B1H ;P3.1
0000 8 ORG 00H
0000 7B00 9 START: MOV R3,#0 ;初始化显示为空
0002 755200 10 MOV GONG,#0
0005 753010 11 MOV 30H,#10H
0008 753110 12 MOV 31H,#10H
000B 753210 13 MOV 32H,#10H
000E 753310 14 MOV 33H,#10H
0011 753410 15 MOV 34H,#10H
0014 317B 16 MLOOP: CALL DISP ;PAN调显示子程序
0016 31B1 17 WAIT: CALL TESTKEY ;判断有无按键
0018 60FC 18 JZ WAIT
001A 31CA 19 CALL GETKEY ;读键
001C 0B 20 INC R3 ;按键个数
001D B40003 21 CJNE A,#0,NEXT1 ;判断是否数字键
0020 02007A 22 LJMP E1 ;转数字键处理
0023 B40103 23 NEXT1: CJNE A,#1,NEXT2
0026 02007A 24 LJMP E1
0029 B40203 25 NEXT2: CJNE A,#2,NEXT3
002C 02007A 26 LJMP E1
002F B40303 27 NEXT3: CJNE A,#3,NEXT4
0032 02007A 28 LJMP E1
0035 B40403 29 NEXT4: CJNE A,#4,NEXT5
0038 02007A 30 LJMP E1
003B B40503 31 NEXT5: CJNE A,#5,NEXT6
003E 02007A 32 LJMP E1
0041 B40603 33 NEXT6: CJNE A,#6,NEXT7
0044 02007A 34 LJMP E1
0047 B40703 35 NEXT7: CJNE A,#7,NEXT8
004A 02007A 36 LJMP E1
004D B40803 37 NEXT8: CJNE A,#8,NEXT9
0050 02007A 38 LJMP E1
0053 B40903 39 NEXT9: CJNE A,#9,NEXT10
0056 02007A 40 LJMP E1
0059 B40A03 41 NEXT10: CJNE A,#10,NEXT11 ;判断是否功能键
005C 0200E3 42 LJMP E2 ;转功能键处理
005F B40B03 43 NEXT11: CJNE A,#11,NEXT12
0062 0200E3 44 LJMP E2
0065 B40C03 45 NEXT12: CJNE A,#12, NEXT13
0068 0200E3 46 LJMP E2
006B B40D03 47 NEXT13: CJNE A,#13,NEXT14
006E 0200E3 48 LJMP E2
0071 B40E03 49 NEXT14: CJNE A,#14,NEXT15
0074 0200E3 50 LJMP E2
0077 0200C7 51 NEXT15: LJMP E3 ;判断是否清除键
007A BB0103 52 E1: CJNE R3,#1,N1 ;判断第几次按键
007D 02008F 53 LJMP E11 ;为第一个数字
0080 BB0203 54 N1: CJNE R3,#2,N2
0083 02009B 55 LJMP E12 ;为第二个数字
0086 BB0303 56 N2: CJNE R3,#3,N3
0089 0200AE 57 LJMP E13 ;为第三个数字
008C 0200C7 58 N3: LJMP E3 ;第四个数字转溢出
A51 MACRO ASSEMBLER CALCULATOR 08/05/2006 11:29:50 PAGE 2
008F FC 59 E11: MOV R4,A ;输入值暂存R4
0090 F534 60 MOV 34H,A ;输入值送显示缓存
0092 753310 61 MOV 33H,#10H
0095 753210 62 MOV 32H,#10H
0098 020014 63 LJMP MLOOP ;等待再次输入
009B FF 64 E12: MOV R7,A ;个位数暂存R7
009C 75F00A 65 MOV B,#10
009F EC 66 MOV A,R4
00A0 A4 67 MUL AB ;十位数
00A1 2F 68 ADD A,R7
00A2 FC 69 MOV R4,A ;输入值存R4
00A3 753210 70 MOV 32H,#10H ;输入值送显示缓存
00A6 853433 71 MOV 33H,34H
00A9 8F34 72 MOV 34H,R7
00AB 020014 73 LJMP MLOOP
00AE FF 74 E13: MOV R7,A
00AF 75F00A 75 MOV B,#10
00B2 EC 76 MOV A,R4
00B3 A4 77 MUL AB
00B4 20D210 78 JB OV,E3 ;输入溢出
00B7 2F 79 ADD A,R7
00B8 20D70C 80 JB CY,E3 ;输入溢出
00BB FC 81 MOV R4,A
00BC 853332 82 MOV 32H,33H ;输入值送显示缓存
00BF 853433 83 MOV 33H,34H
00C2 8F34 84 MOV 34H,R7
00C4 020014 85 LJMP MLOOP
00C7 7B00 86 E3: MOV R3,#0 ;按键次数清零
00C9 7C00 87 MOV R4,#0 ;输入值清零
00CB 755000 88 MOV YJ,#0 ;计算结果清零
00CE 755200 89 MOV GONG,#0 ;功能键设为零
00D1 753010 90 MOV 30H,#10H ;显示清空
00D4 753110 91 MOV 31H,#10H
00D7 753210 92 MOV 32H,#10H
00DA 753310 93 MOV 33H,#10H
00DD 753410 94 MOV 34H,#10H
00E0 020014 95 LJMP MLOOP
00E3 753410 96 E2: MOV 34H,#10H
00E6 753310 97 MOV 33H,#10H
00E9 753210 98 MOV 32H,#10H
00EC A852 99 MOV R0,GONG ;与上次功能键交换
00EE F552 100 MOV GONG,A
00F0 E8 101 MOV A,R0
00F1 B40A03 102 CJNE A,#10,N21 ;判断功能键
00F4 02011C 103 LJMP JIA ;“+”
00F7 B40B03 104 N21: CJNE A,#11,N22
00FA 020129 105 LJMP JIAN ;“-”
00FD B40C03 106 N22: CJNE A,#12,N23
0100 020136 107 LJMP CHENG ;“*”
0103 B40D03 108 N23: CJNE A,#13,N24
0106 020144 109 LJMP CHU ;“/”
0109 B40003 110 N24: CJNE A,#0,N25
010C 020115 111 LJMP FIRST ;首次按功能键
010F 020151 112 N25: LJMP DEN ;“=”
0112 0200C7 113 N4: LJMP E3
0115 8C50 114 FIRST: MOV YJ,R4 ;输入值送结果
0117 7B00 115 MOV R3,#0 ;按键次数清零
0119 020156 116 LJMP DISP1 ;结果处理
011C E550 117 JIA: MOV A,YJ ;上次结果送累加器
011E 2C 118 ADD A,R4 ;上次结果加输入值
011F 20D7F0 119 JB CY,N4 ;溢出
0122 F550 120 MOV YJ,A ;存本次结果
0124 7B00 121 MOV R3,#0 ;按键次数清零
0126 020156 122 LJMP DISP1
0129 E550 123 JIAN: MOV A,YJ
012B 9C 124 SUBB A,R4 ;上次结果减输入值
A51 MACRO ASSEMBLER CALCULATOR 08/05/2006 11:29:50 PAGE 3
012C 20D7E3 125 JB CY,N4 ;负数溢出
012F F550 126 MOV YJ,A
0131 7B00 127 MOV R3,#0
0133 020156 128 LJMP DISP1
0136 E550 129 CHENG: MOV A,YJ
0138 F5F0 130 MOV B,A
013A EC 131 MOV A,R4
013B A4 132 MUL AB ;上次结果乘输入值
013C 20D2D3 133 JB OV,N4 ;溢出
013F F550 134 MOV YJ,A
0141 020156 135 LJMP DISP1
0144 EC 136 CHU: MOV A,R4
0145 F5F0 137 MOV B,A
0147 E550 138 MOV A,YJ
0149 84 139 DIV AB ;上次结果除输入值
014A F550 140 MOV YJ,A
014C 7B00 141 MOV R3,#0
014E 020156 142 LJMP DISP1
0151 7B00 143 DEN: MOV R3,#0
0153 020156 144 LJMP DISP1
0156 75F00A 145 DISP1: MOV B,#10
0159 E550 146 MOV A,YJ ;结果送累加器
015B 84 147 DIV AB ;结果除10
015C F551 148 MOV YJ1,A ;暂存“商”
015E E5F0 149 MOV A,B ;取个位数
0160 F534 150 MOV 34H,A ;个位数送显示缓存
0162 E551 151 MOV A,YJ1
0164 6012 152 JZ DISP11 ;结果是否为一位数
0166 75F00A 153 MOV B,#10
0169 E551 154 MOV A,YJ1
016B 84 155 DIV AB
016C F551 156 MOV YJ1,A
016E E5F0 157 MOV A,B
0170 F533 158 MOV 33H,A ;十位送显示缓存
0172 E551 159 MOV A,YJ1
0174 6002 160 JZ DISP11 ;结果是否为二位数
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -