⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 51.lst

📁 单片机定点运算子程序库
💻 LST
📖 第 1 页 / 共 5 页
字号:
02D2 5001            774             JNC     BHD1     ;四舍
02D4 0B              775             INC     R3       ;五入
02D5 EB              776     BHD1:   MOV     A,R3     ;取结果
02D6 22              777             RET
                     778     
                     779     ;(23)标号:BHD2 功能:双字节BCD码小数转换成双字节十六进制小数
                     780     
                     781     ;入口条件:待转换的双字节BCD码小数在R4、R5中。
                     782     ;出口信息:转换后的双字节十六进制小数在R2、R3中。*
                     783     ;影响资源:PSW、A、R2~R6    堆栈需求:  2字节
                     784     
A51 MACRO ASSEMBLER  51                                                                   06/29/2007 15:34:54 PAGE    13

                     785     
02D7 7E10            786     BHD2:   MOV     R6,#10H  ;准备计算两个字节小数
02D9 ED              787     BHD3:   MOV     A,R5     ;按十进制倍增
02DA 2D              788             ADD     A,R5
02DB D4              789             DA      A
02DC FD              790             MOV     R5,A
02DD EC              791             MOV     A,R4
02DE 3C              792             ADDC    A,R4
02DF D4              793             DA      A
02E0 FC              794             MOV     R4,A
02E1 EB              795             MOV     A,R3     ;将进位标志移入结果中
02E2 33              796             RLC     A
02E3 FB              797             MOV     R3,A
02E4 EA              798             MOV     A,R2
02E5 33              799             RLC     A
02E6 FA              800             MOV     R2,A
02E7 DEF0            801             DJNZ    R6,BHD3  ;共计算16bit小数
02E9 EC              802             MOV     A,R4
02EA 24B0            803             ADD     A,#0B0H  ;剩余部分达到0.50否?
02EC 5005            804             JNC     BHD4     ;四舍
02EE 0B              805             INC     R3       ;五入
02EF EB              806             MOV     A,R3
02F0 7001            807             JNZ     BHD4
02F2 0A              808             INC     R2
02F3 22              809     BHD4:   RET
                     810     
                     811     ;(24)标号:MM  功能:求单字节十六进制无符号数据块的极值
                     812     
                     813     ;入口条件:数据块的首址在DPTR中,数据个数在R7中。
                     814     ;出口信息:最大值在R6中,地址在R2R3中;最小值在R7中,地址在R4R5中。
                     815     ;影响资源:PSW、A、B、R1~R7      堆栈需求:  4字节
                     816     
02F4 8FF0            817     MM:     MOV     B,R7     ;保存数据个数
02F6 E0              818             MOVX    A,@DPTR  ;读取第一个数据
02F7 FE              819             MOV     R6,A     ;作为最大值的初始值
02F8 FF              820             MOV     R7,A     ;也作为最小值的初始值
02F9 E582            821             MOV     A,DPL    ;取第一个数据的地址
02FB FB              822             MOV     R3,A     ;作为最大值存放地址的初始值
02FC FD              823             MOV     R5,A     ;也作为最小值存放地址的初始值
02FD E583            824             MOV     A,DPH
02FF FA              825             MOV     R2,A
0300 FC              826             MOV     R4,A
                     827     
0301 E5F0            828             MOV     A,B      ;取数据个数
0303 14              829             DEC     A        ;减一,得到需要比较的次数
0304 6027            830             JZ      MME      ;只有一个数据,不需要比较
0306 F9              831             MOV     R1,A     ;保存比较次数
0307 C082            832             PUSH    DPL      ;保护数据块的首址
0309 C083            833             PUSH    DPH
030B A3              834     MM1:    INC     DPTR     ;指向一个新的数据
030C E0              835             MOVX    A,@DPTR  ;读取这个数据
030D F5F0            836             MOV     B,A      ;保存
030F D3              837             SETB    C        ;与最大值比较
0310 9E              838             SUBB    A,R6
0311 4008            839             JC      MM2      ;不超过当前最大值,保持当前最大值
0313 AEF0            840             MOV     R6,B     ;超过当前最大值,更新最大值存放地址
0315 AA83            841             MOV     R2,DPH   ;同时更新最大值存放地址
0317 AB82            842             MOV     R3,DPL
0319 800C            843             SJMP    MM3
031B E5F0            844     MM2:    MOV     A,B      ;与最小值比较
                     845     
031D C3              846             CLR     C
031E 9F              847             SUBB    A,R7
031F 5006            848             JNC     MM3      ;大于或等于当前最小值,保持当前最小值
0321 AFF0            849             MOV     R7,B     ;更新最小值
0323 AC83            850             MOV     R4,DPH   ;更新最小值存放地址
A51 MACRO ASSEMBLER  51                                                                   06/29/2007 15:34:54 PAGE    14

0325 AD82            851             MOV     R5,DPL
0327 D9E2            852     MM3:    DJNZ    R1,MM1   ;处理完全部数据
0329 D083            853             POP     DPH      ;恢复数据首址
032B D082            854             POP     DPL
032D 22              855     MME:    RET
                     856     
                     857     ;(25)标号:MMS 功能:求单字节十六进制有符号数据块的极值
                     858     
                     859     ;入口条件:数据块的首址在DPTR中,数据个数在R7中。
                     860     ;出口信息:最大值在R6中, 地址在R2R3中;最小值在R7中,地址在R4R5中。
                     861     ;影响资源:PSW、A、B、R1~R7    堆栈需求:  4字节
                     862     
                     863     
032E 8FF0            864     MMS:    MOV     B,R7     ;保存数据个数
0330 E0              865             MOVX    A,@DPTR  ;读取第一个数据
0331 FE              866             MOV     R6,A     ;作为最大值的初始值
0332 FF              867             MOV     R7,A     ;也作为最小值的初始值
0333 E582            868             MOV     A,DPL    ;取第一个数据的地址
0335 FB              869             MOV     R3,A     ;作为最大值存放地址的初始值
0336 FD              870             MOV     R5,A     ;也作为最小值存放地址的初始值
0337 E583            871             MOV     A,DPH
0339 FA              872             MOV     R2,A
033A FC              873             MOV     R4,A
033B E5F0            874             MOV     A,B      ;取数据个数
033D 14              875             DEC     A        ;减一,得到需要比较的次数
033E 6035            876             JZ      MMSE     ;只有一个数据,不需要比较
0340 F9              877             MOV     R1,A     ;保存比较次数
0341 C082            878             PUSH    DPL      ;保护数据块的首址
0343 C083            879             PUSH    DPH
                     880     
0345 A3              881     MMS1:   INC     DPTR     ;调整数据指针
0346 E0              882             MOVX    A,@DPTR  ;读取一个数据
0347 F5F0            883             MOV     B,A      ;保存
0349 D3              884             SETB    C        ;与最大值比较
034A 9E              885             SUBB    A,R6
034B 6010            886             JZ      MMS4     ;相同,不更新最大值
034D 30D202          887             JNB     OV,MMS2  ;差未溢出,符号位有效
0350 B2E7            888             CPL     ACC.7    ;差溢出,符号位取反
0352 20E708          889     MMS2:   JB      ACC.7,MMS4 ;差为负,不更新最大值
0355 AEF0            890             MOV     R6,B     ;更新最大值
0357 AA83            891             MOV     R2,DPH   ;更新最大值存放地址
0359 AB82            892             MOV     R3,DPL
035B 8012            893             SJMP    MMS7
035D E5F0            894     MMS4:   MOV     A,B      ;与最小值比较
035F C3              895             CLR     C
0360 9F              896             SUBB    A,R7
0361 30D202          897             JNB     OV,MMS6  ;差未溢出,符号位有效
0364 B2E7            898             CPL     ACC.7    ;差溢出,符号位取反
                     899     
0366 30E706          900     MMS6:   JNB     ACC.7,MMS7 ;差为正,不更新最小值
0369 AFF0            901             MOV     R7,B     ;更新最小值
036B AC83            902             MOV     R4,DPH   ;更新最小值存放地址
036D AD82            903             MOV     R5,DPL
036F D9D4            904     MMS7:   DJNZ    R1,MMS1  ;处理完全部数据
0371 D083            905             POP     DPH      ;恢复数据首址
0373 D082            906             POP     DPL
0375 22              907     MMSE:   RET
                     908     
                     909     ;(26)标号:FDS1 功能:顺序查找(ROM)单字节表格
                     910     
                     911     ;入口条件:待查找的内容在A中,表格首址在DPTR中,表格的字节数在R7中。
                     912     ;出口信息:OV=0时,顺序号在累加器A中;OV=1时,未找到。
                     913     ;影响资源:PSW、A、B、R2、R6      堆栈需求:  2字节
                     914     
0376 F5F0            915     FDS1:   MOV     B,A      ;保存待查找的内容
                     916     
A51 MACRO ASSEMBLER  51                                                                   06/29/2007 15:34:54 PAGE    15

0378 7A00            917             MOV     R2,#0    ;顺序号初始化(指向表首)
037A EF              918             MOV     A,R7     ;保存表格的长度
037B FE              919             MOV     R6,A
037C EA              920     FD11:   MOV     A,R2     ;按顺序号读取表格内容
037D 93              921             MOVC    A,@A+DPTR
037E B5F004          922             CJNE    A,B,FD12 ;与待查找的内容比较
0381 C2D2            923             CLR     OV       ;相同,查找成功
0383 EA              924             MOV     A,R2     ;取对应的顺序号
0384 22              925             RET
0385 0A              926     FD12:   INC     R2       ;指向表格中的下一个内容
0386 DEF4            927             DJNZ    R6,FD11  ;查完全部表格内容
0388 D2D2            928             SETB    OV       ;未查找到,失败
038A 22              929             RET
                     930     
                     931     ;(27)标号:FDS2 功能:顺序查找(ROM)双字节表格
                     932     
                     933     ;入口条件:查找内容在R4、R5中,表格首址在DPTR中,数据总个数在R7中。
                     934     
                     935     ;出口信息:OV=0时顺序号在累加器A中,地址在DPTR中;OV=1时未找到。
                     936     ;影响资源:PSW、A、R2、R6、DPTR    堆栈需求:  2字节
                     937     
038B EF              938     FDS2:   MOV     A,R7     ;保存表格中数据的个数
038C FE              939             MOV     R6,A
038D 7A00            940             MOV     R2,#0    ;顺序号初始化(指向表首)
038F E4              941     FD21:   CLR     A        ;读取表格内容的高字节
0390 93              942             MOVC    A,@A+DPTR
0391 6C              943             XRL     A,R4     ;与待查找内容的高字节比较
0392 700A            944             JNZ     FD22
0394 7401            945             MOV     A,#1     ;读取表格内容的低字节
0396 93              946             MOVC    A,@A+DPTR
0397 6D              947             XRL     A,R5     ;与待查找内容的低字节比较
0398 7004            948             JNZ     FD22
039A C2D2            949             CLR     OV       ;相同,查找成功
039C EA              950             MOV     A,R2     ;取对应的顺序号
                     951     
039D 22              952             RET
039E A3              953     FD22:   INC     DPTR     ;指向下一个数据
039F A3              954             INC     DPTR
03A0 0A              955             INC     R2       ;顺序号加一
03A1 DEEC            956             DJNZ    R6,FD21  ;查完全部数据
03A3 D2D2            957             SETB    OV       ;未查找到,失败
03A5 22              958             RET
                     959     
                     960     ;(28)标号:FDD1 功能:对分查找(ROM)单字节无符号增序数据表格
                     961     
                     962     ;入口条件:待查找的内容在累加器A中,表格首址在DPTR中,字节数在R7中。
                     963     ;出口信息:OV=0 时,顺序号在累加器A中;OV=1 时,未找到。
                     964     ;影响资源:PSW、A、B、R2、R3、R4      堆栈需求:  2字节
        

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -