标题:
基于C51的简易计算器
[打印本页]
作者:
1019523858
时间:
2018-10-1 09:54
标题:
基于C51的简易计算器
YJ EQU 50H ;结果存放
YJ1 EQU 51H ;中间结果存放
GONG EQU 52H ;功能键存放
ORG 00H
START: MOV R3,#0 ;初始化显示为空
MOV GONG,#0
MOV 32H,#00H
MOV 33H,#00H
MOV 34H,#00H
MLOOP: CALL DISP ;调显示子程序
WAIT: CALL TESTKEY ;判断有无按键
JZ WAIT
CALL GETKEY ;读键
INC R3 ;按键个数
CJNE A,#0,NEXT1 ;判断是否数字键
LJMP E1 ;转数字键处理
NEXT1: CJNE A,#1,NEXT2
LJMP E1
NEXT2: CJNE A,#2,NEXT3
LJMP E1
NEXT3: CJNE A,#3,NEXT4
LJMP E1
NEXT4: CJNE A,#4,NEXT5
LJMP E1
NEXT5: CJNE A,#5,NEXT6
LJMP E1
NEXT6: CJNE A,#6,NEXT7
LJMP E1
NEXT7: CJNE A,#7,NEXT8
LJMP E1
NEXT8: CJNE A,#8,NEXT9
LJMP E1
NEXT9: CJNE A,#9,NEXT10
LJMP E1
NEXT10: CJNE A,#10,NEXT11 ;判断是否功能键
LJMP E2 ;转功能键处理
NEXT11: CJNE A,#11,NEXT12
LJMP E2
NEXT12: CJNE A,#12, NEXT13
LJMP E2
NEXT13: CJNE A,#13,NEXT14
LJMP E2
NEXT14: CJNE A,#14,NEXT15
LJMP E2
NEXT15: LJMP E3 ;判断是否清除键
E1: CJNE R3,#1,N1 ;判断第几次按键
LJMP E11 ;为第一个数字
N1: CJNE R3,#2,N2
LJMP E12 ;为第二个数字
N2: CJNE R3,#3,N3
LJMP E13 ;为第三个数字
N3: LJMP E3 ;第四个数字转溢出
E11: MOV R4,A ;输入值暂存R4
MOV 34H,A ;输入值送显示缓存
MOV 33H,#00H
MOV 32H,#00H
LJMP MLOOP ;等待再次输入
E12: MOV R7,A ;个位数暂存R7
MOV B,#10
MOV A,R4
MUL AB ;十位数
ADD A,R7
MOV R4,A ;输入值存R4
MOV 32H,#00H ;输入值送显示缓存
MOV 33H,34H
MOV 34H,R7
LJMP MLOOP
E13: MOV R7,A
MOV B,#10
MOV A,R4
MUL AB
JB OV,E3 ;输入溢出
ADD A,R7
JB CY,E3 ;输入溢出
MOV R4,A
MOV 32H,33H ;输入值送显示缓存
MOV 33H,34H
MOV 34H,R7
LJMP MLOOP
E3: MOV R3,#0 ;按键次数清零
MOV R4,#0 ;输入值清零
MOV YJ,#0 ;计算结果清零
MOV GONG,#0 ;功能键设为零
MOV 32H,#00H ;显示清空
MOV 33H,#00H
MOV 34H,#00H
LJMP MLOOP
E2: MOV 34H,#00H
MOV 33H,#00H
MOV 32H,#00H
MOV R0,GONG ;与上次功能键交换
MOV GONG,A
MOV A,R0
CJNE A,#10,N21 ;判断功能键
LJMP JIA ;"+"
N21: CJNE A,#11,N22
LJMP JIAN ;"-"
N22: CJNE A,#12,N23
LJMP CHENG ;"*"
N23: CJNE A,#13,N24
LJMP CHU ;"/"
N24: CJNE A,#0,N25
LJMP FIRST ;首次按功能键
N25: LJMP DEN ;"="
N4: LJMP E3
FIRST: MOV YJ,R4 ;输入值送结果
MOV R3,#0 ;按键次数清零
LJMP DISP1 ;结果处理
JIA: MOV A,YJ ;上次结果送累加器
ADD A,R4 ;上次结果加输入值
JB CY,N4 ;溢出
MOV YJ,A ;存本次结果
MOV R3,#0 ;按键次数清零
LJMP DISP1
JIAN: MOV A,YJ
SUBB A,R4 ;上次结果减输入值
JB CY,N4 ;负数溢出
MOV YJ,A
MOV R3,#0
LJMP DISP1
CHENG: MOV A,YJ
MOV B,A
MOV A,R4
MUL AB ;上次结果乘输入值
JB OV,N4 ;溢出
MOV YJ,A
LJMP DISP1
CHU: MOV A,R4
MOV B,A
MOV A,YJ
DIV AB ;上次结果除输入值
MOV YJ,A
MOV R3,#0
LJMP DISP1
DEN: MOV R3,#0
LJMP DISP1
DISP1: MOV B,#10
MOV A,YJ ;结果送累加器
DIV AB ;结果除10
MOV YJ1,A ;暂存"商"
MOV A,B ;取个位数
MOV 34H,A ;个位数送显示缓存
MOV A,YJ1
JZ DISP11 ;结果是否为一位数
MOV B,#10
MOV A,YJ1
DIV AB
MOV YJ1,A
MOV A,B
MOV 33H,A ;十位送显示缓存
MOV A,YJ1
JZ DISP11 ;结果是否为二位数
MOV 32H,A ;百位数送显示缓存
DISP11: LJMP MLOOP
DISP: MOV R0,#34H
DIR1: MOV DPTR,#SEGTAB
MOV A,@R0
MOVC A,@A+DPTR
MOV P0,A
CJNE R0,#34H,DIR2
CLR P2.3
CALL D1MS
SETB P2.3
DEC R0
SJMP DIR1
DIR2: CJNE R0,#33H,DIR3
CLR P2.2
CALL D1MS
CLR P2.2
DEC R0
SJMPDIR1
DIR3: CALL D1MS
RET
D1MS: MOV R7,#02H
DMS: MOV R6,#0F0H
DJNZ R6,$
DJNZ R7,DMS
RET
SEGTAB: DB 3FH, 06H, 5BH, 4FH
DB 66H, 6DH, 7DH, 07H
DB 7FH, 6FH, 77H, 7CH
DB 39H, 5EH, 79H, 71H
TESTKEY: ACALL DISP
MOV P1,#0FH ;读入键状态
MOV A,P1
CPL A
ANL A,#0FH ;高四位不用
RET
KEYTABLE:
DB 0EEH,0EDH,0DDH,0BDH ;键码定义
DB 0EBH,0DBH,0BBH,0E7H
DB 0D7H,0B7H,0DEH,0BEH
DB 07EH,07DH,07BH,077H
GETKEY: MOV R6,#10 ;读键子程序
ACALL DELAY
MOV P1,#0FH
MOV A,P1
CJNE A,#0FH,K12
LJMP MLOOP
K12: MOV B,A
MOV P1,#0EFH
MOV A,P1
CJNE A,#0EFH,K13
MOV P1,#0DFH
MOV A,P1
CJNE A,#0DFH,K13
MOV P1,#0BFH
MOV A,P1
CJNE A,#0BFH,K13
MOV P1,#07FH
MOV A,P1
CJNE A,#07FH,K13
LJMP MLOOP
K13: ANL A,#0F0H
ORL A,B
MOV B,A
MOV R1,#16
MOV R2,#0
MOV DPTR,#KEYTABLE
K14: MOV A,R2
MOVC A,@A+DPTR
CJNE A,B,K16
MOV P1,#0FH
K15: MOV A,P1
CJNE A,#0FH,K15
MOV R6,#10
ACALL DELAY
MOV A,R2
RET
K16: INC R2
DJNZ R1,K14
AJMP MLOOP
DELAY: MOV R7,#10 ;10ms延时子程序
TS1: MOV R6,#0FFH
TS2: NOP
NOP
DJNZ R6,TS2
DJNZ R7,TS1
RET
END
复制代码
作者:
admin
时间:
2018-10-1 20:18
补全原理图或者详细说明一下电路连接即可获得100+黑币
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1