MOV R0,#58H MOV 58H,#04H INC @R0 push push58H push push17H (SP)= (0CH)= (0BH)=

单片机原理及接口技术课后习题答案(三)_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
25页免费18页免费4页免费28页1下载券27页免费 9页免费2页免费4页免费10页免费31页1下载券
喜欢此文档的还喜欢5页1下载券8页1下载券3页1下载券225页免费105页免费
单片机原理及接口技术课后习题答案(三)|单​片​机​原​理​及​接​口​技​术​,​西​安​电​子​科​技​大​学​出​版​社​,​第​二​版​。
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
你可能喜欢ADuC841的例程(3)
您好,欢迎来到61ic!
&.&&.&&.&&.&&.&&.&&.&&.&&.&&.&&.&&.&&.&&.&&.&&.&&.&&.&&.&&.&
您现在的位置:&&>>&&>>&&>>&正文
ADuC841的例程(3)
&&&&&&&&&&★★★
【字体: 】
ADuC841的例程(3)
作者:&&&&文章来源:&&&&点击数:&&&&更新时间:&&&&
实验6-3:TIC的应用:电子钟
利用TIC可以很容易地实现电子钟,一个简单的电子钟程序如下。
&&&&&&&&&&&&&&&&&& $MOD841&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ; ADuC841的预定义函数库。每个ADuC841的程序必须有。
&&&&& SP0&&& EQU&& 50H&&&&&&&&&&&&&&& ; 定义堆栈的初始指针
&&&&& CLK81& EQU&& P3.5&&&&&&&&&&&&&& ; 键盘显示芯片WH8281串行口的时钟线接P3.5
&&&&& DAT81& EQU&& P3.3&&&&&&&&&&&&&& ; 键盘显示芯片WH8281串行口的数据线接P3.3
&&&&& SHUZHI EQU&& 30H&&&&&&&&&&&&&&& ; 定义数据缓冲器的指针
&&&&& KEY&&& EQU&& P3.2&&&&&&&&&&&&&& ; 键盘显示芯片WH8281的中断申请线接P3.2
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
ORG& 0000H&&&&&&&&&&&&&&&&&&&&&& ; 开始执行的第一条指令所处的地址
&&&&&&&&&&&&&&&&&&&&&&&&&&& LJMP& MAIN&&&&&&&&&&&&&&&&&&&& ; 跳转到主程序
&&&&&&&&&&&&& ORG& 0053H&&&&&&&&&&&&&&&&&&&&&& ; TIC中断复位子程序入口地址
&&&&&&&&&&&&&&&&&&&&& LJMP& SERVE&&&&&&&&&&&&&&&&&&& ; 跳到TIC中断服务子程序
;----------------------------------- --------------------主程序入口,初始化ADuC841
MAIN:&&&&&&&&&&&&&& MOV& R0, #0FFH&&&&&&&&&&&&&& ; 清除片内RAM,从0FFH开始向下清除
&&&&&&&&&&&&&&&&&&&& CLR& A&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ; 清除累加器A
QING:&&&&&&&&&&&&&&& MOV& @R0, A&&&&&&&&&&&&&&&&&&& ; 清除片内RAM,
&&&&&&&&&&&&&&&&&&&&& DJNZ& R0, QING&&&&&&&&&&&&&& ; 没有到00H,继续
&&&&&&&&&&&&&&&&&&&&& MOV& SP, #SP0&&&&&&&&&&&&&&&&& ; 设置堆栈起始地址
;----------------------------------- --------------------
SETB& EA&&&&&&&&&&&&&&&&&&&&&&&&&& ; 开启中断
&&&&&&&&&&&&&&&&&&&&& MOV& IEIP2, #04H&&&&&&&&&&&& ; 允许TIC中断
&&&&&&&&&&&&&&&&&&&&& MOV& TIMECON, #53H&& ; 设置TIC为24小时、秒寄存器输出、TIC使能和时钟使能
&&&&&&&&&&&&&&&&&&&&& MOV& INTVAL, #01H&&& ; 每秒中断一次
HERE:&&&&&&&&&&&&&&& LJMP& $&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ; 等待中断
PP:&&&&&&&&&&&&&&&&&& LCALL& INI8281&&&&&&&&&&&&&&& ; 初始化WH8281。这是模块化编程的方法。
;----------------------------------- --------------------分隔程序,以下为TIC中断服务子程序
SERVE:&&&&&&&&&&&&&& LCALL& XIANSHI&&&&&&&&&&&& ; 在中断服务子程序中只需显示,所以调用显示子程序
&&&&&&&&&&&&&&&&&&&&& RETI&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ; 中断返回
;----------------------------------- --------------------分隔程序,以下为初始化WH8281子程序
INI8281:&&&&&&&&&&&& SETB& CLK81&&&&&&&&&&&&&&&&&&&& ; 该子程序用模拟串口的方式送数到WH8281并初始化
&&&&&&&&&&&&&&&&&&& SETB& DAT81&&&&&&&&&&&&&&&&&&& ; 对时钟线和数据线置1,准备送数
&&&&&&&&&&&&&&&&&&& MOV& A, #12H&&&&&&&&&&&&&&&&&&&&&&&&&&& ; 准备送往WH8281的初始化数据
&&&&&&&&&&&&&&&&&&& LCALL& WTO81&&&&&&&&&&&&&&&& ; 调用写入WH8281的子程序
&&&&&&&&&&&&&&&&&&& MOV& A, #80H&&&&&&&&&&&&&&&&&&&&&&&&&&& ; 准备送往WH8281的初始化数据
&&&&&&&&&&&&&&&&&&& LCALL& WTO81&&&&&&&&&&&&&&&& ; 调用写入WH8281的子程序
&&&&&&&&&&&&&&&&&&& RET&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ; 返回
;----------------------------------- --------------------分隔程序,以下为WH8281显示子程序
XIANSHI:&&&&&&&&& MOV& A, #02H&&&&&&&&& ; 在时、分、秒之间显示“-”
&&&&&&&&&&&&&&&&&&&&&&&&&&& LCALL& WTO81&&&&&&&&&&&&&&&& ;
&&&&&&&&&&&&&&&&&&&&&&&&&&& MOV& A, #0BFH&&&&&&&&&&&&&&& ;
&&&&&&&&&&&&&&&&&&&&&&&&&&& LCALL& WTO81&&&&&&&&&&&&&&&& ;
&&&&&&&&&&&&&&&&&&&&&&&&&& MOV& A, #05H&&&&&&&&&&&&&&&&&&&&&&&&&&& ;
&&&&&&&&&&&&&&&&&&&&&&&&&&& LCALL& WTO81&&&&&&&&&&&&&&&& ;
&&&&&&&&&&&&&&&&&&&&&&&&&&& MOV& A, #0BFH&&&&&&&&&&&&&&& ;
&&&&&&&&&&&&&&&&&&&&&&&&&&& LCALL& WTO81&&&&&&&&&&&&&&&& ;
&;---------------------------------------------&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&& MOV& A, SEC&&&&&&&&&&&&&&&&&&&& ; 从TIV中读出秒数据
&&&&&&&&&&&&&&&&&&& LCALL& CHULI&&&&&&&&&&&&&&&&& ; 把十六进制数据转换成压缩BCD码
&&&&&&&&&&&&&&&&&&& MOV& R0, #60H&&&&&&&&&&&&&&&& ; 秒显示在第6位(十位)
&&&&&&&&&&&&&&&&&&&& MOV& R1, #70H&&&&&&&&&&&&&&&& ; 和第7位(个位)
&&&&&&&&&&&&&&&&&&& LCALL& ZHU_XIANSHI&& ; 调用送数到WH8281的子程序
;---------------------------------------------&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&& MOV& A, MIN&&&&&&&&&&&&&&&&&&& ; 从TIV中读出分数据
&&&&&&&&&&&&&&&&&&& LCALL& CHULI&&&&&&&&&&&&&&&&& ; 把十六进制数据转换成压缩BCD码
&&&&&&&&&&&&&&&&&&& MOV& R0, #30H&&&&&&&&&&&&&&&& ; 分显示在第3位(十位)
&&&&&&&&&&&&&&&&&&& MOV& R1, #40H&&&&&&&&&&&&&&&& ; 和第4位(个位)
&&&&&&&&&&&&&&&&&&& LCALL& ZHU_XIANSHI&& ; 调用送数到WH8281的子程序
;---------------------------------------------&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&& MOV& A, HOUR&&&&&&&&&&&&&&& ; 从TIV中读出时数据
&&&&&&&&&&&&&&&&&&& LCALL& CHULI&&&&&&&&&&&&&&&&& ; 把十六进制数据转换成压缩BCD码
&&&&&&&&&&&&&&&&&&& MOV& R0, #00H&&&&&&&&&&&&&&&& ; 时显示在第0位(十位)
&&&&&&&&&&&&&&&&&&& MOV& R1, #10H&&&&&&&&&&&&&&&& ; 和第1位(个位)
&&&&&&&&&&&&&&&&&&& LCALL& ZHU_XIANSHI&& ; 调用送数到WH8281的子程序
;---------------------------------------------&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&& RET&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ; 返回
;===================分隔程序,以下为送数到WH8281显示子程序
ZHU_XIANSHI:&&&&&&&& MOV& A,#14H&&&&&&&&&&&&&&&&&&& ; 送控制字
&&&&&&&&&&&&&&& LCALL& WTO81&&&&&&&&&&&&&&&& ;
&&&&&&&&&&&&&&& MOV& A, SHUZHI&&&&&&&&&&&& ; 读显示数据
&&&&&&&&&&&&&&& ANL& A, #0F0H&&&&&&&&&&&&&&&&&&&&&&&&&& ; 分离十位和个位
&&&&&&&&&&&&&&& SWAP& A&&&&&&&&&&&&&&&&&&&&&&&&&&&& ;
&&&&&&&&&&&&&&& ORL& A, R0&&&&&&&&&&&&&&&&&&&&&&&& ; 合成显示位置和显示数
&&&&&&&&&&&&&&& LCALL& WTO81&&&&&&&&&&&&&&&& ; 送数
&&&&&&&&&&&&&&& MOV& A, #14H&&&&&&&&&&&&&&&&&&&&&&&&&&& ;
&&&&&&&&&&&&&&& LCALL& WTO81&&&&&&&&&&&&&&&& ;
&&&&&&&&&&&&&&& MOV& A, SHUZHI&&&&&&&&&&&& ;
&&&&&&&&&&&&&&& ANL& A, #0FH&&&&&&&&&&&&&&&&&&& ;
&&&&&&&&&&&&& ORL& A,R1&&&&&&&&&&&&&&&&&&&&&&&&& ;
&&&&&&&&&&&&&&& LCALL& WTO81&&&&&&&&&&&&&&&& ;
&&&&&&&&&&&&&&& RET&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ;
;===================分隔程序,以下为把十六进制数据转换成压缩BCD码的子程序
CHULI:&&&&&&&&&&&&&& MOV& B, #10&&&&&&&&&&&&&&&&&&&&& ; 把需变换的数除10,商为十位数,余数为个位数
&&&&&&&&&&&&&&&&&&&&& DIV& AB&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ;
&&&&&&&&&&&&&&&&&&&&& SWAP& A&&&&&&&&&&&&&&&&&&&&&&&&&&&& ;
&&&&&&&&&&&&&&&&&&&&& ADD& A, B&&&&&&&&&&&&&&&&&&&&&&&&& ;
&&&&&&&&&&&&&&&&&&&&& MOV& SHUZHI, A&&&&&&&&&&& ;
&&&&&&&&&&&&&&&&&&&&& RET&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ;
;===================分隔程序,以下模拟串口送数到WH8281子程序
WTO81:&&&&&&&&&&&& MOV& R6, #08H&&&&&&&&&&&&&&&& ; 送8位(一个字节的)数
WAT:&&&&&&&&&&&&&& CLR& CLK81&&&&&&&&&&&&&&&&&&&&&&&& ; 产生宽度为“DELAY”的低电平脉冲
&&&&&&&&&&&&&&&&&&&&&&&&&&& LCALL& DELAY&&&&&&&&&&&&&&&& ;
&&&&&&&&&&&&&&&&&&&&&&&&&&& SETB& CLK81&&&&&&&&&&&&&&&&&&&& ;
&&&&&&&&&&&&&&&&&&&&&&&&&&& JB& DAT81, WAT&&&&&&&&&&&&& ; 判断数据数据线(WH8281的响应)
&&&&&&&&&&&&&&&&&&&&&&&&&&& CLR& CLK81&&&&&&&&&&&&&&&&&&&&&&&& ; 产生宽度为“DELAY”的低电平脉冲
&&&&&&&&&&&&&&&&&&&&&&&&&&& LCALL& DELAY&&&&&&&&&&&&&&&& ;
&&&&&&&&&&&&&&&&&&&&&&&&&&& SETB& CLK81&&&&&&&&&&&&&&&&&&&& ;
&&&&&&&&&&&&&&&&&&&&&&&&&&& JNB& DAT81, $&&&&&&&&&&&&&&&&&&&&&&&&&&& ;
WTB81:&&&&&&&&&&&&& RLC& A&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ; 经过C送数
&&&&&&&&&&&&&&&&&&&&&&&&&&& MOV& DAT81, C&&&&&&&&&&&&&&& ;
&&&&&&&&&&&&&&&&&&& CLR& CLK81&&&&&&&&&&&&&&&&&&&&&& ;
&&&&&&&&&&&&&&&&&&&&&&&&& LCALL& DELAY&&&&&&&&&&&&&&&& ;
&&&&&&&&&&&&&&&&&&&&&&&&&&& SETB& CLK81&&&&&&&&&&&&&&&&&&&& ;
&&&&&&&&&&&&&&&&&&&&&&&&&&& LCALL& DELAY&&&&&&&&&&&&&&&& ;
&&&&&&&&&&&&&&&&&&&&&&&&&&& LCALL& DELAY&&&&&&&&&&&&&&&& ;
&&&&&&&&&&&&&&&&&&&&&&&&&&& DJNZ& R6, WTB81&&&&&&&&&&&& ; 共送8位数
&&&&&&&&&&&&&&&&&&&&&&&&&&& SETB& DAT81&&&&&&&&&&&&&&&&&&& ;
&&&&&&&&&&&&& RET&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ;
;===================分隔程序,以下为短延时子程序
DELAY:&&&&&&&&&&&&&&&&&&&& NOP&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ;
&&&&&&&&&&&&&&&&&&& NOP&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ;
&&&&&&&&&&&&&&&&&&& NOP&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ;
&&&&&&&&&&&&&&&&&&& NOP&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ;
&&&&&&&&&&&&&&&&&&& NOP&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ;
&&&&&&&&&&&&&&&&&&& NOP&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ;
&&&&&&&&&&&&&&&&&&& NOP&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ;
&&&&&&&&&&&&&&&&&&& NOP&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ;
&&&&&&&&&&&&&&&&&&& NOP&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ;
&&&&&&&&&&&&&&&&&&& NOP&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ;
&&&&&&&&&&&&&&&&&&& NOP&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ;
&&&&&&&&&&&&&&&&&&& NOP&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ;
&&&&&&&&&&&&&&&&&&& RET&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ;
;===================分隔程序,以下为长延时子程序
YS:&&&&&&&&&&&&&&&&&&&&&& MOV& R5, #00H&&&&&&&&&&&&&&&& ;
&&&&&&&&&&&&&&&&&&&&&&&&&&& MOV& R4, #50H&&&&&&&&&&&&&&&& ;
YS1:&&&&&&&&&&&&&&&&&&&& DJNZ& R5, $&&&&&&&&&&&&&&&&&&&&&&& ;
&&&&&&&&&&&&&&&&&&&&&&&&&&& DJNZ& R4, YS1&&&&&&&&&&&&&&&&&&&&&&&&&&& ;
&&&&&&&&&&&&&&&&&&&&&&&&&&& RET&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ;
&&&&&&&&&&&&&&&&&&&&&&&&&&& END&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ; 全部程序结束
附:作为对比,下面给出标准8052采用定时器实现的电子钟的部分代码。重点注意实现软件时钟的部分。
&&&&&&&& ORG& 0000H&&&&&&&&&&&&&&&&&&&&&& ; 实验板开始执行的第一条指令所处的地址
&&&&&&&&&&&&&&&&&& LJMP& MAIN&&&&&&&&&&&&&&&&&&&& ; 跳转到主程序
&&&&&&&&&&&&&&&&&& ORG& 000BH&&&&&&&&&&&&&&&&&&&&& ; 定时器0中断入口地址
LJMP& TINT0&&&&&&&&&&&&&&&&&&& ; 跳转到定时器0中断服务子程序
&&&&&&&& ORG& 0100H&&&&&&&&&&&&&&&&&&&&&& ; 主程序开始的地址;避开中断入口地址
MAIN:&&&&& MOV& SP, #0D0H&&&&&&&&&&&&&&&&&&&& ; 设置堆栈起始地址
&&&&&&&&&& LCALL& INT8255&&&&&&&&&&&&&& ; 初始化CPU,注意用不同的子程序完成一定的功能,这是模块化
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ; 编程技术之一,方便程序的开发、管理和维护
&&&&&&&&&&&&&&&&&& MOV& R3, #00H&&&&&&&&&&&&&&&&&&&&&& ; 时计数存储单元
&&&&&&&&&&&&&&&&&& MOV& 3FH, #50&&&&&&&&&&&&&&&& ; 装入中断次数
&&&&&&&& MOV& 40H, #00H&&&&&&&&&&&&&&&&&&&& ; 秒低位存储单元
&&&&&&&& MOV& 41H, #00H&&&&&&&&&&&&&&&&&&&& ; 秒高位存储单元
&&&&&&&&&& MOV& 42H, #0FFH&&&&&&&&&&&&&&&&&&& ; 分、秒间显示符号"-"
&&&&&&&&&&&&&&&&&& MOV& 43H, #00H&&&&&&&&&&&&&&&&&&&& ; 分低位
&&&&&&&& MOV& 44H, #00H&&&&&&&&&&&&&&&&&&&& ; 分高低位
&&&&&&&& MOV& 45H, #0FFH&&&&&&&&&&&&&&&&&&& ; 时、分间显示符号"-"
&&&&&&&&&&&&&&&&&& MOV& 46H, #00H&&&&&&&&&&&&&&&&&&&& ; 时低位
&&&&&&&& MOV& 47H, #00H&&&&&&&&&&&&&&&&&&&& ; 时高位
&&&&&&&& SETB& ET0&&&&&&&&&&&&&&&&& ; T0开中断
&&&&&&&&&&&&&&&&&& SETB& EA&&&&&&&&&&&&&&&&&&&&&&&&&&& ; CPU开中断
&&&&&&&& ORL& TMOD,& #01H&&&&&&&&&&&&&&&& ; 设置定时器0工作在模式1
&&&&&&&& MOV& TH0,& #0B8H&&&&&&&&&&&&&&&&& ; 设定定时器初值,定时时间为20ms。赋TH0初值为0B8H
&&&&&&&& MOV& TL0,& #00H&&&&&&&&&&& ; 赋TL0初值为00H(假定12MHz时钟)
&&&&&&&& SETB& TR0&&&&&&&&&&&&&&&&&& ; 启动T0
L1:&&&&&&&& LCALL& LED&&&&&&&&&&&&&& ; 调LED子程序
&&&&&&&&&&&&&&&&&& LJMP& L1
&&&&&&&&&&&&&&&&&&&&&&&&&&&
INT8255:&& MOV& P2, #58H&&&&&&&&&&&&&& ; 使ADuC841P2指向8255PA的控制寄存器接口结构,ADuC841P0口地址应与低8位无关
MOV& A, #82H&&&&&&&&&&&&&&&&&&&&&& ; 8255A的控制字(82H),8255PC口输出PB口输入,PA口输出
&&&&&&&& MOVX& @ R0, A&&&&&&&&&&&&&&& ; 送8255A控制字
&&&&&&&& RET&&&&&&&&
TINT0:&&&&&&&&&&& MOV& TH0, #0B8H&&&&&&&&&&& ; 重赋定时器初值
&&&&&&&& MOV& TL0, #00H
&&&&&&& PUSH& PSW&&&&&&&&&&&&&&& ; 保护现场
&&&&&&&&&&& PUSH& ACC
&&&&&&&&&&&&&&&&&& DJNZ& 3FH, RETURN&&&&& ; 1S未到返回
&&&&&&&&&&&&&&&&&& MOV& 3FH, #50&&&&&&&&&&&& ; 重置中断次数
&&&&&&&&&&&&&&&&&& INC& 40H&&&&&&&&&&&&&&&&&&& ; 秒低位加1
&&&&&&&&&&&&&&&&&& MOV& A, 40H&&&&&&
&&&&&&&&&&&&&&&&&& CJNE& A, #0AH, RETURN&&&&&&&& ; 未满10S返回
&&&&&&&&&&&&&&&&&& MOV& 40H, #00H&&&&&&&&&& ; 计满10S,秒低位清0
&&&&&&&&&&&&&&&&&& INC& 41H&&&&&&&&&&&&&&&&&&& ; 秒高位加1
&&&&&&&&&&&&&&&&&& MOV& A, 41H&&&&&&
&&&&&&&&&&&&&&&&&& CJNE& A, #06H, RETURN ; 未满60S返回
&&&&&&&&&&&&&&&&&& MOV& 41H, #00H&&&&&&&&&& ; 计满60S,秒高位清0
&&&&&&&&&&&&&&&&&& INC& 43H&&&&&&&&&&&&&&&&&&& ; 分低位加1
&&&&&&&&& MOV& A, 43H&&&&&&
&&&&&&&&&&&&&&&&&& CJNE& A, #0AH, RETURN&&&&&&&& ; 未满10分返回
&&&&&&&&&&&&&&&&&& MOV& 43H, #00H&&&&&&&&&& ; 计满10分,分低位清0
&&&&&&&&&&&&&&&&&& INC& 44H&&&&&&&&&&&&&&&&&&& ; 分高位加1
&&&&&&&&&&&&&&&&&& MOV& A, 44H
&&&&&&&& CJNE& A, #06H, RETURN ; 未满60分返回
&&&&&&&&&&&&&&&&&& MOV& 44H, #00H&&&&&&&&&& ; 计满60分,分高位清0
&&&&&&&&&&&&&&&&&& INC& 46H
&&&&&&&&&&&&&&&&&& INC& R3
&&&&&&&&&&&&&&&&&& CJNE& R3, #24, H1&&&&&&&&&&&&&&&&&&&& ; 未满24小时跳转
&&&&&&&&&&&&&&&&&& MOV& 47H, #00H&&&
&&&&&&&&&&&&&&&&&& MOV& 46H, #00H
&&&&&&&& LJMP& RETURN&&&&&&&&&& ; 满24小时,时高低位均清0
H1:&&&&&&&&&&& MOV& A, 46H&&&&&&
&&&&&&&&& CJNE& A, #0AH, RETURN ; 未满10小时返回
&&&&&&&&&&&&&&&&&& MOV& 46H, #00H&&&&&&&&&& ; 计满10小时,时低位清0
&&&&&&&& INC& 47H&&&&&&&&&&&&&&&&&&& ; 时高位加1
RETURN: POP& ACC&&&&&&&&&&&&&&&&&&&&&&&&& ; 恢复现场
&&&&&&&&&&&& POP& PSW&&&&&&&&
&&&&&&&&&&&&&&&&&& RETI
LED:&&&&& MOV& R2, #04H&&&&&&&&&&&& ; 从右到左LED的位码依次为7F,BF,DF,EF,FE,FD,FB,F7&&&&&&&&&&&
&&&&&&&&&&&&& MOV& R5, #07FH&&&&&&&&& ; R5作为位选寄存器&
&&&&&&&& MOV& R1, #40H
DISPLAY1:MOV& 36H, @R1
&&&&&&&&& LCALL& LED1&&&&&&&&&&&
&&&&&&&&& MOV& A, R5
&&&&&&&&& MOV& P2, #50H&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&& MOVX& @R0, A&&&&&&&&&&&&& ; 送位选码入PC口
&&&&&&&&& LCALL& TMS&&&&&&&&&&&&&&&&&&&&&&&&&&& ; 延时1.024ms
&&&&&&&&& INC& R1&&&&&&&
&&&&&&&&& MOV& A, R5
&&&&&&&&& RR& A
&&&&&&&&& MOV& R5, A
&&&&&&&&& DJNZ& R2, DISPLAY1
&&&&&&&&& MOV& R2, #04H
&&&&&&&&& MOV& R5, #0FEH&&&&&&&&&&& ; 使左四位LED亮
&&&&&&&&& MOV& R1, #44H
DISPLAY2:MOV& 36H, @R1
&&&&&&&& LCALL& LED1
&&&&&&&&&&&&& MOV& A, R5&
&&&&&&&& MOV& P2, #050H
&&&&&&&& MOVX& @R0, A
&&&&&&&& LCALL& TMS
&&&&&&&& MOV& A, R5
&&&&&&&& RL& A
&&&&&&&& MOV& R5, A
&&&&&&&& INC& R1
&&&&&&&& DJNZ& R2, DISPLAY2
&OU1:&&& RET
&LED1:&& MOV& P2, #040H&&&&&&&&&&&&&&& ; 送段码子程序
&&&&&&&&&&&&& MOV& DPTR, #TAB
&&&&&&&& MOV& A, 36H
AAA:&&&&& CJNE& A, #0FFH, BBB
MOVX& A, @DPTR
MOVX @R0,A
BBB:&&&& DEC A
LJMP AAA&&
&&&&&&&&&&
TMS:&&&& MOV& R6, #0FFH&&&&&&&&&&&&& ; 给R6和R6赋初值,在12Hz晶振时延时时间为2(R7循环次数)
MOV& R7, #02H&&&&&&&&&&&&&&&& ; 256(R6循环次数)×2×10--6(DJNZ指令耗时)1.024MS
DELAY01: DJNZ& R6, $&&&&&&&&&&&&&&&&&&&&&& ; R6单元减1,非0继续执行当前指令,"$"指当前指令地址
DJNZ& R7, DELAY01&&&&&&& ; R7减1,非0跳转到标号DELAY01处执行
&&&&&&&& RET&&&&&&&&&&&&&&&&&&&
TAB:&&&&&&&&&&&&&&&&& DB 0BFH, 0C0H, 0F9H, 0A4H, 0B0H, 99H, 92H, 82H, 0F8H, 80H, 90H&&&&&&&&&
文章录入:admin&&&&责任编辑:admin&
上一篇文章: 下一篇文章: 没有了
【】【】【】【】【】
  网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)89C51做的计算器(原作)
(amoBBS 阿莫电子论坛) -
89C51做的计算器(原作)
89C51计算器:& &主要芯片:89C51、74HC244、ULN2003--2片、共阴数码管12只、集成电阻3块、24键盘一只
;*****************************89C51计算器调试程序**************************
;& && &主要芯片:89C51、74HC244、ULN2003--2片、共阴数码管12只、集成电阻3块、24键盘一只
;& && &试验电路图见笔记(小)& &试验时间:& & 地点:北京清河宝盛北里
;& && &连接方式:1、数码管和单片机 a---HC244(11)---P1.7& & b--HC244(13)--P1.6;
;& && && && && && && && && && &c--HC244(15)--P1.5& && &d--HC244(17)--P1.4& & ;
;& && && && && && && && && && &e-HC244(8)--P1.3& & f--HC244(6)--p1.2& && && &;
;& && && && && && && && && && & g-HC244(4)--P1.1& && &dp---HC244(2)---p1.0& &;
;|——|——|——|——|——|——|——|——|——|——|——|——|& &|——A——|
;|& & |& & |& & |& & |& & |& & |& & |& & |& & |& & |& & |& & |& &|& && && &|
;|——|——|——|——|——|——|——|——|——|——|——|——|& &F& && && &B
;|& & |& & |& & |& & |& & |& & |& & |& & |& & |& & |& & |& & |& &|——G——|
;|——|——|——|——|——|——|——|——|——|——|——|——|& &|& && && &|
;& &P2.0P2.1 P2.2 P2.3 P2.4 P2.5 P2.6 P2.7 P0.7 P0.6 P0.5 P0.4& &E& && && &C
;& && && && && && && && && && && && && && && && && && && && && && &|——D——| 。DP
;& && && && && &键盘和单片机& && && && && && && && && && && && && & 数码管
;& && && && && &2、键盘各单片机:——|——|——|——|——|——|——|——|——P0.0
;& && && && && && && && && && &——|——|——|——|——|——|——|——|——P0.1
;& && && && && && && && && && &——|——|——|——|——|——|——|——|——P0.2
;& && && && && && && && && && && &P3.0 P3.1 P3.2 P3.3 P3.4 P3.5 P3.6 P3.7
;**********************************************************************************************
& && & HUAN_ZHEN1EQU& &50H;按键值缓存单元首地址;最多13个:6位整数,六位小数。一个小数点;& && &
& && && && && && && && && && &; 或13位整数。50-5CH (占用)。
& && & HUAN_ZHEN2EQU& &40H;按键值缓存单元首地址;最多13个:6位整数,六位小数。一个小数点;
& && && && && && && && && && &; 或13位整数。40-4CH (占用)。
& && & HZ_JS1& && & EQU& &5DH; 按键次数计数器---缓存个数
& && & HZ_JS2& && & EQU& &4DH; 按键次数计数器---缓存个数
& && & X1AN_SHI_ADD EQU& &20H;显示存贮区首地址
& && & DATA_CONT& & EQU& & 5EH ;输入操作数---次数计数
& && & ; 23H-------浮点子程序占用23H---数符---其它程序不能用此单元
& && & ; 25H-------单元供运算结果--阶码--存贮用 ,便于分析小数点位置
& && & ; 26H------阶码处理缓存单元
& && & ; 27H------运算符号处理缓存单元
& && & ; 28H----- 运算符号键值保存单元
& && & ; 29H----- 运算符号键值保存单元----按第1个操作数时
& && & ; 2AH----- 运算符号键值保存单元----按第2个操作数时
;****************************主程序& &*********************************
ORG& & 0000H& & ;& &开始地址
MAIN:& &NOP& &; 小延时
& && &NOP& &;
& && &NOP& &;
;---------------------------------------------------------
& && & MOVR1,#7FH& &;89C51内存储器00H-7FH 各单元清0-------2fh
& && &MOV R0,#00H& & ;---------30h
& && &MOV A,#00H& &;
K1:& &MOV @R0,A& && &;
& && &INC R0& && && &;
& && &DJNZ R1,K1& &;
;----------------------------------------------------------
& && &MOV SP,#60H& && && &;设堆栈
& && &CLREA& && && && & ;关总中断
& && &MOV P0,#00H& && && &;关显示
& && &MOV P1,#00H& && && &;
& && &MOV P2,#00H& && && &;
& && &MOV P3,#0FFH& && &;P3为输入口
MAIN1:LCALLKEY1& && && &;调用键盘处理程序
& && &mov 29h, 28h& && &;转移第 1 次按键的--符号值---
& && &LCALL& &FD_FDBCD& & ;调用第一个操作数到四字节浮点BCD转换子程序
& && && && && && && && && & ;结果在30H、31H、32H、33H中
& && & MOV3CH,30H& && && &;转移第一操作数结果
& && & MOV3DH,31H& && && &;
& && & MOV3EH,32H& && && &;
& && & MOV3FH,33H& && && &;
& & ;AJMPXX1& && && && &; 在此可查看出按键和转换结果
& && & LCALLDISPLAY_CLR& &;显示单元50H-5BH 清0
& && & LCALLKEY1& && && & ;调用键盘处理程序
& && & mov 2ah, 28h& && && &;转移第 2 次按键的--符号值---
& && & LCALL& &FD_FDBCD& &;调用第二个操作数到四字节浮点BCD转换子程序
& && && && && && && && && & ;结果在30H、31H、32H、33H中
& && & mov& &a,29h& && && & ;取出第1次按键符号值
& && & cjne a,#0bh, k2& && &;是“+”?,不是转出
& && & ajmpadd_1& && && & ;是的转“+”运算处理程序
k2:& & cjne a,#0ch, k3& && &;是“-”?,不是转出
& && & ajmpsub_1& && && & ;是的转“-”运算处理程序
k3:& & cjne a,#0dh, k4& && &;是“*”?,不是转出
& && & ajmpmul_1& && && & ; 是的转“*”运算处理程序
k4:& & cjne a,#0eh, k5& && &;是“/”?,不是转出
& && & ajmpdiv_1& && && & ; 是的转“/”运算处理程序
k5:& & cjne a,#0fh, k6& && &;是“ce”?,不是转出
& && & ajmpce_1& && && &;是的转“ce”运算处理程序----清屏幕
k6:& & ljmp& &main1& && && &;出错,从头开始
;---------------------作加法运算& & --------------------------
add_1: MOV R0,#3cH& & ; 指向BCD 码浮点操作数 1 的首地址-----格式化数必须在R0中,结果也在R0中。
& && & LCALL BTOF& &; 将其转换成二进制浮点操作数
& && & MOV R0,#30H& & ; 指向BCD 码浮点操作数 2 的首地址
& && & LCALL BTOF& &; 将其转换成二进制浮点操作数
& && & MOV R0,#3cH& & ; 指向二进制浮点操作数1---被加数
& && & MOV R1,#30H& & ; 指向二进制浮点操作数2---加数
& && & LCALL FADD& &; 进行浮点加法运算--- 1+2----------------
& && & LCALL FTOB& &; 将结果转换成BCD 码浮点数--结果在被加数中
& && & MOV25H ,3cH;& &阶码送保存,便于分析小数点位置
& && & ljmp& &xx1& &;
;----------------------------------------------------------------& &
;---------------------作减法运算& & --------------------------
sub_1: MOV R0,#3CH& & ; 指向BCD 码浮点操作数 1 的首地址-----格式化数必须在R0中,结果也在R0中。
& && & LCALL BTOF& &; 将其转换成二进制浮点操作数
& && & MOV R0,#30H& & ; 指向BCD 码浮点操作数 2 的首地址
& && & LCALL BTOF& &; 将其转换成二进制浮点操作数
& && & MOV R0,#3CH& & ; 指向二进制浮点操作数1---被加数----------
& && & MOV R1,#30H& & ; 指向二进制浮点操作数2---加数-----------
& && & LCALL FSUB& &; 进行浮点减法运算--- 1-2 ---
& && & LCALL FTOB& &; 将结果转换成BCD 码浮点数--结果在被加数中
& && & MOV25H ,3CH;& &阶码送保存,便于分析小数点位置
& && & ljmp& &xx1& &;
;----------------------------------------------------------------& &
;---------------------作乘法运算& & --------------------------
mul_1: MOV R0,#3CH& & ; 指向BCD 码浮点操作数 1 的首地址-----格式化数必须在R0中,结果也在R0中。
& && & LCALL BTOF& &; 将其转换成二进制浮点操作数
& && & MOV R0,#30H& & ; 指向BCD 码浮点操作数 2 的首地址
& && & LCALL BTOF& &; 将其转换成二进制浮点操作数
& && & MOV R0,#3CH& & ; 指向二进制浮点操作数1---被加数
& && & MOV R1,#30H& & ; 指向二进制浮点操作数2---加数
& && & LCALL FMUL& &; 进行浮点乘法运算--- 1*2-----------
& && & LCALL FTOB& &; 将结果转换成BCD 码浮点数--结果在被加数中
& && & MOV25H ,3CH;& &阶码送保存,便于分析小数点位置
& && & ljmp& &xx1& &;
;----------------------------------------------------------------& &
;---------------------作除法运算& & --------------------------
div_1: MOV R0,#3CH& & ; 指向BCD 码浮点操作数 1 的首地址-----格式化数必须在R0中,结果也在R0中。
& && & LCALL BTOF& &; 将其转换成二进制浮点操作数
& && & MOV R0,#30H& & ; 指向BCD 码浮点操作数 2 的首地址
& && & LCALL BTOF& &; 将其转换成二进制浮点操作数
& && & MOV R0,#3CH& & ; 指向二进制浮点操作数1---被加数
& && & MOV R1,#30H& & ; 指向二进制浮点操作数2---加数
& && & LCALL FDIV& &; 进行浮点加法运算--- 1/2 ----------
& && & LCALL FTOB& &; 将结果转换成BCD 码浮点数--结果在被加数中
& && & MOV25H ,3CH;& &阶码送保存,便于分析小数点位置
& && & ljmp& &xx1& &;
;----------------------------------------------------------------& &
ce_1:& &LJMP& &MAIN ;从头开始
;----------------------------------------------------------------& &
XX1:MOV A,3CH& & ;结果送显示
& && & ANL A,#0F0H& & ;
& && & SWAP A& && && &;
& && & MOV 50H,A& && &;
& && & MOV A,3CH& && &;
& && & ANL A,#0FH& &;
& && & MOV 51H,A& && &;
& && & MOV A,3DH& & ;结果送显示
& && & ANL A,#0F0H& & ;
& && & SWAP A& && && &;
& && & MOV 52H,A& && &;
& && & MOV A,3DH& && &;
& && & ANL A,#0FH& &;
& && & MOV 53H,A& && &;
& && & MOV A,3EH& & ;结果送显示
& && & ANL A,#0F0H& & ;
& && & SWAP A& && && &;
& && & MOV 54H,A& && &;
& && & MOV A,3EH& && &;
& && & ANL A,#0FH& &;
& && & MOV 55H,A& && &;
& && & MOV A,3FH& & ;结果送显示
& && & ANL A,#0F0H& & ;
& && & SWAP A& && && &;
& && & MOV 56H,A& && &;
& && & MOV A,3FH& && &;
& && & ANL A,#0FH& &;
& && & MOV 57H,A& && &;
& && & MOV 58H,#00H& &; 显示“0”
& && & MOV 59H,#00H& &;
& && & MOV 5AH,#00H& &;
& && & MOV 5BH,#00H& &;
;---------------------------------------------------------------
XX2:& &MOV 25H,3CH& && && && &;阶码保存
& && & XX4:LCALLXIAN_SHI;调显示
& && & MOV A,P3& && && && && &;读键盘口
& && &CJNEA,#0FFH ,XX3& & ; 比较是否有键按下,不相等有键按下转出。
& && &AJMP& &XX4& && && && &;无键盘按下,继续显示& && && && &
XX3:AJMPMAIN1& && && && &;从头开始--------main1
;***********************& & 主程序结束& & ******************************
;************************键盘处理程序***************************
KEY1:& &MOV HZ_JS2,#00H& &;计数初值
& && &MOV HZ_JS1,#00H& &;计数初值
& && &MOV 4FH,#50H& && &;显示初值
;-----------------------------------
KEY:& &MOV R1,#00H& &; 列值清零
& && &MOV 25H,#0FFH ;区分是键盘显示还是运算结果显示----标致位
& && &SETB P0.1& &;
& && &SETB P0.2& &;
& && &CLRP0.0& &;扫描第一行
& && &MOV R3,#10H& &;行初值
& && &MOV A,P3& && &;& &读入A中,看是否有键接下?
& && &MOV R4,A& && &;存入R4,以判断是否放开?
& && &SETB C& && &;& &置进位位
& && &MOV R5,#08& & ;共八列
L3:& &RLCA& && &;左环移一位
& && &JNC KEYIN& &;C=0 时,有键接下,转键值处理程序
& && &INC R1& && &;C=1无键按下,列值加一
& && &DJNZ R5, L3& &;列计数减一返回开始扫其它行
;---------------------------------
& && &SETB P0.0& &;
& && &SETB P0.2& &;
& && &CLRP0.1& &; 扫描第二行
& && &MOV R3,#00H& &;& &第二行初值
& && &MOV A,P3& && &; 读入A中
& && &MOV R4,A& && &;保存 存入R4,以判断是否放开?
& && &SETB C& && &;置高
& && &MOV R1,#00H& &; 列值清零
& && &MOV R5,#08& & ;& &共八列
L31:& & RLCA& && &;左环移一位
& && &JNC KEYIN& &;C=0J时,有键接下,转键值处理程序
& && &INC R1& && &; C=1无键按下,列值加一
& && &DJNZ R5, L31;
;--------------------------------------
& && &SETB P0.0& && & ;
& && &SETB P0.1& && & ;
& && &CLRP0.2& && & ;& &扫描第三行
& && &MOV R3,#08H& &;& &第三行行初值
& && &MOV A,P3& && &;& &读入A中
& && &MOV R4,A& && &;& &存入R4,以判断是否放开?
& && &SETB C& && && & ;
& && &MOV R1,#00H& &;& &列值清零
& && &MOV R5,#08& && &;& &共八列
L32:& &RLCA& && && &;& &左环移一位
& && &JNC KEYIN& && & ;& &C=0 时,有键接下,转键值处理程序
& && &INC R1& && && & ;& &C=1无键按下,列值加一
& && &DJNZ R5, L32& & ;
& && &AJMP& &D6& && & ;& &无键按下直到显示子程序
;----------------------------------------------------
KEYIN:& &LCALLXIAN_SHI;调用显示来代替延时
D3:& & MOV A,P3& && && &;再读入P3的值
& && & XRL A,R4& && && &;与上次读入的值作比较
& && & JZD3& && && &;ACC=0表示键未释放
& && & MOVA,R1& && &;取出按键列值
& && & ADD A,R3& && && &;和行值相加得到键值----A
& && & mov27h,a& && & ;& &暂存按键值
& && & clr c& && && && &;清进位,准备做减法
& && & subb a,#0bh& && &;各键值和“0BH”比较,大于或等于它证明是符号键
& && & jc& &d8& && && & ;不是符号,还原A
& && & mov 28h,27h& && &;是符号键,保存键值至内存--28H-----中
d8:& & mov a,27h& && &;还原A
& && & LCALLKEY_BCD& & ; 调用键值至BCD码转换子程序
& && & MOV R0,4FH& && &; 送键缓存区1首地址----------------
& && & MOV @R0,A& && && &; 送至键缓存区1
& && & CLR& &C& && && &;---------------------
& && & SUBB A,#0BH& && & ;不是数字键和小数点第一个参加运算数结束-----
& && & JNCD4& && && &;转第一个操作数结束后处理程序
& && & INCR0& && && &;键缓存区1地址加1 ---------------------
& && & MOV 4FH,R0& && &;回送存贮指针
& && & INC& &HZ_JS1& && &;键个数加1
D6:& & LCALLXIAN_SHI& &;调用显示子程序
& && & MOV A,HZ_JS1& & ;比较
& && & CJNE A,#13, KEY& &;个数超过12个第一个操作数输入结束,否则继续读键入值。
D4:& & MOV HZ_JS1,#00H& &;
& && & MOV 4FH,#50H& && &;
& && & MOV 40H,50H& && & ;键入的BCD操作数保存& & & &
& && & MOV 41H,51H& && & ;
& && & MOV 42H,52H& && & ;
& && & MOV 43H,53H& && & ;
& && & MOV 44H,54H& && & ;
& && & MOV 45H,55H& && & ;
& && & MOV 46H,56H& && & ;
& && & MOV 47H,57H& && & ;
& && & MOV 48H,58H& && & ;
& && & MOV 49H,59H& && & ;
& && & MOV 4AH,5AH& && & ;
& && & MOV 4BH,5BH& && & ;
& && & MOV 4CH,5CH& && & ;
& && & MOV 4DH,5DH& && & ;
& && & RET& && && && && &;
;****************& &第一个操作数到四字节浮点BCD转换子程序*****************
FD_FDBCD: SETBRS0& && & ;使用3区寄存器(18H-1FH)-------3
& && && &SETBRS1& && & ;
& && && &MOV R2,#00H& &;计数单元清0
& && && &MOVR0, #40H& &;指向操作数首地址
FD1:& && & MOV A,@R0& && & ;取操作数
& && && &CLR& &C& && && &;为作减法做准备
& && && &SUBB A,#0BH& &;& &判断是不是数字键和小数点
& && && &JNC FD3& && && &;& &转操作数个数统计结束后处理程序
FD2:& && & INC R2& && && & ;总数字位数加1
& && && &INC R0& && && & ;操作数指针加1
& && && &AJMPFD1& && & ;返回继续
FD3:& && & MOV A,R2& && &;取出总位数
& && && &MOV R3 ,A& && & ;保存在R3中
& && && &MOV R4,A& && &;总位数备份,算阶码时用
;---------------查有无小数点,并统计小数点前面的数字位数----------
& && && &MOV R2,#00H& &;计数器清0
& && && &MOV R0,#40H& &;操作数指针
& && && &MOV A,@R0& && & ;& &取数
& && && &CJNE A,#0AH,FD4 ;& &比较是否为小数点?
& && && &MOV 30H,#00& &;说明第一个数是小数点,阶码出了,保存在30H中
;--------------------------- 尾数1& &----------------------------------------
& && && &INC R0& && && & ;& &指向第一个尾数半字节
& && && &INC R2& && && & ;字个数加1
& && && &MOVA,R3& && & ;取出总字节数
& && && &CLR C& && && &;作减法准备
& && && &SUBB A,#2& && & ;第二字节有数吗
& && && &JNC& &FD5& && & ;有,没有借位,转继续
& && && &JC& &FD21& && & ;小数点后什么没有,错误!
FD5:& && &MOV A,@R0& && &;& &取出
& && && &ANLA,#0FH& &;& &取后半部分
& && && &SWAPA& && && &;& &变为高半字节
& && && &MOV B,A& && && &;送B中 暂存
& && && &INC R0& && && & ;下一个字节
& && && &INC R2& && && & ;字个数加1
& && && &CLR C& && && &;作减法准备
& && && &MOVA,R3& && & ;取出总字节数
& && && &SUBB A,#3& && & ;第 3字节有数吗
& && && &JNC& &FD6& && & ;有,没有借位,转继续
& && && &MOV A,#00H& && &;没有补0
& && && &AJMPFD7& && & ;
FD6:& && &MOV A,@R0& && & ;读出
& && && &ANL A,#0FH& && &;取半字节
FD7:& && &ADD A,B& && && &;合成尾数第一个字节
& && && &MOV31H,A& && &;得到尾数第 1 个字节
;-------------------------------------------------------------------& &
;--------------------------- 尾数2----------------------------------------
& && && &INC R0& && && & ;& &指向尾数半字节
& && && &INC R2& && && & ;& &字个数加1
& && && &MOVA,R3& && & ;& &取出总字节数
& && && &CLR C& && && &;& &作减法准备
& && && &SUBB A,#4& && & ;& &第 4 字节有数吗
& && && &JNC& &FD8& && & ;有,没有借位,转继续
& && && &MOV 32H,#00H& & ;有借位,后两位尾数送0
& && && &MOV 33H,#00H& & ;
& && && &AJMP& &FD21& &;转结束
FD8:& && & MOV A,@R0& && & ;& &取出
& && && &ANLA,#0FH& &;& &取后半部分
& && && &SWAPA& && && &;& &变为高半字节
& && && &MOV B,A& && && &;送B中 暂存
& && && &INC R0& && && & ;下一个字节
& && && &INC R2& && && & ;字个数加1
& && && &CLR C& && && &;作减法准备
& && && &MOVA,R3& && & ;取出总字节数
& && && &SUBB A,#5& && & ;第 5字节有数吗
& && && &JNC& &FD9& && & ;有,没有借位,转继续
& && && &MOV A,#00H& && &; 没有补0
& && && &AJMPFD10& && &;
FD9:& && &MOV A,@R0& && & ;读出
& && && &ANL A,#0FH& && &;& &取半字节
FD10:& && &ADD A,B& && &;合成尾数第一个字节
& && && &MOV32H,A& && &;得到尾数第 2 个字节
;-------------------------------------------------------------------& && && && &
;--------------------------- 尾数3 ----------------------------------------
& && && &INC R0& && && & ;& &指向尾数半字节
& && && &INC R2& && && & ;字个数加1
& && && &MOVA,R3& && & ;取出总字节数
& && && &CLR C& && && &;作减法准备
& && && &SUBB A,#6& && & ;第 6 字节有数吗
& && && &JNC& &FD11& && &;没有借位,转继续
& && && &MOV 33H,#00H& & ;有借位,最后一个尾数送0
& && && &AJMP& &FD21& &;转结束
FD11:& && &MOV A,@R0& && & ;& &取出
& && && &ANLA,#0FH& &;& &取后半部分
& && && &SWAPA& && && &;& &变为高半字节
& && && &MOV B,A& && && &;送B中 暂存
& && && &INC R0& && && & ;下一个字节
& && && &INC R2& && && & ;字个数加1
& && && &CLR C& && && &;作减法准备
& && && &MOVA,R3& && & ;取出总字节数
& && && &SUBB A,#7& && & ;第 7 字节有数吗
& && && &JNC& &FD12& && &;有,没有借位,转继续
& && && &MOV A,#00H& && &; 没有补0
& && && &AJMPFD13& && &;
FD12:& &MOV A,@R0& && & ;读出
& && && &ANL A,#0FH& && &;& &取半字节
FD13:& && &ADD A,B& && &;合成尾数第一个字节
& && && &MOV33H,A& && &;得到尾数第 3 个字节
;-------------------------------------------------------------------& && && &
FD21:& &CLR& &RS0& && & ;恢复使用0区寄存器(00H-07H)
& && && &CLR& &RS1& && & ;
& && && &RET& && && && &
;**************************& &第一位不是小数点,操作数处理程序********************
;查整个键入数中有无小数点:1、小数点在中间;2、无小数点& && &
FD4:& &MOV R2,#00H& && &;计数单元清0
& && & MOVR0, #40H& && &;指向操作数首地址
FD22:MOV A,@R0& && && & ;取操作数
& && & CLR C& && && && &;清进位
& && & SUBB A,#0BH& && &;判断是否为操作符?
& && & JCFD23A& && && & ;& &是数字或小数点
& && & JNCEEROR& && && &;第一个数为操作符,提示出错!
EEROR: LJMPFD21& && && &;出错返回
FD23A: MOV A,@R0& && && & ;重新取数,上次A已破坏
& && & CJNE A,#0AH, FD23; 和小数点字符值比较,不相等转
& && & AJMPFD25& && && &;有小数点,并在中间
FD23:INC R0& && && && & ;指向下一个数
& && & DJNZR3,FD22& & ;总位数减一,不为0 再循环
;-------------------& && &以下为无小数点处理程序& && & --------------------------
FD24:MOV A,R4& && && &;无小数点,总位数是阶码,不能用R3,此时它为0;R4也是总位数
& && & MOV 30H,A& && && & ; 送阶码值到指定单元
;--------------------------- 尾数1& &----------------------------------------
& && && &MOV R0,#40H& &;
& && && &MOV R2,#00H& &;
& && && &MOV A,@R0& && &;& &取出
& && && &ANLA,#0FH& &;& &取后半部分
& && && &SWAPA& && && &;& &变为高半字节
& && && &MOV B,A& && && &;送B中 暂存
& && && &INC R0& && && & ;下一个字节
& && && &INC R2& && && & ;字个数加1
& && && &CLR C& && && &;作减法准备
& && && &MOVA,R4& && & ;取出总字节数
& && && &SUBB A,#2& && & ;第 2字节有数吗
& && && &JNC& &FD25A& && &;没有借位,转继续
& && && &MOV A,#00H& && &;有补0
& && && &AJMPFD26& && & ;
FD25A:& &MOV A,@R0& && & ;读出
& && && &ANL A,#0FH& && &;取半字节
FD26:& &ADD A,B& && && &;合成尾数第一个字节
& && && &MOV31H,A& && &;得到尾数第 1 个字节
;-------------------------------------------------------------------& &
;--------------------------- 尾数2----------------------------------------
& && && &INC R0& && && & ;& &指向尾数半字节
& && && &INC R2& && && & ;& &字个数加1
& && && &MOVA,R4& && & ;& &取出总字节数
& && && &CLR C& && && &;& &作减法准备
& && && &SUBB A,#3& && & ;& &第 3 字节有数吗
& && && &JNC& &FD27& && &;有,没有借位,转继续
& && && &MOV 32H,#00H& & ;有借位,后两位尾数送0
& && && &MOV 33H,#00H& & ;
& && && &LJMP& &FD21& &;转结束
FD27:& && & MOV A,@R0& && &;& &取出
& && && &ANLA,#0FH& &;& &取后半部分
& && && &SWAPA& && && &;& &变为高半字节
& && && &MOV B,A& && && &;送B中 暂存
& && && &INC R0& && && & ;下一个字节
& && && &INC R2& && && & ;字个数加1
& && && &CLR C& && && &;作减法准备
& && && &MOVA,R4& && & ;取出总字节数
& && && &SUBB A,#4& && & ;第 4字节有数吗
& && && &JNC& &FD28& && &;有,没有借位,转继续
& && && &MOV A,#00H& && &; 没有补0
& && && &AJMPFD29& && &;
FD28:& && &MOV A,@R0& && &;读出
& && && &ANL A,#0FH& && &;& &取半字节
FD29:& &ADD A,B& && && &;合成尾数第一个字节
& && && &MOV32H,A& && &;得到尾数第 2 个字节
;-------------------------------------------------------------------& && && && &
;--------------------------- 尾数3 ----------------------------------------
& && && &INC R0& && && & ;& &指向尾数半字节
& && && &INC R2& && && & ;字个数加1
& && && &MOVA,R4& && & ;取出总字节数
& && && &CLR C& && && &;作减法准备
& && && &SUBB A,#5& && & ;第 5 字节有数吗
& && && &JNC& &FD30& && &;没有借位,转继续
& && && &MOV 33H,#00H& & ;有借位,最后一个尾数送0
& && && &AJMP& &FD21& &;转结束
FD30:& && &MOV A,@R0& && & ;& &取出
& && && &ANLA,#0FH& &;& &取后半部分
& && && &SWAPA& && && &;& &变为高半字节
& && && &MOV B,A& && && &;送B中 暂存
& && && &INC R0& && && & ;下一个字节
& && && &INC R2& && && & ;字个数加1
& && && &CLR C& && && &;作减法准备
& && && &MOVA,R4& && & ;取出总字节数
& && && &SUBB A,#6& && & ;第 6 字节有数吗
& && && &JNC& &FD31& && &;有,没有借位,转继续
& && && &MOV A,#00H& && &;没有补0
& && && &AJMPFD32& && &;
FD31:& &MOV A,@R0& && & ;读出
& && && &ANL A,#0FH& && &;取半字节
FD32:& && &ADD A,B& && &;合成尾数第一个字节
& && && &MOV33H,A& && &;得到尾数第 3 个字节
& && && &LJMP& &FD21& &;转出口
;-----------------------以下为小数点在中间处理程序-------------------------------------------& && && &
FD25:& && &
& && && &MOV R2,#00H& && & ;计数器清0
& && && &MOV R0,#40H& && & ;操作数指针
FD34:& && &MOV A,@R0& && && &;& &取数
& && && &CJNE A,#0AH,FD33;& &比较是否为小数点?
& && && &MOVA,R2& && && &;& &取出计数值
& && && &MOV 30H, A& && &;& &送阶码
& && && &AJMPFD35& && & ;& &转出处理尾数
FD33:& && &INC R2& && && && &;未找到,加一继续
& && && &INC R0& && && && &;指针加1
& && && &DJNZR4,& &FD34;总位数减一循环-----原为R3,不能用,至4位时就出错!
& && &;--------------------------- 尾数1& &----------------------------------------
& && && &MOV R0,#40H& &;指向首地址
& && && &MOV R1,#34H& &;指向暂存首地址
& && && &MOV R5,#07& && &;总共取7次,包括一个小数点
FD37:& && &MOV A,@R0& && & ;取出数
& && && &CJNE A,#0AH,FD36;比较是否为小数点,不是转
& && && &INC R0& && && &;& &是小数点跳过一个字节
& && && &MOV A,@R0& && & ;& &取下一个单元
FD36:& && &MOV @R1,A& && & ;& &存入缓冲单元
& && && &INCR0& && && &;& &调整源指针
& && && &INCR1& && && &;& &调整暂存指针
& && && &DJNZ R5, FD37& &;& &循环取7次,有小数点时得到六个数,无小数点时得到7个数。
;----------------------尾数 1-------------------------------
& && && &MOVA,34H& && &;& &取一个数
& && && &SWAPA& && && &;& &高低四位交换
& && && &ADD A,35H& && & ;& &和下位合成
& && && &MOV 31H,A& && & ;& &送尾数
;------------------------------------------------------------
;----------------------尾数 2-------------------------------
& && && &MOVA,36H& && &;& &取一个数
& && && &SWAPA& && && &;& &高低四位交换
& && && &ADD A,37H& && & ;& &和下位合成
& && && &MOV 32H,A& && & ;& &送尾数
;------------------------------------------------------------
;----------------------尾数 3-------------------------------
& && && &MOVA,38H& && &;& &取一个数
& && && &SWAPA& && && &;& &高低四位交换
& && && &ADD A,39H& && & ;& &和下位合成
& && && &MOV 33H,A& && & ;& &送尾数
;------------------------------------------------------------& && && && && && && && && && && && && &
& && && && &LJMP FD21& && & ;返回出口
;*********************************************************
& && && && && &
;*******************************************************************
KEY_BCD:MOV DPTR,#TAB1& & ;
& && && &MOVCA,@A+DPTR& &;
& && && &RET
;****************************************************************************
TAB1: DB00H,01H,02H,03H,04H,05H,06H,07H;--0--1--2--3--4--5--6--7
& && & DB08H,09H,0AH,0BH,0CH,0DH,0EH,0FH;--8--9--&DP&--&+&--&-&--&*&--&/&
& && & DB10H,11H,12H,13H,14H,15H,16H,17H;--CE--&=&--&M+&--&C&--SIN--COS--TAN--EXP
;***************************************************************************************
XIAN_SHI :
;-----------------1------------------
& && && && & MOV A, 50H& && & ;显示子程序 ,显示50H---5BH 内容
& && && && & ANL A,#0FH& && & ;
& && && && & MOV DPTR,#TAB2& &;
& && && && & MOVC A,@A+DPTR& &;
& && && && & MOV 26H,A& && &;缓存单元
& && && && & MOV A,25H& && &;阶码存放单元,在键盘壮态时为0FFH
& && && && & CJNE A,#0FFH,XS1 ;区分是键盘显示还是运算结果显示---键盘标致为0FFH& && && && && &
& && && && & AJMP XS2& && && &;是在键盘壮态
XS1:& && &CJNE A,#00H,XS3;在显示壮态下再分析是否为00---0. ,这时应显示0
& && && && & MOV 26H,#0FCH& & ;显示 0
& && && && & AJMPXS2& && &;
XS3:& && &MOV 26H,#00H& &;其它壮态不显示& && && &
XS2:& && &MOV A,26H& && &;& && &
& && && && & MOV P1,A& && && &;
& && && && & SETB P2.0& && &;
& && && && & LCALLDELAY1& & ;
& && && && & CLR& & P2.0& && &;
& && && && &
;------------------2------------------
& && && && & MOV A, 51H
& && && && & ANL A,#0FH& && & ;
& && && && & MOV DPTR,#TAB2& &;
& && && && & MOVC A,@A+DPTR& &;
& && && && & MOV 26H,A& && &;缓存单元
& && && && & MOV A,25H& && &;& &阶码存放单元,在键盘壮态时为0FFH
& && && && & CJNE A,#0FFH,XS5 ; 区分是键盘显示还是运算结果显示---键盘标致为0FFH& && && && && &
& && && && & AJMP XS4& && && &;是在键盘壮态
XS5:& && && &CJNE A,#00H,XS6;在显示壮态下再分析是否为00---0. ,这时应显示&.&
& && && && & MOV 26H,#01H& & ;显示 & . &
& && && && & AJMPXS4& && & ;
XS6:& && &MOV 26H,#00H& &;其它壮态不显示& && && &
XS4:& && &MOV A,26H& && &;
& && && && &
& && && && & MOV P1,A& && && &;
& && && && & SETB P2.1& && &;
& && && && & LCALLDELAY1& & ;
& && && && & CLR& & P2.1& && &;
;-------------------3---------------------
& && && && & MOV A, 52H
& && && && & ANL A,#0FH& && & ;
& && && && & MOV DPTR,#TAB2& &;
& && && && & MOVC A,@A+DPTR& &;
& && && && &
& && && && & MOV 26H,A& && &;缓存单元保存A
& && && && & MOV A,25H& && &;& &阶码存放单元,在键盘壮态时为0FFH
& && && && & CJNE A,#0FFH,XS7 ;区分是键盘显示还是运算结果显示---键盘标致为0FFH& && && && && &
& && && && & AJMP XS8& && && &;是在键盘壮态
XS7:& && && &CJNE A,#01H,XS8;在显示壮态下再分析是应显示&.&
& && && && & INC26H& && && &;显示 & X. &
XS8:& && && &MOV A,26H& && &;
& && && && & MOV P1,A& && && &;
& && && && & SETB P2.2& && &;
& && && && & LCALLDELAY1& & ;
& && && && & CLR& & P2.2& && &;
& && && && &
;------------------4----------------------
& && && && & MOV A, 53H
& && && && & ANL A,#0FH& && & ;
& && && && & MOV DPTR,#TAB2& &;
& && && && & MOVC A,@A+DPTR& &;
& && && && & MOV 26H,A& && &;缓存单元保存A
& && && && & MOV A,25H& && &;& &阶码存放单元,在键盘壮态时为0FFH
& && && && & CJNE A,#0FFH,XS9 ;区分是键盘显示还是运算结果显示---键盘标致为0FFH& && && && && &
& && && && & AJMP XS10& && && &;是在键盘壮态
XS9:& && && &CJNE A,#02H,XS10;在显示壮态下再分析是应显示&.&
& && && && & INC26H& && && &;显示 & X. &
XS10:& && &MOV A,26H& && &;
& && && && & MOV P1,A& && && &;
& && && && & SETB P2.3& && & ;
& && && && & LCALLDELAY1& & ;
& && && && & CLR& & P2.3& && &;
;---------------------5-------------------
& && && && & MOV A, 54H
& && && && & ANL A,#0FH& && & ;
& && && && & MOV DPTR,#TAB2& &;
& && && && & MOVC A,@A+DPTR& &;
& && && && & MOV 26H,A& && && &;缓存单元保存A
& && && && & MOV A,25H& && && &;& &阶码存放单元,在键盘壮态时为0FFH
& && && && & CJNE A,#0FFH,XS11 ;区分是键盘显示还是运算结果显示---键盘标致为0FFH& && && && && &
& && && && & AJMP XS12& && && &;是在键盘壮态
XS11:& && && &CJNE A,#03H,XS12 ;在显示壮态下再分析是应显示&.&
& && && && &INC26H& && && &;显示 & X. &
XS12:& && && &MOV A,26H& && &;
& && && && &MOV P1,A& && && &;
& && && && &SETB P2.4& && &;
& && && && & LCALLDELAY1& &;
& && && && & CLR& & P2.4& && & ;
;----------------------6------------------
& && && && & MOV A, 55H
& && && && & ANL A,#0FH& && & ;
& && && && & MOV DPTR,#TAB2& &;
& && && && & MOVC A,@A+DPTR& &;
& && && && & MOV 26H,A& && &;缓存单元保存A
& && && && & MOV A,25H& && &;& &阶码存放单元,在键盘壮态时为0FFH
& && && && & CJNE A,#0FFH,XS13 ;区分是键盘显示还是运算结果显示---键盘标致为0FFH& && && && && &
& && && && & AJMP XS14& && && &;是在键盘壮态
XS13:& && && &CJNE A,#04H,XS14;在显示壮态下再分析是应显示&.&
& && && && &INC26H& && && &;显示 & X. &
XS14:& && && &MOV A,26H& && &;
& && && && & MOV P1,A& && && &;
& && && && & SETB P2.5& && &;
& && && && & LCALLDELAY1& & ;
& && && && & CLR& & P2.5& && &;
;-----------------------7-----------------
& && && && & MOV A, 56H
& && && && & ANL A,#0FH& && & ;
& && && && & MOV DPTR,#TAB2& &;
& && && && & MOVC A,@A+DPTR& &;
& && && && & MOV 26H,A& && &;缓存单元保存A
& && && && & MOV A,25H& && &;& &阶码存放单元,在键盘壮态时为0FFH
& && && && & CJNE A,#0FFH,XS15 ;区分是键盘显示还是运算结果显示---键盘标致为0FFH& && && && && &
& && && && & AJMP XS16& && &;是在键盘壮态
XS15:& && && &CJNE A,#05H,XS16;在显示壮态下再分析是应显示&.&
& && && && &INC26H& && && &;显示 & X. &
XS16:& && && &MOV A,26H& && &;
& && && && &MOV P1,A& && && &;
& && && && & SETB P2.6& && &;
& && && && & LCALLDELAY1& & ;
& && && && & CLR& & P2.6& && &;
;------------------------8----------------
& && && && & MOV A, 57H
& && && && & ANL A,#0FH& && & ;
& && && && & MOV DPTR,#TAB2& &;
& && && && & MOVC A,@A+DPTR& &;
& && && && & MOV 26H,A& && &;缓存单元保存A
& && && && & MOV A,25H& && &;& &阶码存放单元,在键盘壮态时为0FFH
& && && && & CJNE A,#0FFH,XS17 ;区分是键盘显示还是运算结果显示---键盘标致为0FFH& && && && && &
& && && && & AJMP XS18& && && &;是在键盘壮态
XS17:& && && &CJNE A,#06H,XS18;在显示壮态下再分析是应显示&.&
& && && && & INC26H& && && &;显示 & X. &
XS18:& && && &MOV A,26H& && &;
& && && && & MOV P1,A& && && &;
& && && && & SETB P2.7& && &;
& && && && & LCALLDELAY1& & ;
& && && && & CLR& & P2.7& && &;
;-------------------------9---------------
& && && && & MOV A, 58H
& && && && & ANL A,#0FH& && & ;
& && && && & MOV DPTR,#TAB2& &;
& && && && & MOVC A,@A+DPTR& &;
& && && && &
& && && && & MOV 26H,A& && && &;缓存单元保存A
& && && && & MOV A,25H& && && &;& &阶码存放单元,在键盘壮态时为0FFH
& && && && & CJNE A,#0FFH,XS19;区分是键盘显示还是运算结果显示---键盘标致为0FFH& && && && && &
& && && && & AJMP XS20& && && &;是在键盘壮态
XS19:& && &CJNE A,#07H,XS20& &;在显示壮态下再分析是应显示&.&
& && && && & INC26H& && && & ;显示 & X. &
XS20:& && && &MOV A,26H& && &;
& && && && & MOV P1,A& && && & ;
& && && && & SETB P0.7& && && &;
& && && && & LCALLDELAY1& & ;
& && && && & CLR& & P0.7& && &;
;--------------------------10--------------
& && && && & MOV A, 59H
& && && && & ANL A,#0FH& && & ;
& && && && & MOV DPTR,#TAB2& &;
& && && && & MOVC A,@A+DPTR& &;
& && && && &
& && && && & MOV 26H,A& && &;缓存单元保存A
& && && && & MOV A,25H& && &;& &阶码存放单元,在键盘壮态时为0FFH
& && && && & CJNE A,#0FFH,XS21 ;区分是键盘显示还是运算结果显示---键盘标致为0FFH& && && && && &
& && && && & AJMP XS22& && && &;是在键盘壮态
XS21:& && && &CJNE A,#08H,XS22;在显示壮态下再分析是应显示&.&
& && && && & INC26H& && && &;显示 & X. &
XS22:& && && &MOV A,26H& && &;
& && && && & MOV P1,A& && && &;
& && && && & SETB P0.6& &;
& && && && & LCALLDELAY1& & ;
& && && && & CLR& & P0.6& && &;
;------------------------11----------------
& && && && & MOV A, 5AH
& && && && & ANL A,#0FH& && & ;
& && && && & MOV DPTR,#TAB2& &;
& && && && & MOVC A,@A+DPTR& &;
& && && && &
& && && && & MOV 26H,A& && &;缓存单元保存A
& && && && & MOV A,25H& && &;& &阶码存放单元,在键盘壮态时为0FFH
& && && && & CJNE A,#0FFH,XS23 ;区分是键盘显示还是运算结果显示---键盘标致为0FFH& && && && && &
& && && && & AJMP XS24& && && &;是在键盘壮态
XS23:& && && &CJNE A,#09H,XS24;在显示壮态下再分析是应显示&.&
& && && && & INC26H& && && &;显示 & X. &
XS24:& && && &MOV A,26H& && &;
& && && && &MOV P1,A& && && &;
& && && && &SETB P0.5& && &;
& && && && & LCALLDELAY1& & ;
& && && && & CLR& & P0.5& && &;
;-------------------12---------------------
& && && && & MOV A, 5BH
& && && && & ANL A,#0FH& && & ;
& && && && & MOV DPTR,#TAB2& &;
& && && && & MOVC A,@A+DPTR& &;
& && && && &
& && && && & MOV 26H,A& && &;缓存单元保存A
& && && && & MOV A,25H& && &;& &阶码存放单元,在键盘壮态时为0FFH
& && && && & CJNE A,#0FFH,XS25 ;区分是键盘显示还是运算结果显示---键盘标致为0FFH& && && && && &
& && && && & AJMP XS26& && && &;是在键盘壮态
XS25:& && && &CJNE A,#0AH,XS26;在显示壮态下再分析是应显示&.&
& && && && &INC26H& && && &;显示 & X. &
XS26:& && &MOV A,26H& && &;
& && && && & MOV P1,A& && && &;
& && && && & SETB P0.4& &;
& && && && & LCALLDELAY1& & ;
& && && && & CLR& & P0.4& && &;
& && && && &RET
TAB2:DB0FCH,060H,0DAH,0F2H,066H,0B6H,0BEH,0E0H,0FEH,0F6H,01H,00H; -0-1-2-3-4-5-6-7-8-9-.-空
;**********************************************
DELAY1:MOV R7,#03& &;-------03
DD1:& & MOV R6,#248& &;-------248
& && && &DJNZ R7,DD1;
& && && &RET
;*********************************************
;***************************************************
DISPLAY_CLR:
& && & MOV 50H, #00H& &; 显示单元清0
& && & MOV 51H, #00H& &;
& && & MOV 52H, #00H& &;
& && & MOV 53H, #00H& &;
& && & MOV 54H, #00H& &;
& && & MOV 55H, #00H& &;
& && & MOV 56H, #00H& &;
& && & MOV 57H, #00H& &;
& && & MOV 58H, #00H& &;
& && & MOV 59H, #00H& &;
& && & MOV 5AH, #00H& &;
& && & MOV 5BH, #00H& &;
& && & RET
;***************************************************
;测试程序---------
;& &ORG& &0000H
;& & & & MOV SP,#60H;
;& &MOV 30H,#83H;A
;& & & & MOV 31H,#12H;
;& &MOV 32H,#34H;
;& & & & MOV 33H,#56H;
;& &MOV 34H,#00H;B
;& & & & MOV 35H,#75H;
;& &MOV 36H,#77H;
;& & & & MOV 37H,#12H;
;& & & & MOV 38H,#02H;C
;& & & & MOV 39H,#56H;
;& &MOV 3AH,#34H;
;& & & & MOV 3BH,#12H;
;& & & & MOV 3CH,#01H;D
;& & & & MOV 3DH,#12H;
;& &MOV 3EH,#76H;
;& & & & MOV 3FH,#23H;
;以浮点运算为例, 计算y=ab/c+d 。
;已知:a =-123.456,b=0.757 712,c=56.3412,d=
;1.276 23; 它们分别存放在30H开始的连续单元中。
;用BCD 码浮点数表示时,分别为a=831 234 56H,
;b=007 577 12H, c=025 634 12H, d=011 276 23H。
;求解过程:通过调用BTOF子程序,将各变量
;转换成二进制浮点操作数,再进行各种运算,最后
;调用FTOB子程序,还原成十进制形式,供输出使
;用。程序如下:
;MOV R0,#3CH& & ;指向BCD 码浮点操作数d---D的首地址
;LCALL BTOF& &;将其转换成二进制浮点操作数
;MOV R0,#38H& & ; 指向BCD 码浮点操作数c---C的首地址
;LCALL BTOF& &; 将其转换成二进制浮点操作数
;MOV R0,#34H& & ; 指向BCD 码浮点操作数b--B的首地址
;LCALL BTOF& &; 将其转换成二进制浮点操作数
;MOV R0,#30H& & ; 指向BCD 码浮点操作数a----A的首地址
;LCALL BTOF& &; 将其转换成二进制浮点操作数
;MOV R1,#34H& & ; 指向二进制浮点操作数b
;LCALL FMUL& &; 进行浮点乘法运算-------A×B
;MOV R1,#38H& & ; 指向二进制浮点操作数c
;LCALL FDIV& &; 进行浮点除法运算-------A×B/C
;MOV R1,#3CH& & ; 指向二进制浮点操作数d
;LCALL FADD& &; 进行浮点加法运算--------A*B/C+D
;LCALL FTOB& &; 将结果转换成BCD 码浮点数
;STOP: LJMP STOP
;运行结果,=H, 即y = -0.384 084,
;比较精确的结果应该是-0.384 084 1。
;程序清单见本刊网络补充版(ht tp:/ /www.dpj.
;MCS-51四字节浮点库及其使用说明
;浮点库程序清单如下:
;程序清单:
;(1) 标号: BTOF 功能:浮点BCD码转换成格式化浮点数
;入口条件:浮点BCD码操作数在中。
;出口信息:转换成的格式化浮点数仍在中。
BTOF: INC R0
inc r0;read L
MOV 07h,@R0
MOV 06h,@R0
mov 05h,@r0
;r5r6r7=0.hml(dec)
dec r0 ;;r0 to jie_ma
jnz btf0 ;jb r5r6r7=0
MOV @R0,#41H
BTF0: MOV A,@R0
MOV C,ACC.7
MOV C,ACC.6
MOV ACC.7,C
MOV @R0,#41H;
MOV @R0,#0
MOV @R0,#0
MOV @R0,#0
BTF1: SUBB A,#19
MOV A,#3FH
MOV ACC.7,C
MOV @R0,#0FFH
MOV @R0,#0FFH
MOV @R0,#0FFH
BTF2: CLR A ;use r1.r2r3r4
mov r1,#24 ;3byte =3*8=24
BTF3: MOV A,R7
mov r5,a;r5r6r7*2
mov r2,count .r5r6r7(10)=&.r2r3r4(2)
JNB ACC.7,BTF3
ADD A,#0B0H
MOV R2,#80H
MOV DPTR,#BTFL
MOV B,#4;4 byte
BTF5: CLR A
MOVC A,@A+DPTR
MOV C,ACC.6
MOV ACC.7,C
MOV 0ch,A;r4'=0ch
MOVC A,@A+DPTR
MOVC A,@A+DPTR
MOVC A,@A+DPTR
LCALL MUL1
;(2) 标号: FTOB 功能:格式化浮点数转换成浮点BCD码---------------
;入口条件:格式化浮点操作数在中。
;出口信息:转换成的浮点BCD码仍在中。
FTOB: INC R0
MOV A,@R0 ;h
ORL A,@R0 ;m
orl a,@r0 ;l
MOV @R0,#41H
FTB0: MOV A,@R0
MOV C,ACC.7
LCALL MVR0
MOV DPTR,#BFL0
JNB ACC.7,FTB1
MOV DPTR,#BTFL
MOV B,#0EDH
MOV DPTR,#BFLN
MOV B,#0FAH
FTB1: CLR A
MOVC A,@A+DPTR
MOV C,ACC.6
MOV ACC.7,C
MOV 0ch,A ;r4'
MOVC A,@A+DPTR
MOVC A,@A+DPTR
MOVC A,@A+DPTR
MOV A,0r4' jie_ma
JB ACC.7,FTB2
MOV A,00.r5'r6'r7'-0.r3r4r5
MOV A,0r6'-r4;;;
MOV 0dh,#10h;0.100000
FTB2: INC DPTR
inc dptr& &;4byte
FTB3: PUSH B
FTB4: MOV A,r2
MOV 0dh,A;r5'
MOV R6,#10H
MOV ACC.7,C
;\10=&bcd1,2
MOV B,#100
MOV B,#100
mov b,#100
HB21: ;MOV A,B
BTFL: DB 41H,0ECH,1EH ,410e-19
DB 45H,93H,92H,010e-18& &
DB 48H,0B8H,77H,010e-17
DB 4BH,0E6H,95H,95h;10e-16
DB 4FH,90H,1DH ,710e-15
DB 52H,0B4H,24H,010e-14
DB 55H,0E1H,2EH,13h;10e-13
DB 59H,8CH,0BcH,010e-12
DB 5CH,0AFH,0EbH,010e-11
DB 5FH,0DBH,0E6H,010e-10
DB 63H,89H,70H ,510e-9
DB 66H,0ABH,0CCH,77h;10e-8
DB 69H,0D6H,0bfH,95h;10e-7
BFLN: DB 6DH,86H,37H ,010e-6
DB 70H,0A7H,0C5H,010e-5
DB 73H,0D1H,0B7H,17h;10e-4
DB 77H,83H,12H ,610e-3
DB 7AH,0A3H,0D7H,010e-2
DB 7DH,0CCH,0CcH,010e-1
BFL0: DB 1,80H,00H ,00h;10e0
DB 4,0A0H,00H,00h;10e1
DB 7,0C8H,00H,00h;10e2
DB 0AH,0FAH,00H,00h;10e3
DB 0EH,9CH,40H,00h;10e4
DB 11H,0C3H,50H,00;10e5
DB 14H,0F4H,24H,00h;10e6
DB 18H,98H,96H,80h;10e7
DB 1BH,0BEH,0BCH,20h;10e8
DB 1EH,0EEH,6BH,28h;10e9
DB 22H,95H,02H,0f9h;10e10
DB 25H,0BAH,43H,0b7h;10e11
DB 28H,0E8H,0D4h,0a5h;10e12
DB 2CH,91H,84H,0e7h;10e13
DB 2FH,0B5H,0E6H,20h;10e14
DB 32H,0E3H,5fH,0a9h;10e15
DB 36H,8EH,1bH,010e16
DB 39H,0c1H,0A2H,010e17
DB 3CH,0DEH,0BH,510e18
DB 40H,8AH,0d7H,23h;10e19
;(3) 标号: FMUL 功能:浮点数乘法
;入口条件:被乘数在中,乘数在中。
;出口信息:OV=0时,积仍在中,OV=1时,溢出。
FMUL: LCALL MVR0
LCALL MUL0
MUL0: LCALL MVR1
mov 01h,02h
mov 02h,03h
mov 03h,04h
mov 04h,05h
;;**************8
;***********
MOV A,R2 ;;第一尾数为零否?
MOV A,0;第二尾数为零否?
JZ MUL5;计算r2R3R4×r5R6R7-→r2R3R4
;************
mov 08h,r0;jie_ma piont
mov 09h,r1;jie_ma
mov 01h,r2
mov 02h,r3
mov 03h,r4
;************
MOV R0,#25;右移相加25次
MOV R7,A;ACC,R6,R7为部分积累加器
LOOP1:JNC M2
ADDC A,R1;乘数移出位等于1 ,被乘数往部分积里加1次
M2:CALL SRA1
CPL RS0;部分积带进位位整体右移1位
DJNZ R0,LOOP1
JBACC.7,M3;查积最高位
CALL H0;积最高位为0,积整体算术左移1位
JNBACC.7,Mul3
CALL INC3;尾数截去部分四舍五入
JNB ACC.7,mul3;2002
CALL INC3;尾数截去部分四舍五入
;sjmp mul3
;***************
;***********
mov r0,08h
mov 03h,r5
mov 04h,r6
mov 05h,r7
;*************
MD: MOV r2,A
JB ACC.7,MUL4
JNB ACC.6,MUL6
MOV r2,#3FH
MUL4: JB ACC.6,MUL6
mov r5,a& &;out r2.r3r4r5=fu(2)
MOV R2,#41H
MUL6: CLR OV
;(4) 标号: FDIV 功能:浮点数除法
;入口条件:被除数在中,除数在中。
;出口信息:OV=0时,商仍在中,OV=1时,溢出。
MOV @R0,#41H
DIV1: INC R1
DIV2: LCALL MVR0
LCALL MVR1
LCALL DIV3
DIV3: CLR C ;r3r4r5-r5'r6'r7'
MOV A,R5& & ;A&b to count
SUBB A,0fh
subb a,0eh
subb a,0dh
mov 08h,r0
mov 09h,r1
mov 0ah,r2
MOV B,#24& &;r3r4r5/r5'r6'r7'=&r0r1r2
DIV5: CLR C
SUBB A,0r7'
MOV r7,A;r7 temp
SUBB A,0eh
SUBB A,0dh
MOV 05h,07h;r7
mov 04h,06h
DIV6: DJNZ B,DIV5
mov r0,08h
mov r1,09h
mov r2,0ah
SUBB A,0ch
;(5) 标号: FMOV 功能:浮点数传送
;入口条件:源操作数在中,目标地址为。
;出口信息:=,不变。
FMOV: INC R0
;(6) 标号: FCMP 功能:浮点数代数值比较(不影响待比较操作数)
;入口条件:待比较操作数分别在和中。
;出口信息:若CY=1,则 & ,若CY=0且A=0则
= ,否则 & 。
FCMP: MOV A,@R0
JNB ACC.7,CMP2
MOV A,#0FFH
CMP2: MOV A,@R1
MOV C,ACC.6
MOV ACC.7,C
MOV C,ACC.7
MOV C,ACC.6
MOV ACC.7,C
JNB F0,CMP5
CMP5: MOV A,#0FFH
;************
SUBB A,@R1
SUBB A,@R1
;***********
mov 0fh,a;r7'
SUBB A,@R1
JNB F0,CMP7
;(7) 标号: FADD 功能:浮点数加法
;入口条件:被加数在中,加数在中。
;出口信息:OV=0时,和仍在中,OV=1时,溢出。
FADD: CLR F0;簧枇⒓臃ū曛?
SJMP AS ;患扑愦???
FADD1: CLR F0 ; -------------------------
;(8) 标号: FSUB 功能:浮点数减法
;入口条件:被减数在中,减数在中。
;出口信息:OV=0时,差仍在中,OV=1时,溢出。
FSUB: SETB F0
AS: LCALL MVR1
MOV C,ACC.7
ASN: MOV 1EH,C
LCALL MVR0
MOV ACC.7,C
CJnE A,#3FH,MV01
MV01: MOV A,@R0
MVR0: MOV A,@R0
MOV C,ACC.7
MOV C,ACC.6
MOV ACC.7,C
MVR1: MOV A,@R1
MOV C,ACC.7
MOV C,ACC.6
MOV ACC.7,C
MOV 0ch,A ;r4'
mov r3,0dh
mov r4,0eh
mov r5,0a2=&a1
;************
MOV r2,0ch
;************
EQ1: MOV A,R2
XRL A,0jie_ma
JB ACC.7,EQ3
SUBB A,0ch
EQ2: CLR C
;**********
;**********
MOV 0ch,A ;r4'
EQ3: MOV A,R2
JNB ACC.7,EQ2
EQ4: CLR C
;*************8
AS4: JB F0,AS5
;****************
ADDC A,0eh
ADDC A,0dh
AS5: CLR C
SUBB A,0fh
;************
SUBB A,0eh
mov r6,a;*****temp
SUBB A,0dh
mov r4,06h
AS6: CPL 1FH
RLN: MOV A,R3
orl a,r5;****
MOV R2,#0C1H
RLN1: MOV A,R3
JB ACC.7,RLN2
RLN2: CLR OV
;*****************
CJNE R2,#0C0H,RL1E
MOV R2,#0C1H
RL1E: CLR OV
RR1: MOV A,R3
;*********
;***********
CJNE R2,#40H,RR1E
MOV R2,#3FH
;(9)标号: DTOF 功能:三字节十六进制定点数转换成格式化浮点数
;入口条件:三字节定点数的绝对值在中,数符在位1FH中,整数部分的位数在A中。
;出口信息:转换成格式化浮点数在中(四字节)。
MOV R2,A ;;按整数的位数初始化阶码
MOV 03h,@R0 ;;将定点数作尾数
MOV 04h,@R0
mov 05h,@r0
LCALL RLN ;;进行规格化
LJMP MOV0 ;;传送结果到中
;(10) 标号: FINT 功能:浮点取整函数
;入口条件:操作数在中。
;出口信息:结果仍在中。
FINT: LCALL MVR0
;****************
MOV R2,#41H
INTA: MOV A,R2
JB ACC.7,INTB
SUBB A,#24 ;;24 wei
INTB: CLR A
Rl A& &;!!!!!!!!!!
MOV R2,#41H
INTD: CLR F0
INTE: CLR C
CJNE R2,#24,INTE
JNB F0,INTF
JNB 1FH,INTF
add a,#01;;;;in
addc a,#00
INTF: LJMP RLN
ADD0:CLR C;双精度加法子程序
ADC0:XCH A,R7;双精度带进位位加法子程序
XCH& &A,R7
XCH& &A,R6
XCH& &A,R6
SRA0:CLR C;尾数逻辑右移1位子程序
SRA:XCHA,R5;尾数带进位位右移1位
SRA1:RRC A;A R6 R7带进位位右移1位,结果在R5 R6 R7中
jnz inc321
mov a,#80h
addc a,#0;
XCH A,R7;尾数带进位左移1位
CJNE a,#0C0H,RL1E11
MOV 09h,#0C1H
;(11)标号: FSGN 功能:浮点符号函数
;入口条件:操作数在中。
;出口信息:累加器 A=1 时为正数,A=0FFH时为负数,A=0 时为零。
FSGN: INC R0 ;;读尾数
RET ;;尾数为零,结束
SGN: MOV A,@R0 ;;读取操作数的阶码
RLC A ;;取数符
MOV A,#1 ;;按正数初始化
JNC SGN1 ;;是正数,结束
MOV A,#0FFH ;;是负数,改变标志
;(12) 标号: FCLR 功能:浮点数清零
;入口条件:操作数在中。
;出口信息:操作数被清零。
MOV @R0,#41H
;(13) 标号: FZER 功能:浮点数判零
;入口条件:操作数在中。
;出口信息:若累加器A为零,则操作数为零,否则不为零。
MOV @R0,#41H
;(14) 标号: FPUSH 功能:浮点数压栈
;入口条件:操作数在中。
;出口信息:操作数压入栈顶。
FPUSH: POP ACC ;将返回地址保存在R2R3r4中
MOV A,@R0 ;将操作数压入堆栈
MOV A,R3 ;将返回地址压入堆栈
;***************
;(15) 标号: FPOP 功能:浮点数出栈
;入口条件:操作数处于栈顶。
;出口信息:操作数弹至中。
FPOP: POP ACC ;将返回地址保存在R2R3r4中
;**********
POP ACC ;将操作数弹出堆栈,传送到中
MOV A,R3 ;将返回地址压入堆栈
;(16) 标号: FTOD 功能:格式化浮点数转换成双字节定点数
;入口条件:格式化浮点操作数在中。
;出口信息:OV=1时溢出,OV=0时转换成功:定点数的绝对值在中(双字节),数符
;在位1FH中,F0=1 时为整数,CY=1时为一字节整数一字节小数,否则为纯小数。
FTOD: LCALL MVR0 ;;将传送到第一工作区
JZ FTD4 ;;阶码为零,纯小数
JB ACC.7,FTD4;;阶码为负,纯小数
SUBB A,#10H
SETB OV ;;阶码大于16,溢出
FTD1: SETB C
SUBB A,#8 ;;阶码大于8否?
FTD2: MOV B,#10H ;;阶码大于8,按双字节整数转换
LCALL FTD8
SETB F0 ;;设立双字节整数标志
FTD3: MOV B,#8 ;;按一字节整数一字节小数转换
LCALL FTD8
SETB C ;;设立一字节整数一字节小数标志
FTD4: MOV B,#0 ;;按纯小数转换
LCALL FTD8
CLR OV ;;设立纯小数标志
FTD8: MOV A,R2 ;;按规定的整数位数进行右规
CJNE A,B,FTD9
MOV A,R3 ;;将双字节结果传送到中
FTD9: CLR C
LCALL RR1 ;右规一次
& & & & END
汇编的,注释也很多,很强。
C是不错的选择啊。
看见周航慈的函数库文件
smartmeter
LZ功力深厚啊
C是不错的选择啊---------韩国网站上有一个制作是用C语言的,不过缺H文件
浮点数转换到BCD码会导致精度不够.
计算器应该使用BCD浮点数算法
看见周航慈的函数库文件------------------它是”MCS-51四字节浮点库及其使用”(ht tp:/ /.cn)。
KunShan_a_dai
功力很深;
浮点数转换到BCD码会导致精度不够.------------确实有点误差
汇编的,强!
MARK,学习了。
一图抵万言
长见识了,楼主好样的》》
洞洞板图片:
/bbs_upload782111/files_42/ourdev_J7J.JPG
图1 (原文件名:S1052083.JPG)
/bbs_upload782111/files_42/ourdev_TLYZ.JPG
图2 (原文件名:S1052084.JPG)
计算器电原理图ourdev_656493WTEJKK.rar(文件大小:7K) (原文件名:89c51计算器原理图.rar)
顶汇编牛人啊
哇,汇编哥,不错,不太好读哦
图片板上LS04没有用上。
上一个外国DIY网站,N多内容:
http://www.sample.co.kr/clocko/secosc.htm
/bbs_upload782111/files_42/ourdev_ON4.jpg
国外的CALC (原文件名:secaltt.jpg)
谢谢楼主分享,…………
gaochaozxm4319
{:smile:} henhao
查看完整版本:

我要回帖

更多关于 push back 的文章

 

随机推荐