?? calculator.asm
字號:
DBUF EQU 30H
TEMP EQU 40H
YJ EQU 50H ;結果存放
YJ1 EQU 51H ;中間結果存放
GONG EQU 52H ;功能鍵存放
DIN BIT 0B0H ;P3.0
CLK BIT 0B1H ;P3.1
ORG 00H
START: MOV R3,#0 ;初始化顯示為空
MOV GONG,#0
MOV 30H,#10H
MOV 31H,#10H
MOV 32H,#10H
MOV 33H,#10H
MOV 34H,#10H
MLOOP: CALL DISP ;PAN調顯示子程序
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,#10H
MOV 32H,#10H
LJMP MLOOP ;等待再次輸入
E12: MOV R7,A ;個位數暫存R7
MOV B,#10
MOV A,R4
MUL AB ;十位數
ADD A,R7
MOV R4,A ;輸入值存R4
MOV 32H,#10H ;輸入值送顯示緩存
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 30H,#10H ;顯示清空
MOV 31H,#10H
MOV 32H,#10H
MOV 33H,#10H
MOV 34H,#10H
LJMP MLOOP
E2: MOV 34H,#10H
MOV 33H,#10H
MOV 32H,#10H
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,#DBUF ;顯示子程序
MOV R1,#TEMP+4
MOV R2,#5
DP10: MOV DPTR,#SEGTAB
MOV A,@R0
MOVC A,@A+DPTR
MOV @R1,A
INC R0
DEC R1
DJNZ R2,DP10
MOV R0,#TEMP
MOV R1,#5
DP12: MOV R2,#8
MOV A,@R0
DP13: RLC A
MOV DIN,C
CLR CLK
SETB CLK
DJNZ R2,DP13
INC R0
DJNZ R1,DP12
RET
SEGTAB: DB 3FH,06H,5BH,4FH,66H,6DH ;段碼定義
DB 7DH,07H,7FH,6FH,77H,7CH
DB 39H,5EH,79H,71H,00H,40H
TESTKEY:
MOV P1,#0FH ;讀入鍵狀態
MOV A,P1
CPL A
ANL A,#0FH ;高四位不用
RET
KEYTABLE:
DB 0DEH,0EDH,0DDH,0BDH ;鍵碼定義
DB 0EBH,0DBH,0BBH,0E7H
DB 0D7H,0B7H,07EH,07DH
DB 07BH,077H,0BEH,0EEH
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,#80 ;延時子程序
DLOOP: DJNZ R7,DLOOP
DJNZ R6,DLOOP
RET
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -