📄 main0.asm
字号:
;第一次 ok
DATAS SEGMENT
DISBUF DB 6 DUP(?)
BTAB DB 01H,02H,04H,08H,10H,20H
CTAB DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,89H,0BFH,0DCH,0ADH,0B7H;0123456789+-*/=
XTAB DB 4 DUP(?)
BUF DB ?
DATAS ENDS
STACKS SEGMENT
DW 100 DUP(?)
TOP LABEL WORD
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
MAIN:
MOV AX,DATAS
MOV DS,AX
MOV AX,STACKS
MOV SS,AX
MOV SP,OFFSET TOP ;初始化
MOV DX,0EE03H
MOV AL,82H ;初始8255,a出b入c出
OUT DX,AL
ZHIP:
LEA DI,DISBUF
LEA SI,XTAB
MOV AL,8CH ;8CH为p
MOV CX,6
ZAGAIN:
MOV [DI],AL
INC DI
LOOP ZAGAIN ;置DISBUF为P
XOR CX,CX ;置cx为0
LEA DI,DISBUF ;置di为0
LEA SI,XTAB ;置si为0
XH1: ;;;;;;;;;;;;;;;;;;循环1
PUSH SI
PUSH DI
PUSH CX
CALL FAR PTR DISPLAY ;调display显示
CALL FAR PTR SCAN ;调scan扫描键盘
POP CX
POP DI
POP SI
MOV AL,BUF
CMP AL,0FFH
JZ XH1 ;无按键按下跳xh1
INC CX
;;;;;;;;;;;;;;;;;;;;;;
; 0 1 2 3
;
; 4 5 6 7
; ;键盘布局
; 8 9 + -
;
; * / = C
;;;;;;;;;;;;;;;;;;;;;;
CMP AL,0FH
JZ ZHIP ;是c键置disbuf为p(重新开始)
CMP CX,1
JZ JIAN1
CMP CX,2
JZ JIAN2
CMP CX,3
JZ JIAN3
CMP CX,4
JZ JIAN4
JMP CHUCUO
JIAN1:
CMP AL,09H
JA CHUCUO ;第一个键大于9则出错
MOV [SI],AL ;将第一个键值存入XTAB
MOV BX,OFFSET CTAB
;CTAB DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,89H,0BFH,0DCH,0ADH,0B7H;0123456789+-*/=
XLAT ;查表转换(BX+AL)-->AL
MOV [DI],AL ;否则存人disbuf DISBUF DB 6 DUP(?)
INC DI ;DISBUF指针后移
INC SI ;XTAB指针后移
JMP XH1
JIAN2:
CMP AL,09H
JBE CHUCUO
CMP AL,0DH
JA CHUCUO ;第二个键值大于9小于14 (+-*/)
MOV BX,OFFSET CTAB
XLAT
MOV [DI],AL
INC DI
JMP XH1
JIAN3:
CMP AL,09H
JA CHUCUO ;第三个键大于9则出错
MOV [SI],AL ;将第三个键值存入XTAB
MOV BX,OFFSET CTAB
XLAT
MOV [DI],AL ;否则存人disbuf
INC DI ;DISBUF指针后移
INC SI
JMP XH1
JIAN4:
CMP AL,0EH
JNZ CHUCUO
MOV BX,OFFSET CTAB
XLAT
MOV [DI],AL
INC DI
JMP JISUAN
CHUCUO:
LEA DI,DISBUF ;出错将disbuf置为E
MOV AL,86H
MOV CX,6
CAGAIN:
MOV [DI],AL
INC DI
LOOP CAGAIN
LEA DI,DISBUF ;置di为0
LEA SI,XTAB
XH2: ;;;;;;;;;;;;;;;;;;循环2 出错后或完成后
PUSH SI
PUSH DI
PUSH CX
CALL FAR PTR DISPLAY ;调display显示
CALL FAR PTR SCAN ;调scan扫描键盘
POP CX
POP DI
POP SI
MOV AL,BUF
CMP AL,0FFH
JZ XH2 ;无按键按下跳xh2
CMP AL,0FH
JZ ZHUANYI1 ;是c键置disbuf为p(重新开始)
JMP XH2
ZHUANYI1:
JMP FAR PTR ZHIP
;;;;;;;;;;;;;;;;;;;;;;;;;;计算过程;;;;;;;;;;;;;;;;;;;;;;;;;;;;
JISUAN:
LEA DI,DISBUF
LEA SI,XTAB
MOV AL,[DI+1] ;89H,0BFH,0DCH,0ADH,0B7H
CMP AL,89H ;判断符号(+)
JZ SIGNADD
CMP AL,0BFH ;-
JZ SIGNDEC
CMP AL,0DCH ;*
JZ SIGNMUL
CMP AL,0ADH ;/
JZ SIGNDIV
JMP CHUCUO
SIGNADD:
XOR AX,AX
MOV AL,[SI]
MOV DL,[SI+1]
ADD AL,DL
AAA
MOV BX,OFFSET CTAB
XLAT
MOV [DI+5],AL
MOV AL,AH
MOV BX,OFFSET CTAB
XLAT
MOV [DI+4],AL
JMP XH2
SIGNDEC:
MOV AL,[SI]
MOV AH,[SI+1]
CMP AL,AH
JLE BELOW
SUB AL,AH
MOV BX,OFFSET CTAB
XLAT
MOV [DI+5],AL
MOV AL,0C0H
MOV [DI+4],AL
JMP XH2
BELOW:
SUB AH,AL
MOV AL,AH
MOV BX,OFFSET CTAB
XLAT
MOV [DI+5],AL
MOV AL,0BFH
MOV [DI+4],AL
JMP XH2
SIGNMUL:
MOV AL,[SI]
MOV AH,[SI+1]
IMUL AH
AAM
MOV BX,OFFSET CTAB
XLAT
MOV [DI+5],AL
MOV AL,AH
MOV BX,OFFSET CTAB
XLAT
MOV [DI+4],AL
JMP XH2
SIGNDIV:
XOR AX,AX
MOV AL,[SI]
MOV DL,[SI+1]
CMP DL,00H
JZ ZHUANYI ;除数为零
IDIV DL
MOV [SI+2],AH ;余数
MOV [SI+3],AL ;商
MOV BX,OFFSET CTAB
XLAT
SUB AL,80H
MOV [DI+4],AL
;余数乘10在除
MOV AL,AH
MOV CL,10
MUL CL
IDIV DL
MOV [SI+2],AL ;将余数的商存入[SI+2]中
;余数乘以10在除
MOV AL,AH
MOV CL,10
MUL CL
IDIV DL
CMP AL,05H
JL JIESHU
MOV AL,[SI+2] ;余数大于等于5,加一
ADD AL,01H
MOV [SI+2],AL
JIESHU:
MOV AL,[SI+2]
MOV BX,OFFSET CTAB
XLAT
MOV [DI+5],AL
JMP XH2
ZHUANYI:
JMP CHUCUO
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;计算过程结束;;;;;;;;;;;;;;;;;;;;;;;;;;
MOV AH,4CH
INT 21H
CODES ENDS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;DISPLAY程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CODE1 SEGMENT
ASSUME CS:CODE1
DISPLAY PROC FAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
LEA DI,DISBUF
LEA SI,BTAB
MOV CX,6
AGAIN:
MOV AL,[SI]
MOV DX,0EE05H
OUT DX,AL
MOV AL,[DI]
MOV DX,0EE02H
OUT DX,AL
INC SI
INC DI
DELAY:
PUSH CX
MOV BX,1000
AGAIND:
MOV CX,6000
DLP:
LOOP DLP
DEC BX
CMP BX,0
JNZ AGAIND ;延时段.........................
POP CX
LOOP AGAIN
POP DX
POP CX
POP BX
POP AX
RET
DISPLAY ENDP
CODE1 ENDS
;;;;;;;;;;;;;;;;;;;;;;;;;;;SCAN程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CODE2 SEGMENT
ASSUME CS:CODE2 ;SCAN程序
SCAN PROC FAR
MOV BH,4 ;置行数
MOV CL,4 ;置列数
MOV BL,0FFH ;置键值初值为-1
DO1:
MOV DX,0EE00H
MOV AL,0
OUT DX,AL ;置行线为0
MOV DX,0EE01H
IN AL,DX ;读列线
CMP AL,0FFH
JZ NONE ;无键值
MOV DX,0EE00H
MOV AL,11111110B
OUT DX,AL ;置行值为1110
MOV CH,AL
DO2:
MOV AL,CH
MOV DX,0EE00H
OUT DX,AL
MOV DX,0EE01H
IN AL,DX ;读列值
CMP AL,0FFH
JNZ YOU ;不为零则有按键
ADD BL,CL ;键值加4
ROL CH,1 ;否则改变行号
DEC BH
JNZ DO2 ;再一次
JMP NONE
YOU:
CALL FAR PTR DISPLAY ;调用display,消抖
DO3:
MOV AH,AL
MOV DX,0EE01H
IN AL,DX ;读列值
CMP AL,0FFH
JNZ DO3 ;不为零则说明未放手
CALL FAR PTR DISPLAY ;调用display,消抖
KEY:
INC BL
ROR AH,1
JC KEY ;计算键值
MOV BUF,BL ;将键值存入buf中
JMP DONE
NONE:
MOV BL,0FFH
MOV BUF,BL
DONE:
MOV AH,02H
MOV DL,0DH
INT 21H ;回车
MOV AL,BUF
MOV AH,02H
MOV DL,AL
INT 21H ;显示buf中的内容
RET
SCAN ENDP
CODE2 ENDS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
END MAIN
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -