- YJ EQU 50H ;结果存放
- YJ1 EQU 51H ;中间结果存放
- GONG EQU 52H ;功能键存放
- ORG 0000H
- START: MOV R3,#0 ;初始化显示为空
- MOV GONG,#0
- MOV 32H,#00H
- MOV 33H,#00H
- MOV 34H,#00H
- MLOOP: CALL DISP ;调显示子程序
- WAIT: CALL TESTKEY ;判断有无按键
- JZ WAIT ;判断累加器是否为0
- 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 ;输入溢出,如果OV等于1则转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
- SETB P2.0
- CALL D1MS
- CLR P2.0
- DEC R0
- SJMP DIR1
- DIR2: CJNE R0,#33H,DIR3
- SETB P2.1
- CALL D1MS
- CLR P2.1
- DEC R0
- SJMP DIR1
- DIR3: SETB P2.2
- CALL D1MS
- CLR P2.2
- RET
- D1MS: MOV R7,#02H
- DMS: MOV R6,#0F0H
- DJNZ R6,$
- DJNZ R7,DMS
- RET
- SEGTAB: DB 0C0H, 0F9H, 0A4H, 0B0H
- DB 099H, 092H, 082H, 0F8H
- DB 080H, 090H, 088H, 083H
- DB 0C6H, 0A1H, 086H, 08EH
- 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
复制代码
|