微机原理加法计算器设计及显示_第1页
微机原理加法计算器设计及显示_第2页
微机原理加法计算器设计及显示_第3页
微机原理加法计算器设计及显示_第4页
微机原理加法计算器设计及显示_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、P11装 订 线实验报告课程名称: 微机原理实验 指导老师: 成绩: 实验名称: 加法计算器及显示 实验类型: 同组学生姓名: 一、实验目的和要求(必填)二、实验内容和原理(必填)三、主要仪器设备(必填)四、操作方法和实验步骤五、实验数据记录和处理六、实验结果与分析(必填)七、讨论、心得一、 实验目的和要求1. 掌握基于状态机的编程方法2. 实现数字运算、键盘输入、LED显示的多任务协调编程二、 实验内容和原理1. 编写程序,输入两个两位十进制数并显示,按确认键后显示运算结果2. 基本功能:能够输入输入数字(非数字无效)并显示结果3. 附加功能:光标指示功能(通过LED闪烁实现)以及退格功能三

2、、 程序代码ORG 0000HSTART: MOV 78H,#0 ;初始化:78H放0的段码,其余放熄灭码MOV 79H,#10MOV 7AH,#10MOV 7BH,#10MOV 7CH,#10MOV R5,#0 ;R5是按键次数,初始置0MOV R6,#0 ;将0置入R6中MOV R7,#0 ;将0置入R7中MOV 30H,#0 ;30H是功能键存放单元,置为0MOV 31H,#0 ;31H单元初始置为0MOV 40H,#0 ;40H单元初始置为0MOV 41H,#0 ;41H单元初始置为0LOOP: LCALL DIR ;调用显示子程序LCALL KEY ;调用键盘检测程序INC R5 ;

3、按键次数加1S1: CJNE A,#10,S2 ;不是+键,跳到S2LJMP FUN ;是+键,跳到FUNS2: CJNE A,#11,S3 ;不是-键,跳到S3LJMP FUN ;是-键,跳到FUNS3: CJNE A,#12,S4 ; 不是*键,跳到S4LJMP FUN ; 是*键,跳到FUNS4: CJNE A,#13,S5 ; 不是/键,跳到S5LJMP FUN ; 是/键,跳到FUNS5: CJNE A,#14,S6 ; 不是=键,跳到S6LJMP FUN ;是=键,跳到FUNS6: CJNE A,#15,N1 ; 不是CL键,跳到N1LJMP START ; 是CL键,跳到STAR

4、TN1: CJNE R5,#1,N2 ;若按键次数不等于1,跳到N2LJMP D11 ;跳到D11N2: CJNE R5,#2,START;若按键次数不等于2,跳到STARTLJMP T1 ;跳到T1D11: MOV R4,A ;将A写入R4MOV 78H,A ;输入值送显示个位缓存MOV 79H,#10 ;将10送到79H单元LJMP LOOP ;跳转到循环T1: MOV 53H,A ;将A写入53HMOV B,#10 ;将10置入BMOV A,R4 ;将上一次输入的R4写进AMUL AB ;A乘以10ADD A,53H ;53H里面的值与A相加MOV R4,A ;将新的值置入到R4MOV

5、79H,78H ;个位到十位MOV 78H,53H ;新数为个位LJMP LOOP ;跳转到循环FUN:MOV 78H,#10 ;将10置入到78HMOV 79H,#10 ;将10置入到79HMOV R0,30H ;与上次功能键交换MOV 30H,A MOV A,R0CJNE A,#10,FUN1 ;判断功能键LJMP ADDY ;FUN1: CJNE A,#11,FUN2LJMP SUBT ;FUN2: CJNE A,#12,FUN3LJMP MULT ;*FUN3: CJNE A,#13,FUN4LJMP DIVI ;/FUN4: CJNE A,#14,FUN5 ;首次按功能键,即A=#0

6、LJMP EQUA ;=FUN5: MOV 40H,R4 ;保存第一个数MOV R5,#0 ;按键次数清零LJMP BCD ;将其拆为BCD码,以便后来将其显示OF: LJMP START ;跳转回开始ADDY: MOV A,40H ;加法,第一个数送累加器ADD A,R4 ;第一个数加第二个数MOV 40H,A ;存本次结果MOV R5,#0 ;按键次数清零LJMP BCD ;跳转到BCD程序SUBT: MOV A,40H ;减法,第一个数送累加器CLR C ;借位清零SUBB A,R4 ;带借位的减法,第一个数减第二个数JB CY,BCD2 ;借位为1,跳转到BCD2MOV 40H,A ;

7、将减的结果送40HMOV R5,#0 ;按键次数清零LJMP BCD ;跳转到BCDMULT: MOV A,40H ;乘法,第一个数送累加器MOV B,A ;将A送BMOV A,R4 ;将第二个数送累加器MUL AB ;第一个数乘以第二个数MOV R5,#0 ;按键次数清零JB OV,BCD1 ;若乘法结果溢出,则跳转到BCD1MOV 40H,A ;将A送40HLJMP BCD ;跳转到BCDDIVI: MOV A,R4 ;除法,第二个数送累加器MOV B,A ;将第二个数送BMOV A,40H ;将第一个数送ADIV AB ;A除以BJB OV,OF ;当B为0时跳到OFMOV 40H,A

8、;将A送40HMOV R5,#0 ;按键次数清零LJMP BCD ;跳转到BCDEQUA: MOV R5,#0 ;按键次数清零MOV 31H,A ;将A送31HLJMP BCD ;跳转到BCD;-乘法溢出时的处理程序BCD1: ;乘法溢出时的处理程序MOV 78H, B ;将高8位送78HMOV 79H, A ;将低8位送79HLCALL HEX2BCD ;调用子程序把78H、79H中的数字,转换成BCD码,送到7AH 7BH 7CH MOV A, 7CH ;下面,把万千百十个位,分别存入7CH 7BH 7AH 79H 78HMOV B, #16 DIV AB ;除以16,目的是分离出高、低四

9、位MOV 79H, A ;存放十位MOV 78H, B ;存放个位MOV A, 7AHMOV 7CH, A ;存放万位MOV A, 7BHMOV B, #16DIV ABMOV 7BH, AMOV 7AH, BLJMP LOOPHEX2BCD: ;子程序:把78H、79H中的数字,转换成BCD码,送到7AH 7BH 7CH CLR AMOV 7AH, A ;先清零MOV 7BH, AMOV 7CH, AMOV R6, #16 ;共转换十六位数 LOOPP:CLR CMOV A, 79H ;从待转换数的高端移出一位到CyRLC AMOV 79H, AMOV A, 78HRLC AMOV 78H,

10、 AMOV A, 7CH ;送到BCD码的低端ADDC A, 7CH ;带进位加。自身相加,相当于左移一位DA A ;十进制调整,变成BCD码MOV 7CH, AMOV A, 7BHADDC A, 7BHDA AMOV 7BH, AMOV A, 7AHADDC A, 7AHMOV 7AH, ADJNZ R6,LOOPP ;共转换十六位数RETBCD2:MOV A,#100 ;减法第七位有借位时的处理程序CLR C ;借位清零SUBB A,R4 ;100-被减数MOV R4,A ;将结果存在R4中MOV A,40H ;将减数给AADD A,R4 ;减数+(100-被减数)MOV R4,A ;将结

11、果给R4MOV A,#100 ;将100给ACLR C ;将CY清零SUBB A,R4 ;100-(减数+(100-被减数)MOV B,#10 ;将10给BDIV AB ;A除以10MOV 7AH,#11 ;将11给7AH,以便显示符号MOV 79H,A ;将A给79HMOV 78H,B ;将B给78HLJMP LOOP ;跳转到LOOP;-拆为BCD码的程序BCD: MOV B,#10 ;将10给BMOV A,40H ;结果送累加器DIV AB ;结果除10MOV 41H,A ;41H暂存商MOV A,B ;取余数MOV 78H,A ;余数送78HMOV B,#10 ;将10送BMOV A,

12、41H ;将商送ADIV AB ;A除以10CJNE A,#0,PANDUAN1 ;若A不等于0,则跳转到PANDUAN1MOV 79H,B ;若A等于0,则将B送79HLJMP RETURN ;跳转到RETURNPANDUAN1:MOV 7AH,A ;A送7AHMOV 79H,B ;B送79HRETURN:LJMP LOOP ;跳转到LOOP;-动态显示子程序DIR: MOV DPTR,#TAB ;数码管译码表首址MOV R0,#78H ;待显缓冲区个位地址CJNE R5,#1,ANJIAN2 ;判断按键次数是否为1,不是则跳转到ANJIAN2ANJIAN1: MOV A,R0 ;将显示区的

13、个位地址给AMOVC A,A+DPTR ;查表CLR P2.3 ;点亮P2.3MOV P3,A ;字段码送P3口LCALL DELAY1ms ;调延时1ms 子程序SETB P2.3 ;关闭P2.3MOV P3,#0FFH ;将P3口熄灭LCALL DELAY1ms ;调用延时1ms子程序;-按键1次时光标闪烁功能INC R6 ;将R6加1CJNE R6,#70,SHANSHUO1 ;若R6不等于70,则跳转到SHANSHUO1SETB P2.2 ;将P2.2关闭MOV P3,#0FFH ;将P2口熄灭LCALL DELAY1ms ;调用延时1ms子程序DEC R6 ;R6就减1INC R7

14、;R7加1CJNE R7,#70,FANHUI ;判断R7是否等于70,若不等于70,则跳转到FANHUIMOV R6,#0 ;将R6置0MOV R7,#0 ;将R7置0FANHUI:RET ;子程序返回SHANSHUO1:CLR P2.2 ;打开P2.2MOV P3,#0EFH ;显示“-”LCALL DELAY1ms ;调用延时1ms子程序SETB P2.2 ;关闭P2.2MOV P3,#0FFH ;熄灭P3RET ;返回;-按键次数为2显示ANJIAN2:CJNE R5,#2,ANJIANDENG;如果R5不等于0,则跳转到ANJIANDENGMOV A,R0 ;将显示区的个位地址给AM

15、OVC A,A+DPTR ;查表CLR P2.3 ;点亮P2.3MOV P3,A ;将个位显示LCALL DELAY1ms ;调用延时1msSETB P2.3 ;关闭P2.3MOV P3,#0FFH ;关闭显示INC R0 ;R0加1MOV A,R0 ;将显示区的十位地址给AMOVC A,A+DPTR ;查表CLR P2.2 ;打开P2.2MOV P3,A ;将十位送P3显示LCALL DELAY1ms ;调用延时1ms子程序SETB P2.2 ;关闭P2.2MOV P3,#0FFH ;关闭显示;-按键两次时光标闪烁功能INC R6 ;R6加1CJNE R6,#70,SHANSHUO2 ;判断

16、R6是否为70,若否跳转到SHANSHUO2SETB P2.1 ;将P2.1关闭MOV P3,#0FFH ;关闭显示LCALL DELAY1ms ;调用延时1ms子程序DEC R6 ;R6减1INC R7 ;R7加1CJNE R7,#70,FANHUI2 ;若R7不等于70,则跳转到FANHUI2MOV R6,#0 ;将0送R6MOV R7,#0 ;将R7置0FANHUI2:RET ;子程序返回SHANSHUO2:CLR P2.1 ;打开P2.1MOV P3,#0EFH ;显示“-”LCALL DELAY1ms ;调用延时1ms子程序SETB P2.1 ;关闭P2.1MOV P3,#0FFH

17、;关闭显示RET ;返回;-按“=”键后的显示ANJIANDENG:MOV A,31H ;将31H送ACJNE A,#0,ANJIAN0 ;A不等于0时跳转到ANJIAN0MOV A,R0 ;将个位的地址送AMOVC A,A+DPTR ;查表CLR P2.3 ;打开P2.3MOV P3,A ;显示个位LCALL DELAY1ms ;调用延时1ms子程序SETB P2.3 ;关闭P2.3MOV P3,#0FFH ;关闭显示INC R0 ;R0加1MOV A,R0 ;将十位的地址送AMOVC A,A+DPTR ;查表CLR P2.2 ;打开P2.2MOV P3,A ;显示十位LCALL DELAY

18、1ms ;调用延时1ms子程序SETB P2.2 ;关闭P2.2MOV P3,#0FFH ;关闭显示INC R0 ;R0加1MOV A,R0 ;将百位地址送AMOVC A,A+DPTR ;查表CLR P2.1 ;打开P2.1MOV P3,A ;显示百位LCALL DELAY1ms ;调用延时1ms子程序SETB P2.1 ;关闭P2.1MOV P3,#0FFH ;关闭显示INC R0 ;R0加1MOV A,R0 ;将千位的地址送AMOVC A,A+DPTR ;查表CLR P2.0 ;打开P2.0MOV P3,A ;显示千位LCALL DELAY1ms ;调用延时1ms子程序SETB P2.0

19、;关闭P2.0MOV P3,#0FFH ;关闭显示RET ;返回;-没按键时的显示ANJIAN0: MOV A,R0 ;将R0的地址送AMOVC A,A+DPTR ;查表CLR P2.3 ;打开P2.3MOV P3,A ;显示LCALL DELAY1ms ;调用延时1ms子程序SETB P2.3 ;关闭P2.3MOV P3,#0FFH ;关闭显示RET ;返回TAB: DB 28H,7EH,0A2H,62H,74H,61H,21H,7AH,20H,60H,0FFH,0F7H ;共阳极译码表DELAY1ms: MOV 50H,#2 ;延时1ms子程序LOOP1: MOV 53H,#248NOPL

20、OOP2:DJNZ 53H,LOOP2DJNZ 50H,LOOP1RETDELAY1:MOV 51H,#5 ;延时子程序DELAY1DELAY3:DJNZ 51H,DELAY3RET;-键盘子程序KEY: LCALL KS ;调用检测按键子程序JNZ K1 ;有键按下继续LCALL DELAY2 ;无键按调用延时去抖ACALL DIR ;调用动态显示AJMP KEY ;返回继续检测按键K1: LCALL DELAY2 ;有键按下延时去抖动LCALL KS ;再调用检测按腱子程序JNZ K2 ;确认有按键进行下一步ACALL DIR ;调用动态显示AJMP KEY ;无键按下返回继续检测K2:

21、MOV R2,#0EFH ;将扫描值送入R2暂存MOV R3,#00H ;将第一列值送入R3暂存K3: MOV P1,R2 ;将R2值送入P1口L0: JB P1.0,L1 ;P1.0等于1跳转到L1MOV A,#00H ;将第一行值送入ACCAJMP LK ;跳转到键值处理程序L1: JB P1.1,L2 ;P1.1等于1跳转到L2MOV A,#04H ;将第二行的行值送入ACCAJMP LK ;跳转到键值处理程序L2: JB P1.2,L3 ;P1.2等于1跳转到L3MOV A,#08H ;将第三行行值送入ACCAJMP LK ;跳转到键值处理程序L3: JB P1.3,NEXT ;P1.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论