匯編計算器(最高3位數運算),想將4*4的矩陣鍵盤改為4*5的,原用p1.0-p1.3接行,p1.4-p1.7接列可以實現功能,改用p3.3到p3.4接鍵盤列,鍵盤掃描程序將讀p1改為讀p3卻不能實現,還需要改其他嗎?
- ORG 0000H;
- JMP MAIN;
- ORG 0003H;
- JMP INP0;
- ORG 0030H;
- /*鍵盤所輸入數字依次存入70H-77H*/
- MAIN: MOV R6, #70H;
- MOV SP, #60H;
- CLR 80H;
- CLR 81H;
- SETB EA;
- SETB EX0;
- SETB IT0;
- DISP1: MOV R0, #70H;//從第一位地址存數
- MOV R2, #01H;//位選第一位
- DISP2: MOV A, @R0;
- LCALL SEG7; //跳轉段碼
- MOV P0, A; //P0輸出字形
- MOV P2, R2; //位選輸出
- LCALL D1MS; //跳轉延時
- MOV P2, #0; //位選關閉,段碼不輸出
- INC R0; //選擇下一位;
- MOV A, R2;
- CLR C; //進位標志清零
- RLC A; //掃描字右移
- MOV R2, A; //保存掃描字
- JNC DISP2; //C=0時, 循環一次未結束,跳轉到DISP2
- PASS: LJMP DISP1;
- D1MS: MOV R7, #50H;//延時程序
- 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;
- /*P1.0-1.3,行線; P1.4-1.7,列線;*/
- /*P0,輸出字形; P2,輸出位選*/
- INP0:
- PUSH ACC;
- PUSH B;
- PUSH PSW;
- START: MOV R4, #00H;
- L1: MOV R3, #0F7H;//設掃描初值,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的狀態通過A,傳送到R4
- SETB C; //進位標志置1
- MOV R5, #04H; //
- l3: RLC A; //按鍵左移,通過C是否為0,判斷此列是否有0;無0則r1進行累加;有0跳轉到延時,
- JNC KEY; //C=0,跳轉到延時
- INC R1;
- DJNZ R5, L3;
- MOV A, R3;
- SETB C;
- RRC A; //換行掃描
- MOV R3,A;
- JC L2; //C=1,跳轉到L2
- KEY: ACALL DELAY;
- D1: MOV A,P1;
- XRL A,R4;
- JNZ D1;
- MOV A, R6; //指定存入地址
- MOV R0, A;
- MOV A, R1; //存入數字
- MOV @R0, A;
- /*判斷運算法*/
- 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;//判斷是否為等于號
- JZ EQUAL1;
- MOV A, R1;
- XRL A, #0FH;//判斷是否為清零鍵
- JZ ON1;
-
- INC R0; //選擇下一個地址
- MOV A, R0; //存入r0的新數值
- MOV R6, A;
- POP PSW;
- POP B;
- pop ACC;
- RET;
- DELAY: MOV R7, #60;//消除抖動延時程序
- 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;//算百位數
- DIV AB;
- MOV 72H, A; //將此數除100,商數放72h,余數放71h。
- MOV 71H, B;
- MOV A, 71H;
- MOV B, 0AH;//算十位數
- DIV AB;
- MOV 71H, A; //將此數除10,商數放71h,余數放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;//將所輸入兩位數轉換為十進制,并存入80h中
- MOV A, 78H;
- MUL AB;
- ADD A, 70H;
- MOV 80H, A;
- RET;
- END;
復制代碼
|