当前位置:文档之家› 基于51单片机的计算器设计程序代码汇编

基于51单片机的计算器设计程序代码汇编

DBUF EQU 30HTEMP EQU 40HYJ EQU 50H ;结果存放YJ1 EQU 51H ;中间结果存放GONG EQU 52H ;功能键存放ORG 00HSTART: MOV R3,#0 ;初始化显示为空MOV GONG,#0MOV 30H,#10HMOV 31H,#10HMOV 32H,#10HMOV 33H,#10HMOV 34H,#10HMLOOP: CALL DISP ;PAN调显示子程序WAIT: CALL TESTKEY ; 判断有无按键JZ WAITCALL GETKEY ;读键INC R3 ;按键个数CJNE A,#0,NEXT1 ; 判断就是否数字键LJMP E1 ; 转数字键处理NEXT1: CJNE A,#1,NEXT2LJMP E1NEXT2: CJNE A,#2,NEXT3LJMP E1NEXT3: CJNE A,#3,NEXT4LJMP E1NEXT4: CJNE A,#4,NEXT5LJMP E1NEXT5: CJNE A,#5,NEXT6LJMP E1NEXT6: CJNE A,#6,NEXT7LJMP E1NEXT7: CJNE A,#7,NEXT8LJMP E1NEXT8: CJNE A,#8,NEXT9LJMP E1NEXT9: CJNE A,#9,NEXT10LJMP E1NEXT10: CJNE A,#10,NEXT11 ;判断就是否功能键LJMP E2 ;转功能键处理NEXT11: CJNE A,#11,NEXT12LJMP E2NEXT12: CJNE A,#12, NEXT13LJMP E2NEXT13: CJNE A,#13,NEXT14LJMPE2NEXT14: C JNE A,#14,NEXT15LJMP E2NEXT15: L JMP E3 ;判断就是否清除键E1: CJNE R3,#1,N1 ;判断第几次按键LJMP E11 ;为第一个数字N1: CJNE R3,#2,N2LJMP E12 ;为第二个数字N2: CJNE R3,#3,N3LJMP E13 ;为第三个数字N3: LJMP E3 ;第四个数字转溢出E11: MOV R4,A ;输入值暂存R4 MOV 34H,A ;输入值送显示缓存MOV 33H,#10HMOV 32H,#10HLJMP MLOOP ;等待再次输入E12: MOV R7,A ;个位数暂存R7 MOV B,#10MOV A,R4MUL AB ;十位数ADD A,R7MOV R4,A ;输入值存R4MOV 32H,#10H ;输入值送显示缓存MOV 33H,34HMOV 34H,R7LJMP MLOOP E13: MOV R7,AMOV B,#10MOV A,R4MUL ABJB OV,E3 ;输入溢出ADD A,R7JB CY,E3 ;输入溢出MOV R4,AMOV 32H,33H ;输入值送显示缓存MOV 33H,34HMOV 34H,R7LJMP MLOOPE3: MOV R3,#0 ;按键次数清零MOV R4,#0 ;输入值清零MOV YJ,#0 ;计算结果清零MOV GONG,#0 ;功能键设为零MOV 30H,#10H ;显示清空MOV 31H,#10HMOV 32H,#10HMOV 33H,#10HMOV 34H,#10HLJMP MLOOPE2: MOV 34H,#10HMOV 33H,#10HMOV 32H,#10HMOV R0,GONG ;与上次功能键交换MOV GONG,AMOV A,R0CJNE A,#10,N21 ;判断功能键LJMP JIA ;"+"N21: CJNE A,#11,N22LJMP JIAN ・" II JN22: CJNE A,#12,N23LJMP CHENG ・jN23: CJNE A,#13,N24LJMP CHU ;"/"N24: CJNE A,#0,N25LJMP FIRST ;首次按功能键N25: LJMP DEN・n_n j 一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,YJSUBB A,R4 ;上次结果减输入值JB CY,N4 ;负数溢出MOV YJ,AMOV R3,#0LJMP DISP1CHENG: MOV A,YJMOV B,AMOV A,R4MUL AB ;上次结果乘输入值JB OV,N4 ;溢出MOV YJ,ALJMP DISP1CHU: MOV A,R4MOV B,AMOV A,YJDIV AB ;上次结果除输入值MOV YJ,AMOV R3,#0LJMP DISP1DEN: MOV R3,#0LJMP DISP1DISP1: MOV B,#10MOV A,YJ ;结果送累加器DIV AB ;结果除10MOV YJ1,A ;暂存"商"MOV A,B ;取个位数MOV 34H,A ;个位数送显示缓存MOV A,YJ1JZ DISP11 ;结果就是否为一位数MOV B,#10MOV A,YJ1DIV ABMOV YJ1,AMOV A,BMOV 33H,A ;十位送显示缓存MOV A,YJ1JZ DISP11 ;结果就是否为二位数MOV 32H,A ;百位数送显示缓存DISP11: LJMP MLOOPDISP: MOV R0,#DBUF ;显示子程序MOV R1,#TEMP+4MOV R2,#5DP10: MOV DPTR,#SEGTABMOV A,@R0MOVC A,@A+DPTRMOV @R1,AINC R0DEC R1DJNZ R2,DP10MOV R0,#TEMPDP12: MOV A,@R0MOV P0,Aclr P2、7CALL D1MSsetb P2、7DB 74H, 61H, 21H, 7aHDB 20H, 60H, 88H, 83HDB 0C6H, 0A1H, 86H, 8EH,0ffHTESTKEY:ACALL DISPMOV P1,#0FH;读入键状态 MOVA,P1 CPLA ANLA,#0FH ;高四位不用 RETKEYTABLE:DBODEH,OEDH,ODDH,OBDHf 键码定义 DB0EBH,0DBH,0BBH,0E7H DB 0D7H,0B7H,07EH,07DH INCR0 MOVA,@R0 MOVP0,A clrP2、6 CALLD1MS setbP2、6 INCR0 MOVA,@R0 MOVP0,A clrP2、5 CALLD1MS setbP2、5 INCR0 MOVA,@R0 MOVP0,A clrP2、4 CALLD1MS setbP2、4 INCR0 MOVA,@R0 MOVP0,A clrP2、3 CALLD1MS setbP2、3 RETMOVR7,#02H MOVR6,#0FFH DJNZR6,$ DJNZR7,DMSRET D1MS:DMS: SEGTAB: DB 028H,7eH,0A2H,062HDB 07BH,077H,0BEH,0EEH GETKEY: ;读键子程序K12: MOV R6,#10 ACALL DELAYMOV P1,#0FH MOV A,P1 CJNEA,0FH,K12LJMP MLOOPMOV B,AMOV P1,#0EFH MOV A,P1 CJNEA,#0EFH,K13 MOV P1,#0DFH MOV A,P1 CJNEA,#0DFH,K13 MOV P1,#0BFH MOV A,P1 CJNEA,#0BFH,K13 MOV P1,#07FH MOV A,P1 CJNEA,#07FH,K13 LJMP MLOOPK13: ANL A,#0F0HORL A,BMOV B,AMOV R1,#16MOV R2,#0MOV DPTR,#KEYTABLEK14: MOV A,R2MOVC A,@A+DPTRCJNEA,B,K16 MOV P1,#0FHK15: MOV A,P1CJNEA,#0FH,K15MOV R6,#10ACALL DELAYMOV A,R2RETK16: INC R2DJNZ R1,K14AJMP MLOOPDELAY: MOV R7,#80DLOOP: DJNZ R7,DLOOPDJNZ R6,DLOOP;延时子程序RET END。

相关主题