课 课程设计报告
附录
一、 软件设计
1. 总程序流程图
扫描 计算键值 数值? 运算符? 清零 “=”? 加法运算 “+”? 减法运算 “-”? 乘法运算 “*”? 显示 存储 除法运算
5
课 课程设计报告
2. 扫描程序流程图
开始 初始化 N 按键闭合 Y 延时12ms N 按键闭合 Y 按键扫描 N 按键释放 Y 保存键值 结束
3. 程序代码
;8255A端口地址:A口:40H,B口:44H,C口:42H,控制端口:46H DATA SEGMENT
X DB X1 DW ?
X2 DW Y DW S DB E DB CC DB
? , ? , ? , ? ;存放数据的每一位 ;存放第一个数据值 ?
;存放第二个数据值
? ;存放运算结果 ? ;存放运算符号值 ? ;按下等号键标记 ? ;存放运算数据位数
6
课 课程设计报告
H L DB DB 0 ;存放按键行号 0 ;存放按键列号
3FH,06H,5BH,4FH,
66H,6DH,7DH,07H,
7FH,6FH,77H,7CH, 39H,5EH,79H,71H
;段码表
DISCODE DB
DATA ENDS CODE SEGMENT
ASSUME CS:CODE DS:DATA
START:
MOV AX,DATA MOV DS,AX MOV AL,90H OUT 46H,AL
KKK:
;设置为A口输入,B口输出,C口输出
MOV DI,OFFSET X+3 ;DI指向X的高位 CALL KEY ;扫描按键 JMP KKK
;以下为按键扫描子程序,程序返回后,在变量H和L中存放当前按键的行列号 KEY PROC
CHECK: CALL
DISP
;等待按键按下的同时进行显示
MOV AL,0F0H ;所有行输出低电平 OUT 44H,AL
IN AL,40H
CMP AL,0FFH ;读列值 JZ CHECK ;若都为高电平则无键按下,等待 MOV CX,50 LOOP $ ;延时消抖
IN AL,DX ;重读列值 CMP AL,0FFH JZ CHECK ;无键按下一直等待
MOV H,0 ;有键按下,先把行列号变量清0 MOV L,0 MOV BL,01H
NEXT:
MOV BH,0FEH ;扫描法读键值:从第一行开始测试,即PC0输出低电平 MOV AL,BH
OUT 44H,AL
NEXTH: IN AL,40H ;读列值,判断是第几列有键按下
TEST AL,BL ;从第一列开始判断
JZ WAIT0 ROL BL,1
CMP BL,10H ;当前行状态下没有列有键按下,则转为对下一行的测试 JZ NEXTL INC
H
;每判断一列,列号加1
7
JMP NEXTH ;再对下一列进行判断
课 课程设计报告
NEXTL: MOV H,0
MOV BL,01H
ROL BH,1 ;对下一行测试,让下一个PC口输出低电平 CMP BH,0EFH JZ EXIT INC L JMP NEXT
WAIT0:
IN
AL,40H ;若有键按下,则等该按键松开后再计算键值
CMP AL,0FFH JNZ WAIT0 MOV CX,50 LOOP $ IN AL,40H CMP AL,0FFH JNZ WAIT0
EXIT: KEY ENDP
;以下为计算键值子程序,通过行列号计算键值(键值=行号*4+列号)键值存放在DL寄存器中 KEYVALUE PROC
MOV DL,L MOV DH,H SHL DL,1
SHL DL,1 ADD DL,DH
CMP DL,9 JNG NUM_CALL CMP DL,14
JL CONT_CALL CMP DL,14 JZ OUTP_CALL CMP DL,15
JZ
NUM_CALL: CALL
;按下的是运算键 ;按下的是等于键 ;列号乘4 ;按下的是数字键
CALL RET
KEYVALUE
;调计算键值子程序
;延时消抖
CLR_CALL ;按下的是清除键 NUMBER ;调数字键处理子程序
JMP EXIT1
CONT_CALL: MOV S,DL ;存放运算键的键值
MOV E,0
CALL COUNT JMP EXIT1
OUTP_CALL: CALL OUTP
JMP EXIT1 CLR_CALL: EXIT1: KEYVALUE ENDP
8
调运算键处理子程序,计算第一个加数
;调等号键处理子程序 ;调清除键处理子程序
CALL CLEAR RET
课 课程设计报告
;以下为清除键处理子程序,按下清除键后,X变量全部清0 CLEAR PROC
MOV X[3],0 MOV X[2],0 MOV X[1],0 MOV X[0],0 CALL BITP RET CLEAR ENDP
;以下为等号键处理子程序,该子程序负责将第二个运算数据的数值计算出来存入X2变量 ;并根据运算符号,调用相应的运算子程序 OUTP PROC
PUSH PUSH PUSH INC CALL
AX DX BX E
COUNT ;调运算键处理子程序,计算第二个运算数据
CMP S,10 JZ ADD_CALL ;运算符为加号,则调用加法子程序 CMP S,11 JZ SUB_CALL ;运算符为减号,则调用减法子程序 CMP S,12 JZ MUL_CALL ;运算符为乘号,则调用乘法子程序 CMP S,13 CALL DIVP ;运算符为除号,则调用除法子程序 JMP STORE1
ADD_CALL: SUB_CALL: MUL_CALL: STORE1:
CALL ADDP
JMP STORE1 CALL SUBP
JMP STORE1 CALL MULP MOV AX,Y
;以下程序将各运算子程序返回的运算结果,按位分解,送入X变量
MOV DX,0
MOV BX,1000 DIV BX
MOV X[0], AL MOV AX,DX MOV BL,100 DIV BL
MOV X[1],AL MOV AL,AH MOV AH,0 MOV BL,10 DIV BL
9