AVR单片机 汇编自学笔记 100例

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

自学AVR单片机使用,不可私自商用

定点运算和定点数制转换

;范例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,R16 ;返还调整后结果

DEC R7

BRNE ADLOP

RET

;范例6

SUBCD4: MOV R16,R15 ;4字节压缩bcd码减法子程序

SUB R16,R11 ;R12,R13,R14,R15内为被减数,R8,R9,R10,R11内为减数 RCALL SUDAA ;相减后调整

MOV R15,R16 ;并返还调整后结果

MOV R16,R14

SBC R16,R10

RCALL SUDAA

MOV R14,r16

MOV R16,R13

SBC R16,R9

RCALL SUDAA

MOV R13,R16

MOV R16,R12

SBC R16,R8

RCALL SUDAA

MOV R12,R16

RET

;范例7

SUBCD: LDI R16,4 ;多字节压缩bcd码相减子程序

MOV R7,R16 ;(r7):压缩bcd码字节数

CLC

SUBLP: LD R16,-X ;X-1指向被减数

LD R6,-Y ;Y-1指向减数

SBC R16,R6

RCALL SUDAA ;相减后调整

ST X,R16 ;返还调整后结果

DEC R7

BRNE SUBLP

RET

;范例8 ;16位被乘数*16位乘数-->32位积

MUL16: LDI R16,17 ;(r10r11)*(r14r15)-->r12r13r14r15

ClR R12

ClR R13 ;积的高位字预清除

CLC ;第1次只右移,不相加

MLOOP: BRCC MUL1 ;

ADD R13,R11 ;乘数右移移出位为1,将被乘数加入部分积

ADC R12,R10

MUL1: ROR R12

ROR R13

ROR R14

ROR R15 ;部分积连同乘数整体右移1位

DEC R16

BRNE MLOOP ;17次右移后结束

RET

;范例9 ;16位整数被乘数*16位小数乘数-->16位整数积,精确到0.5 MUL165: RCALL MUL16 ;先得到32位积

SBRS R14,7 ;积小数部分高位为1,将整数部分加1

RET ;否则返回

LDI R17,255

SUB R13,R17

SBC R12,R17 ;以减去-1($FFFF)替代加1

RET

;范例10 ;32位被除数/16位除数-->16位商,精确到1

DIV16: LDI R16,16 ;(r12r13r14r15)/(r10r11)-->r14r15

DLOOP: LSL R15

ROL R14

ROL R13

ROL R12 ;被除数左移1位

BRCS DI1

SUB R13,R11

SBC R12,R10 ;移出位为0,被除数高位字减去除数试商

BRCC DI2 ;够减,本位商为1

ADD R13,R11

ADC R12,R10 ;否则恢复被除数

RJMP DI3 ;本位商0

DI1: SUB R13,R11

SBC R12,R10 ;移出位为1,被除数高位字减去除数

DI2: INC R15 ;本位商1

DI3: DEC R16

BRNE DLOOP

RET

;范例11 ;32位被除数/16位除数-->16位商,精确到0.5

;可能产生溢出!例$7FFFC000/$8000=$FFFF.8->$10000!

DIV165: RCALL DIV16 ;(r12r13r14r15)/(r10r11)-->r14r15

LSL R13

ROL R12 ;余数乘2

BRCS D165 ;有进位,转5入

SUB R13,R11

SBC R12,R10 ;否则,余数乘2减去除数

BRCS D164 ;不够减,转4舍

D165: CLR R13 ;否则将商增1

SEC

ADC R15,R13

ADC R14,R13

相关文档
最新文档