
基于51单片机的计算器设计程序代码(汇编).doc
13页DBUFﻩEQU 30HTEMP EQU ﻩ40HYJ ﻩEQUﻩﻩ50H ﻩﻩ;成果寄存YJ1 EQUﻩﻩ51H ﻩ;中间成果寄存GONG ﻩEQUﻩﻩ52H ;功能键寄存ﻩﻩORG ﻩ00HSTART: MOV R3,#0 ;初始化显示为空ﻩﻩMOV ﻩGONG,#0ﻩ MOV ﻩ30H,#10Hﻩ MOV ﻩ31H,#10H ﻩMOV 32H,#10H MOV 33H,#10H ﻩMOV 34H,#10HMLOOP: CALL ﻩDISP ﻩ;PAN调显示子程序WAIT: CALL TESTKEY ;判断有无按键ﻩﻩJZ WAIT ﻩ CALL GETKEY ;读键 INC R3 ﻩ;按键个数 ﻩCJNE A,#0,NEXT1 ;判断与否数字键ﻩ LJMP E1 ﻩ;转数字键解决NEXT1:ﻩCJNE A,#1,NEXT2 ﻩLJMP E1NEXT2:ﻩCJNE A,#2,NEXT3 LJMP E1NEXT3:ﻩCJNE A,#3,NEXT4ﻩ LJMP E1NEXT4:ﻩCJNE A,#4,NEXT5 ﻩLJMP E1NEXT5:ﻩCJNE A,#5,NEXT6 ﻩLJMP E1NEXT6: CJNE A,#6,NEXT7 LJMP E1NEXT7: CJNE A,#7,NEXT8ﻩ LJMP E1NEXT8:ﻩCJNE A,#8,NEXT9ﻩ LJMP E1NEXT9:ﻩCJNE A,#9,NEXT10 LJMP E1NEXT10:ﻩCJNE A,#10,NEXT11 ;判断与否功能键 ﻩLJMP E2 ;转功能键解决NEXT11: CJNE A,#11,NEXT12 ﻩLJMP E2NEXT12: CJNE ﻩA,#12, NEXT13ﻩ LJMP ﻩE2NEXT13: CJNE ﻩA,#13,NEXT14 ﻩLJMP E2NEXT14: CJNE ﻩA,#14,NEXT15ﻩﻩLJMP ﻩE2NEXT15:ﻩ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 ﻩMLOOPE13: 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 MLOOPE3:ﻩ 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 MLOOPE2: ﻩ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 E3FIRST:ﻩ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 ﻩDISP1JIAN:ﻩMOV ﻩA,YJﻩﻩSUBB ﻩA,R4ﻩﻩ ﻩ;上次成果减输入值ﻩ JB ﻩCY,N4ﻩﻩ ﻩ;负数溢出 MOV YJ,A MOV R3,#0 ﻩLJMP ﻩDISP1CHENG: MOV ﻩA,YJ MOV ﻩB,A MOV ﻩA,R4ﻩ MUL ABﻩﻩﻩ ;上次成果乘输入值 ﻩJB OV,N4 ﻩ ﻩ;溢出ﻩ MOV ﻩYJ,A ﻩﻩﻩ LJMP ﻩDISP1CHU:ﻩMOV ﻩA,R4 MOV B,A MOV A,YJﻩ DIV ABﻩ ;上次成果除输入值ﻩ MOV YJ,A MOV ﻩR3,#0 LJMP ﻩDISP1DEN: MOV ﻩR3,#0ﻩﻩLJMP ﻩDISP1DISP1:ﻩ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 MLOOPDISP: MOV ﻩR0,#DBUFﻩ ﻩ;显示子程序 MOVﻩ R1,#TEMP+4 ﻩMOVﻩ R2,#5DP10: MOVﻩ DPTR,#SEGTAB MOVﻩ A,@R0 MOVC A,@A+DPTR ﻩMOV ﻩ@R1,A ﻩINCﻩ R0 DECﻩ R1 ﻩDJNZﻩR2,DP10ﻩﻩMOV R0,#TEMPDP12:ﻩMOV A,@R0ﻩ MOV P0,A clr P2.7ﻩﻩCALL D1MS ﻩsetb P2.7ﻩﻩINC R0ﻩﻩMOV A,@R0ﻩ MOV P0,Aﻩﻩclr P2.6 ﻩCALL D1MS ﻩsetb P2.6 ﻩINC R0 MOV A,@R0 MOV P0,A ﻩclr P2.5ﻩﻩCALL D1MSﻩ setb P2.5 ﻩINC R0 ﻩMOV A,@R0ﻩ MOV P0,A ﻩclr P2.4ﻩ CALL D1MS setb P2.4ﻩﻩINC R0ﻩ MOV A,@R0 ﻩMOV P0,A clr P2.3ﻩﻩCALL D1MS setb P2.3ﻩﻩRETD1MS: MOV R7,#02HDMS: MOV R6,#0FFH DJNZ R6,$ DJNZ R7,DMS ﻩﻩRETSEGTAB:ﻩDB 028H,7eH,0A2H,062H DB 74H, 61H, 21H, 7aH DB 20H, 60H, 88H, 83H DB 0C6H, 0A1H, 86H, 8EH,0ffHTESTKEY:ACALL DISPﻩ ﻩMOV P1,#0FHﻩ ﻩ;读入键状态ﻩﻩMOVﻩﻩA,P1ﻩﻩ ﻩCPLﻩ A ANL ﻩA,#0FHﻩﻩ ﻩ;高四位不用ﻩﻩRETKEYTABLE:ﻩ ﻩ ﻩ ﻩﻩDB 0DEH,0EDH。












