|
匯編計(jì)算器(最高3位數(shù)運(yùn)算),想將4*4的矩陣鍵盤(pán)改為4*5的,原用p1.0-p1.3接行,p1.4-p1.7接列可以實(shí)現(xiàn)功能,改用p3.3到p3.4接鍵盤(pán)列,鍵盤(pán)掃描程序?qū)⒆xp1改為讀p3卻不能實(shí)現(xiàn),還需要改其他嗎?
- ORG 0000H;
- JMP MAIN;
- ORG 0003H;
- JMP INP0;
- ORG 0030H;
- /*鍵盤(pán)所輸入數(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;
- /*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;//設(shè)掃描初值,11110111,P3.3=0
- MOV R1, #00H; //取碼指針;
- /*首先行掃描*/
- L2: MOV A, R3; //行掃描開(kāi)始
- 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;
復(fù)制代碼
|
|