《AVR单片机实用程序设计》原书程序.doc
文本预览下载声明
;清单1
LSDAA: ADC R16,R16 ;十进制数(在R16中)左移调整子程序
ADDAA: IN R6,SREG ;bcd码相加调整子程序,先保存相加后的
LDI R17,$66 ;状态the old status
ADD R16,R17 ;再将和预加立即数$66
IN R17,SREG ;输入相加后新状态(the new status)
OR R6,R17 ;新旧状态相或
SBRS R6,0 ;相或后进位置位则跳行
SUBI R16,$60 ;否则减去$60(十位bcd不满足调整条件)
SBRS R6,5 ;半进位置位则跳行
SUBI R16,6 ;否则减去$06(个位bcd不满足调整条件)
ROR R6 ;向高位BCD返还进位位!
RET
;清单2
SUDAA: BRCC SBD1 ;bcd码减法调整子程序,差在R16中
BRHC SBD3
SUBI R16,$66 ;进位半进位都置位,将差减去立即数$66
SEC ;并恢复借位C
RET ;ret. with seC
SBD1: BRHC SBD2 ;进位半进位都清位,返回
SUBI R16,6 ;进位清除而半进位置位,将差减去6
SBD2: RET ;ret. with clC
SBD3: SUBI R16,$60 ;进位位置位而半进位清除,将差减去$60
SEC ;并恢复借位C
RET ;ret. with seC
;清单3
RSDAA: SBRC R16,7 ;bcd码(在R16中)右移调整子程序
SUBI R16,$30 ;十位BCD最高位为1(代表8),将其变为5(否则跳行)
SBRC R16,3
SUBI R16,3 ;个位BCD最高位为1(代表8),将其变为5(否则跳行)
RET
;清单4
ADBCD4: MOV R16,R15 ;4字节压缩bcd码相加子程序
ADD R16,R11 ;R12,R13,R14,R15内为被加数, R8,R9,R10,R11
;内为加数
RCALL ADDAA ;相加后调整
MOV R15,R16 ;返还调整后结果
MOV R16,R14
ADC R16,R10
RCALL ADDAA
MOV R14,R16
MOV R16,R13
ADC R16,R9
RCALL ADDAA
MOV R13,R16
MOV R16,R12
ADC R16,R8
RCALL ADDAA
MOV R12,R16
RET
;清单5
ADBCD: LDI R16,4 ;多字节压缩bcd码相加子程序
MOV R7,R16 ;(r7):字节数
CLC
ADLOP: LD R16,-X ;X-1指向被加数;
LD R6,-Y ;Y-1指向加数
ADC R16,R6
RCALL ADDAA ;相加后调整
ST X,R
显示全部