微机原理加法计算器设计及显示.docx
- 文档编号:26921220
- 上传时间:2023-06-24
- 格式:DOCX
- 页数:22
- 大小:47.30KB
微机原理加法计算器设计及显示.docx
《微机原理加法计算器设计及显示.docx》由会员分享,可在线阅读,更多相关《微机原理加法计算器设计及显示.docx(22页珍藏版)》请在冰豆网上搜索。
微机原理加法计算器设计及显示
河尢必弟实验报告
课程名称:
微机原理实验
实验名称:
加法讣算器及显示
一、实验目的和要求(必填)
三、主要仪器设备(必填)
五、实验数据记录和处理
七、讨论、心得
.指导老师:
成绩:
实验类型:
同组学生姓名:
二、实验内容和原理(必填)
四、操作方法和实验步骤
六、实验结果与分析(必填)
一、实验目的和要求
1.掌握基于状态机的编程方法
2.实现数字运算、键盘输入、LED显示的多任务协调编程
二、实验内容和原理
1•编写程序,输入两个两位十进制数并显示,按确认键后显示运算结果
2.基本功能:
能够输入输入数字(非数字无效)并显示结果
3.附加功能:
光标指示功能(通过LED闪烁实现)以及退格功能
加法器设计:
编写程序,输入两个两位十进制数并显示,按确认键后显示运算结果。
(D基本功能:
能够输入数字(非数字无效)并显示结果。
(2)附加功能:
光标指示功能(通过LED闪烁实现),以及退格功能。
a.
:
三、程序代码
ORG0000H
START:
MOV78H.#0;初始化:
78H放0的段码,其余放熄火码
MOV
79H,#10
MOV
7AH,#10
MOV
7BH.#10
MOV
7CH・#10
MOV
R5.#0
;R5是按键次数,初始巻0
MOV
R6Jrt)
;将0置入R6中
MOV
R7,#0
;将0置入R7中
MOV
30H,#0
;30H是功能键存放单元,垃为0
MOV
31H.#0
;31H单元初始置为0
MOV
40H.#0
;40H单元初始置为0
MOV
41H.#0
;41H单元初始置为0
LOOP:
LCALLDIR
;调用显示子程序
LCALL
KEY
;调用键盘检测程序
装INCR5;按键次数加1
SI:
CJNEA,#10.S2;不是”+”键,跳到S2
订UMPFUN;是”+”键,跳到FUN
S2:
CJNEA,#11,S3;不是叮键,跳到S3
线UMPFUN;是叮键,跳到FUN
S3:
CJNEA・#12.S4;不是叱”键,跳到S4
:
UMPFUN;是w键,跳到FUN
:
S4:
CJNEA.#13,S5;不是"厂键,跳到S5
:
UMPFUN;是键,跳到FUN
:
S5:
CJNEA,#14.S6;不是僅”键,跳到S6
jUMPFUN;是怙”键,跳到FUN
[S6:
CJNEA,#15,N1;不是"CL”键,跳到N1
:
UMPSTART;是”CL”键,跳至ljSTART
jN1:
CJNER5.#1,N2;若按键次数不等于1,跳到N2
:
UMPDll;跳到。
11
jN2:
CJNER5.#2.START;若按键次数不等于2,跳到START
!
UMPT1;跳到T1
Dll:
MOVR4,A
MOV78H,A
MOV79H.#10
UMPLOOP
Tl:
MOV53H.A
MOVB.#10
MOVA.R4
;将A写入R4
;输入值送显示个位缓存
;将10送到79H单元
;跳转到循环
;将A写入53H
;将10置入B
;将上一次输入的R4写进A
MULAB
ADDA.53H
MOVR4,A
MOV79H.78H
MOV78H.53H
UMPLOOP
FUN:
MOV78H.#10
MOV79H.#10
MOVR0.30H
MOV30H.A
MOVA.RO
CJNEAJH0.FUN1
UMPADDY
FUN1:
;A乘以10
;53H里而的值与A相加
;将新的值置入到R4
;个位到十位
;新数为个位
;跳转到循环
;将10置入到78H
;将10巻入到79H
;与上次功能键交换
;判断功能键
UMPSUBT
FUN2:
UMPMULT
FUN3:
CJNEA・#11.FUN2
CJNEA.#12・FUN3
CJNEA.#13.FUN4
CLRC
SUBBA.R4
JBCY.BCD2
MOV40H.A
MOVR5,#0
UMPBCD
MULT:
MOVA,40H
MOVB.A
MOVA,R4
MULAB
MOVR5,#0
JBOV.BCDl
装UMPDIVI
FUN4:
CJNEA.#14,FUN5;首次按功能键,即A=#0
订UMPEQUA
FUN5:
MOV40H.R4;保存第一个数
线MOVR5.#0;按键次数淸零
LJMPBCD;将其拆为BCD码,以便后来将其显示
OF:
UMPSTART;跳转回开始
ADDY:
MOVA.40H;加法.第一个数送累加器
ADDA.R4
MOV40H,A
MOVR5,#0
UMPBCD
;第一个数加第二个数
;存本次结果
;按键次数淸零
;跳转到BCD程序
SUBT:
MOVA.40H;减法,第一个数送累加器
;借位淸零
;带借位的减法,第一个数减第二个数
;借位为1,跳转到BCD2
;将减的结果送40H
;按键次数淸零
;跳转到BCD
;乘法,第一个数送累加器
;将A送B
;将第二个数送累加器
;第一个数乘以第二个数
;按键次数淸零
;若乘法结果溢出,则跳转到BCD1
MOV40H,A
;将A送40H
:
LJMPBCD
;跳转到BCD
:
DIVI:
MOVA.R4
;除法,第二个数送累加器
:
MOVB.A
;将第二个数送B
jMOVA,40H
;将第一个数送A
$DIVAB
;A除以B
:
JBOV.OF
;当B为0时跳到OF
:
MOV40H,A
;将A送40H
:
MOVR5,#0
;按键次数淸零
jUMPBCD
;跳转到BCD
jEQUA:
MOVR5,#0
;按键次数淸零
:
MOV31H,A
;将A送31H
:
UMPBCD
;跳转到BCD
i;■…乘法溢岀时的处理程序
[BCDl:
;乘法溢出时的处理程序
:
MOV78H,B
;将高8位送78H
•MOV79H,A
;将低8位送79H
装LCALLHEX2BCD
;调用子程序把78H.79H中的数字,转换成BCD码,送到7AH7BH7CH
MOVA.7CH
;下而,把万千百十个位,分别存入7CH7BH7AH79H78H
订MOVB,#16
DIVAB
;除以16,目的是分离出髙、低四位
线MOV79H.A
;存放十位
MOV78H.B
;存放个位
:
MOVA,7AH
:
MOV7CH.A
;存放万位
:
MOVA.7BH
:
MOVB.#16
[DIVAB
:
MOV7BH.A
:
MOV7AH.B
:
UMPLOOP
[HEX2BCD:
汙程序:
把78H、79H中的数字,转换成BCD码,送到7AH7BH7CH
:
CLRA
:
MOV7AH.A
;先淸零
:
MOV7BH,A
jMOV7CH.A
[MOVR6,#16
;共转换十六位数
:
LOOPP:
jCLRC
:
MOVA.79H
;从待转换数的高端移出一位到Cy
1RLCA
MOV79H,A
MOVA,78H
RLCA
MOV78H,A
MOVA.7CH
;送到BCD码的低端
ADDCA.7CH
;带进位加。
自身相加,相当于左移一位
DAA
;十进制调整,变成BCD码
MOV7CH,A
MOVA,7BH
ADDCA,7BH
DAA
MOV7BH,A
MOVA,7AH
ADDCA,7AH
MOV7AH.A
DJNZR6,LOOPP
RET
;共转换十六位数
装
BCD2:
MOVA.#100
;减法第七位有借位时的处理程序
CLRC
;借位淸零
订
SUBBA.R4
;100-被减数
MOVR4,A
;将结果存在R4中
线
MOVA,40H
;将减数给A
ADDA.R4
;减数+(100-被减数)
MOVR4.A
;将结果给R4
MOVA,#100
;将100给A
CLRC
;将CY淸零
SUBBA.R4
;100-(减数+(100-被减数))
MOVB.#10
;将10给B
DIVAB
;A除以10
MOV7AH.#11
;将11给7AH,以便显7F符号
MOV79H.A
;将A给79H
MOV78H,B
;将B给78H
UMPLOOP
;跳转到LOOP
;—拆为BCD码的程序
BCD:
MOVB.#10
;将10给B
MOVA,40H
;结果送累加器
DIVAB
;结果除10
MOV41HA
;41H暂存”商”
MOVA3
;取余数
MOV78H,A
;余数送78H
MOVB.#10
;将10送B
MOVA,41H
;将商送A
:
DIVAB
;A除以10
:
CJNEA,#O.PANDUAN1
;若人不等于0,贝lj跳转到PANDUAN1
:
MOV79H.B
;若人等于0,则将B送79H
jUMPRETURN
;跳转到RETURN
$PANDUAN1:
:
MOV7AH,A:
A送7AH
jMOV79H,B
;B送79H
:
RETURN:
UMPLOOP
;跳转到LOOP
[;■…动态显示子程序
:
DIR:
MOVDPTR.#TAB;数码管译码表首址
jMOVR0,#78H
;待显缓冲区个位地址
:
CJNER5,#1,ANJIAN2
;判断按键次数是否为1,不是则跳转到ANJIAN2
jANJIAN1:
MOVA,RO
;将显示区的个位地址给A
[MOVCA.A+DPTR
;査表
:
CLRP2.3
;点亮P2.3
•MOVP3,A
;字段码送P3口
装LCALLDELAY1ms
;调延时1ms子程序
SETBP2.3
;关闭P2.3
订MOVP3・#0FFH
;将P3口熄火
LCALLDELAY1ms;凋用延时1ms子程序
线
-按键1次时光标闪烁功能
INCR6
;将R6加1
CJNER6.#70.SHANSHUOl;若R6不等于70,则跳转到SHANSHUO1
SETBP2.2
;将P2.2关闭
MOVP3.#0FFH
;将P2口熄灭
LCALLDELAY1ms
;调用延时1ms子程序
DECR6
:
R6就减1
INCR7
:
R7加1
CJNER7,#70.FANHUI
;判断R7是否等于70,若不等于70,则跳转到FANHUI
MOVR6.#0
;将R6置0
MOVR7,#0
;将R7置0
FANHULRET
;子程序返回
SHANSHUO1:
CLRP2.2
;打开P2.2
MOVP3・#0EFH
;显示
LCALLDELAY1ms
;调用延时1ms子程序
SETBP2.2
;关闭P2.2
MOVP3.#0FFH
;熄火P3
RET
;返回
;・…按键次数为2显示
ANJIAN2:
CJNER5,#2.ANJIANDENG;如果R5不等于0,则跳转到ANJIANDENG
MOVA.R0
MOVCA.A+DPTR
CLRP2.3
MOVP3.A
LCALLDELAY1ms
SETBP2.3
MOVP3.#0FFH
INCRO
MOVA.RO
MOVCA.A+DPTR
CLRP2.2
MOVP3.A
LCALLDELAY1ms
SETBP2.2
MOVP3.#0FFH
;将显示区的个位地址给A
;查表
;点亮P2.3
;将个位显示
;凋用延时1ms
;关闭P2.3
;关闭显示
:
R0加1
;将显示区的十位地址给A
渣表
;打开P2.2
;将十位送P3显示
;调用延时1ms子程序
;关闭P2.2
;关闭显示
SETBP2」线MOVP3.#0FFH
LCALLDELAY1ms
:
DECR6
:
INCR7
:
CJNER7・#70.FANHUI2
jMOVR6,#0
[MOVR7,#0
:
FANHUI2:
RET
:
SHANSHUO2:
:
CLRP2.1
:
MOVP3.#0EFH
[LCALLDELAY1ms
:
SETBP2」
:
MOVP3.#0FFH
jRET
装;・…按键两次时光标闪烁功能
INCR6:
R6力D1
订CJNER6.#70,SHANSHUO2;判断R6是否为70,若否跳转到SHANSHUO2
;将P2.1关闭
;关闭显示
;调用延时1ms子程序
:
R6减1
:
R7加1
;若R7不等于70,则跳转到FANHUI2
;将0送R6
;将R7置0
;子程序返回
;打开P2.1
;显示
;调用延时1ms子程序
;关闭P2.1
;关闭显示
;返回
;一按键后的显示
ANJIANDENG:
MOVA,31H;将31H送A
CJNEA,#0.ANJIAN0;A不等于0时跳转到ANJIANO
MOVA,R0;将个位的地址送A
MOVCA.A+DPTR渣表
CLRP2.3
:
MOVP3.A
:
LCALLDELAY1ms
:
SETBP2.3
jMOVP3・#OFFH
jINCRO
:
MOVA.RO
:
MOVCA,A+DPTR
:
CLRP2.2
jMOVP3.A
[LCALLDELAY1ms
:
SETBP2.2
:
MOVP3・#OFFH
:
INCRO
jMOVA,R0
[MOVCA.A+DPTR
:
CLRP2.1
•MOVP3.A
装LCALLDELAY1ms
SETBP2.1
订MOVP3.#0FFH
INCRO线MOVA,R0
MOVCA.A+DPTR
:
CLRP2.0
:
MOVP3.A
:
LCALLDELAY1ms
jSETBP2.0
[MOVP3.#OFFH
:
RET
i;-…没按键时的显示
iANJIANO:
MOVA.ROjMOVCA,A+DPTR
:
CLRP2.3
:
MOVP3.A
:
LCALLDELAY1ms
jSETBP2.3
[MOVP3・#OFFH
:
RET
;打开P2.3
;显示个位
;调用延时1ms子程序
;关闭P2.3
;关闭显示
:
R0加1
;将十位的地址送A
;查表
;打开P2.2
;显示十位
;调用延时1ms子程序咲闭P2.2
;关闭显示
:
R0加1
;将百位地址送A
;査表
;打开P2.1
;显示百位
;调用延时1ms子程序
;关闭P2.1
;关闭显示
:
R0加1
;将千位的地址送A
渣表
;打开P2.0
;显示千位
;调用延时1ms子程序;关闭P2.0
;关闭显示
;返回
;将R0的地址送A
;查表
;打开P2.3
;显示
;调用延时1ms子程序咲闭P2.3
;关闭显示
;返回
TAB:
DB28H.7EH.0A2H.62H74H.61H,21HJAH.20H.60H.0FFH,0F7H;共阳极译码表
DELAYIms:
MOV50H.#2涎时1ms子程序
LOOP1:
MOV53H.#248
NOP
LOOP2:
DJNZ53H.LOOP2
DJNZ50H.LOOP1
RET
DELAY1:
MOV51H.#5涎时子程序DELAY1
DELAY3:
DJNZ51H.DELAY3
RET
;调用检测按键子程序;有键按下继续
;无键按调用延时去抖
;调用动态显示
;返回继续检测按键
KI:
LCALLDELAY2
;有键按下延时去抖动
装LCALLKS
JNZK2
订ACALLDIR
AJMPKEY
线K2:
MOVR2.#0EFH
MOVR3.#00H
:
K3:
MOVPLR2
:
LO:
JBP1.O.L1
:
MOVA.#00H
jAJMPLK
[LI:
JBP1.LL2
:
MOVA,#04H
:
AJMPLK
jL2:
JBP12L3
jMOVA.#08H
jAJMPLK
:
L3:
JBP1.3.NEXT
:
MOVA,#0CH
:
LK:
ADDA.R3
jPUSHACC
[K4:
LCALLDELAY2
:
LCALLKS
jJNZK4
:
POPACC
MOVDPTR.#KEYTAB
;再调用检测按腱子程序
;确认有按键进行下一步
;调用动态显示
;无键按下返回继续检测
;将扫描值送入R2暂存
;将第一列值送入R3暂存
;将R2值送入P1口
;P1.0等于1跳转到L1
;将第一行值送入ACC
;跳转到键值处理程序
;P1.1等于1跳转到L2
;将第二行的行值送入ACC
;跳转到键值处理程序
;P1.2等于1跳转到L3
;将第三行行值送入ACC
;跳转到键值处理程序
;P1.3等于1跳转到NEXT处
;将第四行行值送入ACC
;行值与列值相加后的键值送入A
;将A中的值送入堆栈暂存
;调用延时去抖程序
;调用按键检测程序
;按键没有松开继续返回检测
;将堆栈值送入ACC
MOVCAA+DPTR
RET
NEXT:
INCR3
MOVA.R2
;列值加一
:
R2值送入A
JNBACC.7KEY;扫描完至KEY处进行下一扫描
RLA
MOVR2,A
AJMPK3
KS:
MOVPL#OFH
MOVA.P1
XRLA.#0FH
RET
;扫描未完将值左移一位进行下一列扫描
;将ACC值送入R2暂存
;跳转到K3继续
;将戸1口髙四位置0低四位宜1
;读戸1口
;将A中的值与A中的值相异或
;子程序返回
KEYTAB:
DB123,10.4,5611,7,8.9J2J5Q14,13;键值表
DELAY2:
MOV52H.#2H涎时去抖动子程序
LP1:
MOV53H,#0FAH
LP2:
DJNZ53H.LP2
DJNZ52H.LP1
RET
四、讨论、心得
本次计算器的实验是一次综合性比较强的实验,对前面所学的知识是一个很好的考察。
里而很多细小的地方在用汇编编程的时候都很有挑战性。
比如开始该如何在数码管上一直显示就困扰了我很长时间:
乘法溢出时如何处理也让我考虑了很久。
总之,这次的实验让我对汇编语言的熟悉程度进一步加深,并且对我结构化模块化编程的能力有一左的提高作用。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微机 原理 加法 计算器 设计 显示