加减乘除计算器设计Word下载.docx
《加减乘除计算器设计Word下载.docx》由会员分享,可在线阅读,更多相关《加减乘除计算器设计Word下载.docx(16页珍藏版)》请在冰豆网上搜索。
以下为按键扫描子程序,程序返回后,在变量H和L中存放当前按键的行列号
KEYPROC
CHECK:
CALLDISP;
等待按键按下的同时进行显示
MOVAL,0F0H;
所有行输出低电平
OUT44H,AL
INAL,40H
CMPAL,0FFH;
读列值
JZCHECK;
若都为高电平则无键按下,等待
MOVCX,50
LOOP$;
延时消抖
INAL,DX;
重读列值
CMPAL,0FFH
无键按下一直等待
MOVH,0;
有键按下,先把行列号变量清0
MOVL,0
MOVBL,01H
MOVBH,0FEH;
扫描法读键值:
从第一行开始测试,即PC0输出
低电平
NEXT:
MOVAL,BH
NEXTH:
INAL,40H;
读列值,判断是第几列有键按下
TESTAL,BL;
从第一列开始判断
JZWAIT0
ROLBL,1
CMPBL,10H;
当前行状态下没有任何列有键按下,则转为对下一行的测试
JZNEXTL
INCH;
每判断一列,列号加1
JMPNEXTH;
再对下一列进行判断
NEXTL:
MOVH,0
ROLBH,1;
对下一行测试,让下一个PC口输出低电平
CMPBH,0EFH
JZEXIT
INCL
JMPNEXT
WAIT0:
若有键按下,则等该按键松开后再计算键值
JNZWAIT0
CALLKEYVALUE;
调计算键值子程序
EXIT:
RET
KEYENDP
以下为计算键值子程序,通过行列号计算键值(键值=列号*4+行号)
键值存放在DL寄存器中
KEYVALUEPROC
MOVDL,L
MOVDH,H
SHLDL,1
SHLDL,1;
列号乘4
ADDDL,DH
CMPDL,0
JZNUM_CALL;
按下的是数字键
CMPDL,1
CMPDL,2
CMPDL,4
CMPDL,5
CMPDL,6
CMPDL,8
CMPDL,9
CMPDL,10
CMPDL,13
CMPDL,3
JZCONT_CALL;
按下的是运算键
CMPDL,7
CMPDL,11
CMPDL,15
CMPDL,14
JZOUTP_CALL;
按下的是等于键
CMPDL,12
JZCLR_CALL;
按下的是清除键
NUM_CALL:
CALLNUMBER;
调数字键处理子程序
JMPEXIT1
CONT_CALL:
MOVS,DL;
存放运算键的键值
MOVE,0
CALLCOUNT;
调运算键处理子程序,计算第一个加数
OUTP_CALL:
CALLOUTP;
调等号键处理子程序
CLR_CALL:
CALLCLEAR;
调清除键处理子程序
EXIT1:
KEYVALUEENDP
以下为清除键处理子程序,按下清除键后,X变量全部清0
CLEARPROC
MOVX[3],0
MOVX[2],0
MOVX[1],0
MOVX[0],0
CALLBITP
CLEARENDP
以下为等号键处理子程序,该子程序负责将第二个运算数据的数值计算出来存入X2变量
并根据运算符号,调用相应的运算子程序
OUTPPROC
PUSHAX
PUSHDX
PUSHBX
INCE
调运算键处理子程序,计算第二个运算数据
CMPS,15
JZADD_CALL;
运算符为加号,则调用加法子程序
CMPS,11
JZSUB_CALL;
运算符为减号,则调用减法子程序
CMPS,7
JZMUL_CALL;
运算符为乘号,则调用乘法子程序
CMPS,3
CALLDIVP;
运算符为除号,则调用除法子程序
JMPSTORE1
ADD_CALL:
CALLADDP
SUB_CALL:
CALLSUBP
MUL_CALL:
CALLMULP
STORE1:
MOVAX,Y;
以下程序将各运算子程序返回的运算结果,按位分解,送入X变量
MOVDX,0
MOVBX,1000
DIVBX
MOVX[0],AL
MOVAX,DX
MOVBL,100
DIVBL
MOVX[1],AL
MOVAL,AH
MOVAH,0
MOVBL,10
MOVX[2],AL
MOVX[3],AH
POPBX
POPDX
POPAX
OUTPENDP
以下为运算键处理子程序,该程序将第一个运算数据的数值计算出来并存入X1变量
或者将第二个运算数据的数值计算出来并存入X2变量
将运算符的值存入S变量
COUNTPROC
CALLBITP;
测试X中的数据是多少位
CMPCC,4;
输入的数据是4位数?
JZC4
CMPCC,3;
输入的数据是3位数?
JZC3
CMPCC,2;
输入的数据是2位数?
JZC2
JMPC1;
输入的数据是1位数?
C4:
MOVAX,0
MOVAL,X[0]
MULBX
MOVDX,AX
C3:
MOVAL,X[1]
MULBL
ADDDX,AX
C2:
MOVAL,X[2]
C1:
MOVAL,X[3]
CMPE,1
JNZX1_S
MOVX2,DX;
按下的是等号,则将第二个运算数据的值存入X2变量
JMPEXIT3
X1_S:
MOVX1,DX;
按下的是运算符号,则将第一个运算数据的值存X1变量
MOVX[3],0;
清空X变量
EXIT3:
COUNTENDP
以下为数字键处理子程序
该程序,将输入的数据按位存放在X变量中,并由CC记录数据的位数
NUMBERPROC
CMPDL,8
JZK1
CMPDL,9
JZK2
CMPDL,10
JZK3
CMPDL,4
JZK4
CMPDL,5
JZK5
CMPDL,6
JZK6
CMPDL,0
JZK7
CMPDL,1
JZK8
CMPDL,2
JZK9
CMPDL,13
JZK0
K1:
MOVDL,1
JMPN1
K2:
MOVDL,2
K3:
MOVDL,3
K4:
MOVDL,4
K5:
MOVDL,5
K6:
MOVDL,6
K7:
MOVDL,7
K8:
MOVDL,8
K9:
MOVDL,9
K0:
MOVDL,0
N1:
JNZCONTINUE
CALLCLEAR
CONTINUE:
CMPCC,0;
目前数据为0位,即没有数据,则转到SSS
JZSSS
若已有数据,以下程序将X左移8位。
例如:
先输入“1”,当再输入2时,
先要将“1”从个位移到十位,然后再将“2”存放到个位
MOVAH,X[2]
MOVDL,X[1]
MOVDH,X[0]
MOVCX,8
LL:
SHLAX,1
RCLDX,1
LOOPLL
MOVX[3],AL
MOVX[2],AH
MOVX[1],DL
MOVX[0],DH
SSS:
MOV[DI],DL
INCCC;
数据位数加1
判断数据位数
JNGEXIT2
MOVCC,0;
如果数据超过4位,重新从最低位开始存放
EXIT2:
调显示子程序,显示输入的数据
NUMBERENDP
加法子程序
ADDPPROC
MOVAX,X1
ADDAX,X2
MOVY,AX
ADDPENDP
减法子程序
SUBPPROC
SUBAX,X2
SUBPENDP
乘法子程序
MULPPROC
MOVDX,X2
MULDX
MULPENDP
除法子程序
DIVPPROC
MOVBX,X2
DIVPENDP
显示子程序,将X中的数值按位显示出来
DISPPROC
MOVBH,0
LEASI,DISCODE
测试X位数
CMPCC,4
JZQIAN
CMPCC,3
JZBAI
CMPCC,2
JZSHI
CMPCC,1
JMPG
JMPNONE
QIAN:
MOVAH,11100000B;
从第4位开始显示
MOVBL,X[0]
MOVAL,[SI+BX]
OUT42H,AL
CALLDELY
MOVAL,0
BAI:
MOVAH,11010000B;
从第3位开始显示
MOVBL,X[1]
SHI:
MOVAH,10110000B;
从第2位开始显示
MOVBL,X[2]
G:
MOVAH,01110000B;
从第1位开始显示
MOVBL,X[3]
JMPEXIT4
NONE:
MOVAL,0;
X中没有数据,不显示
EXIT4:
DISPENDP
分析数据位数子程序
BITPPROC
CMPX[0],0;
如果X[0]不为0,则数据为4位数
JNZFOURBIT
CMPX[1],0;
如果X[1]不为0,则数据为3位数
JNZTHREEBIT
CMPX[2],0;
如果X[2]不为0,则数据为2位数
JNZTOWBIT
CMPX[3],0;
如果X[3]不为0,则数据为1位数
JNZONEBIT
JMPZER0BIT;
否则,没有数据
FOURBIT:
MOVCC,4
JMPEXIT5
THREEBIT:
MOVCC,3
TOWBIT:
MOVCC,2
ONEBIT:
MOVCC,1
ZER0BIT:
MOVCC,0
EXIT5:
BITPENDP
延时子程序
DELYPROC
PUSHCX
MOVCX,100
LOOP$
POPCX
DELYENDP
CODEENDS
ENDSTART
(注:
可编辑下载,若有不当之处,请指正,谢谢!
)