

mode equ 30H;输入模式、结果显示模式
key equ 39H;键值
;31H-34H输入数据
;35H-38H结果
ORG 0000H
AJMP MAIN
ORG 0003H
AJMP INT00
ORG 0030H
MAIN:
SETB IT0//初始化INT0
SETB EX0
SETB EA
MOV DPTR,#TABLE1;数码管编码地址
MOV mode,#0
/*MOV A,#7
MOV 31H,A
MOV A,#6
MOV 32H,A
MOV A,#1
MOV 33H,A
MOV A,#2
MOV 34H,A*/
START:
//按键检测
MOV A,#0C0H
MOV P1,A
MOV A,#0FFH
MOV P3,A
//显示输入数据
MOV A,mode
JNZ ST1
MOV A,31H
MOVC A,@A+DPTR;读取编码
MOV P0,A
CLR P2.0 //位选
ACALL DELAY
SETB P2.0
MOV A,32H
MOVC A,@A+DPTR;读取编码
MOV P0,A
CLR P2.1 //位选
ACALL DELAY
SETB P2.1
MOV A,33H
MOVC A,@A+DPTR;读取编码
MOV P0,A
CLR P2.2 //位选
ACALL DELAY
SETB P2.2
MOV A,34H
MOVC A,@A+DPTR;读取编码
MOV P0,A
CLR P2.3 //位选
ACALL DELAY
SETB P2.3
AJMP START
ST1://显示结果
MOV A,35H
MOVC A,@A+DPTR;读取编码
MOV P0,A
CLR P2.0 //位选
ACALL DELAY
SETB P2.0
MOV A,36H
MOVC A,@A+DPTR;读取编码
MOV P0,A
CLR P2.1 //位选
ACALL DELAY
SETB P2.1
MOV A,37H
MOVC A,@A+DPTR;读取编码
MOV P0,A
CLR P2.2 //位选
ACALL DELAY
SETB P2.2
MOV A,38H
MOVC A,@A+DPTR;读取编码
MOV P0,A
CLR P2.3 //位选
ACALL DELAY
SETB P2.3
AJMP START
//------------------------
DELAY://延时函数
MOV R7,#64H
DE1:DJNZ R7,DE1
RET
//------------------------
INT00://外部中断0
CPL P2.7
JB P2.7,AA1//按键按下以后因为按键扫描会触发2次中断,跳过其中一次
AJMP AA2
AA1:RETI
AA2:
MOV 40H,A//保存数据
ACALL DELAY//延时防抖
JNB P1.6,MM1
JNB P1.7,MM1
JNB P3.5,MM1
JNB P3.6,MM1
JNB P3.7,MM1
MOV A,40H //退还数据
RETI //没有按键按下,退出
MM1:
//按键读取,列检测
JB P1.6,NN1
MOV R2,#0
NN1:JB P1.7,NN2
MOV R2,#1
NN2:JB P3.5,NN3
MOV R2,#2
NN3:JB P3.6,NN4
MOV R2,#3
NN4:JB P3.7,NN5
MOV R2,#4
NN5:
//行检测
MOV A,#0FFH
MOV P1,A
CLR P1.6
CLR P1.7
CLR P3.5
CLR P3.6
CLR P3.7
JB P1.0,NN6
MOV A,#0
NN6:JB P1.1,NN7
MOV A,#5
NN7:JB P1.2,NN8
MOV A,#10
NN8:JB P1.3,NN9
MOV A,#15
NN9:JB P1.4,NN10
MOV A,#20
NN10:JB P1.5,NN11
MOV A,#25
NN11:
//计算键值
ADD A,R2
MOV key,A
//清零
CJNE A,#14,CC1
MOV mode,#0
MOV A,#0
MOV 31H,A
MOV 32H,A
MOV 33H,A
MOV 34H,A
MOV 35H,A
MOV 36H,A
MOV 37H,A
MOV 38H,A
CC1:
//输入数字和计算
MOV A,mode
JNZ PPP1//模式0,输入数字
AJMP PPP2
PPP1:AJMP PP1
PPP2:
MOV A,#9
CLR C
SUBB A,key
JC PP2//输入数字
MOV A,32H
MOV 31H,A
MOV A,33H
MOV 32H,A
MOV A,34H
MOV 33H,A
MOV A,key
MOV 34H,A
PP2:
//计算
MOV A,key
CJNE A,#10,PP3//加
MOV A,#10
MOV B,A
MOV A,31H
MUL AB
ADD A,32H
MOV R2,A//第1个数
MOV A,#10
MOV B,A
MOV A,33H
MUL AB
ADD A,34H//第2个数
ADD A,R2//加法
MOV R2,A
MOV A,#10
MOV B,A
MOV A,R2
DIV AB
MOV R2,A
MOV A,B
MOV 38H,A//个位
MOV A,#10
MOV B,A
MOV A,R2
DIV AB
MOV 36H,A//百位
MOV A,B
MOV 37H,A//十位
MOV mode,#1//模式切换
PP3:
MOV A,key
CJNE A,#11,PP4//减法
MOV A,#10
MOV B,A
MOV A,31H
MUL AB
ADD A,32H
MOV R2,A//第1个数
MOV A,#10
MOV B,A
MOV A,33H
MUL AB
ADD A,34H//第2个数
MOV R3,A
CLR C
SUBB A,R2
MOV R4,A
JC PP5
MOV A,#10//负号
MOV 35H,A
AJMP PP6
PP5:MOV A,R2//正数
CLR C
SUBB A,R3
MOV R4,A
PP6:MOV A,#10
MOV B,A
MOV A,R4
DIV AB
MOV 37H,A//十位
MOV A,B
MOV 38H,A//个位
MOV mode,#1//模式切换
PP4:
MOV A,key
CJNE A,#12,PPP7//乘法
AJMP PPP8
PPP7:AJMP PP7
PPP8:
MOV A,32H //个位个位相乘
MOV B,A
MOV A,34H
MUL AB
MOV R2,A
MOV A,#10
MOV B,A
MOV A,R2
DIV AB
MOV R3,A;进位
MOV A,B
MOV 52H,A
MOV A,31H //个位十位相乘
MOV B,A
MOV A,34H
MUL AB
ADD A,R3
MOV R2,A
MOV A,#10
MOV B,A
MOV A,R2
DIV AB
MOV 50H,A
MOV A,B
MOV 51H,A
MOV A,32H //个位个位相乘
MOV B,A
MOV A,33H
MUL AB
MOV R2,A
MOV A,#10
MOV B,A
MOV A,R2
DIV AB
MOV R3,A;进位
MOV A,B
MOV 55H,A
MOV A,31H //个位十位相乘
MOV B,A
MOV A,33H
MUL AB
ADD A,R3
MOV R2,A
MOV A,#10
MOV B,A
MOV A,R2
DIV AB
MOV 53H,A
MOV A,B
MOV 54H,A
//最终相加
MOV A,52H//个位
MOV 38H,A
MOV A,51H //十位
ADD A,55H
MOV R2,A
MOV A,#10
MOV B,A
MOV A,R2
DIV AB
MOV R3,A;进位
MOV A,B
MOV 37H,A
MOV A,50H //百位
ADD A,54H
ADD A,R3
MOV R2,A
MOV A,#10
MOV B,A
MOV A,R2
DIV AB
MOV R3,A;进位
MOV A,B
MOV 36H,A
MOV A,53H //千位
ADD A,R3
MOV R2,A
MOV A,#10
MOV B,A
MOV A,R2
DIV AB
MOV R3,A;进位
MOV A,B
MOV 35H,A
MOV mode,#1//模式切换
PP7:
MOV A,key
CJNE A,#13,PP8//除法
MOV A,#10
MOV B,A
MOV A,31H
MUL AB
ADD A,32H
MOV R2,A//第1个数
MOV A,#10
MOV B,A
MOV A,33H
MUL AB
ADD A,34H
MOV R3,A//第2个数
MOV B,A
MOV A,R2
DIV AB
MOV R2,A
MOV A,#10//计算除法
MOV B,A
MOV A,R2
DIV AB
MOV 37H,A
MOV A,B
MOV 38H,A
MOV mode,#1//模式切换
PP8:
PP1:
MOV A,40H //退还数据
RETI
TABLE1:DB 3fH,06H,5bH,4fH,66H,6dH,7dH,07H,7fH,6fH,40H//数码管编码
END