ORG 0000H; JMP MAIN; ORG 0003H; JMP INP0; ORG 0030H; /*鍵盤所輸入數(shù)字依次存入70H-77H*/ MAIN: MOV R6, #70H; MOV SP, #60H; CLR 80H; CLR 81H; SETB EA; SETB EX0; SETB IT0; DISP1: MOV R0, #70H;//從第一位地址存數(shù) MOV R2, #01H;//位選第一位 DISP2: MOV A, @R0; LCALL SEG7; //跳轉(zhuǎn)段碼 MOV P0, A; //P0輸出字形 MOV P2, R2; //位選輸出 LCALL D1MS; //跳轉(zhuǎn)延時(shí) MOV P2, #0; //位選關(guān)閉,段碼不輸出 INC R0; //選擇下一位; MOV A, R2; CLR C; //進(jìn)位標(biāo)志清零 RLC A; //掃描字右移 MOV R2, A; //保存掃描字 JNC DISP2; //C=0時(shí), 循環(huán)一次未結(jié)束,跳轉(zhuǎn)到DISP2 PASS: LJMP DISP1; D1MS: MOV R7, #50H;//延時(shí)程序 DMS: DJNZ R7, DMS; RET; SEG7: MOV DPTR, #TABLE;//查表程序 MOVC A, @A+DPTR; RET; TABLE: DB 0C0H, 0F9H, 0A4H, 0B0H; DB 99H, 92H, 82H, 0F8H; DB 80H, 90H, 88H, 83H; DB 0C6H, 0A1H, 86H, 8EH; /*P3.6-3.7,行線; P1.0-1.7,列線;*/ /*P0,輸出字形; P2,輸出位選*/ INP0: PUSH ACC; PUSH B; PUSH PSW; START: MOV R4, #00H; L1: MOV R3, #0F7H;//設(shè)掃描初值,11110111,P3.3=0 MOV R1, #00H; //取碼指針; /*首先行掃描*/ L2: MOV A, R3; //行掃描開始 MOV P1, A; //掃描值輸出至p1 MOV A, P1; //讀入P1的值 MOV R4, A; //P3口中P3.4-3.7的狀態(tài)通過(guò)A,傳送到R4 SETB C; //進(jìn)位標(biāo)志置1 MOV R5, #04H; // l3: RLC A; //按鍵左移,通過(guò)C是否為0,判斷此列是否有0;無(wú)0則r1進(jìn)行累加;有0跳轉(zhuǎn)到延時(shí), JNC KEY; //C=0,跳轉(zhuǎn)到延時(shí) INC R1; DJNZ R5, L3; MOV A, R3; SETB C; RRC A; //換行掃描 MOV R3,A; JC L2; //C=1,跳轉(zhuǎn)到L2 KEY: ACALL DELAY; D1: MOV A,P1; XRL A,R4; JNZ D1; MOV A, R6; //指定存入地址 MOV R0, A; MOV A, R1; //存入數(shù)字 MOV @R0, A; /*判斷運(yùn)算法*/ MOV A, R1; XRL A, #0AH;//判斷是否為加法符 JZ ADD1; MOV A, R1; XRL A, #0BH;//判斷是否為減法符 JZ SUBB1; MOV A, R1; XRL A, #0CH;//判斷是否為乘法符 JZ MUL1; MOV A, R1; XRL A, #0DH;//判斷是否為除法符 JZ DIV1; MOV A, R1; XRL A, #0EH;//判斷是否為等于號(hào) JZ EQUAL1; MOV A, R1; XRL A, #0FH;//判斷是否為清零鍵 JZ ON1; INC R0; //選擇下一個(gè)地址 MOV A, R0; //存入r0的新數(shù)值 MOV R6, A; POP PSW; POP B; pop ACC; RET; DELAY: MOV R7, #60;//消除抖動(dòng)延時(shí)程序 DLY1: DJNZ R7, DLY1; RET; ADD1: MOV A, 80H; //加法程序 MOV 81H, A; LJMP D1; MOV A, 81H; ADD A, 80H; MOV 80H, A; RET; SUBB1: MOV A, 80H;//減法程序 MOV 81H, A; LJMP DD1; MOV A, 80H; SUBB A, 81H; MOV 80H, A; RET; MUL1: MOV A, 80H;//乘法程序 MOV 81H, A; LJMP DD1; MOV A, 80H; MUL AB; MOV 80H, A; RET; DIV1: MOV A, 80H;//除法程序 MOV 81H, A; LJMP DD1; MOV A, 80H; DIV AB; MOV 80H, A; RET; EQUAL1: MOV A, 80H;//等于程序 MOV B, #64H;//算百位數(shù) DIV AB; MOV 72H, A; //將此數(shù)除100,商數(shù)放72h,余數(shù)放71h。 MOV 71H, B; MOV A, 71H; MOV B, 0AH;//算十位數(shù) DIV AB; MOV 71H, A; //將此數(shù)除10,商數(shù)放71h,余數(shù)放70h。 MOV 70H, B; RET; ON1: CLR 70H; //清零程序 CLR 71H; CLR 72H; CLR 73H; CLR 78H; CLR 79H; CLR 7AH; CLR 80H; CLR 81H; CLR 82H; CLR 88H; CLR 89H; CLR 8AH; MOV R0, 00H; MOV R1, 00H; MOV R2, 00H; MOV R3, 00H; MOV R4, 00H; MOV R5, 00H; MOV R6, 70H; MOV R7, 00H; RET; DD1: MOV B, #0AH;//將所輸入兩位數(shù)轉(zhuǎn)換為十進(jìn)制,并存入80h中 MOV A, 78H; MUL AB; ADD A, 70H; MOV 80H, A; RET; END;
|