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

📄 asm.asm

📁 与AVR开发相关的一百个实例,源码用ASM语言编写
💻 ASM
📖 第 1 页 / 共 5 页
字号:
LPRT2:  LDI     R25,1        
        CLR     R24          ;point to $100
        LDI     R17,$80
        OUT     GIMSK,R17    ;允许int1中断
        LDI     R17,$0A
        OUT     MCUCR,R17    ;INT1下降沿中断
        SEI                  ;general interrupt enable
        RET
EX_INT1:PUSH    R26
        PUSH    R27
        IN      R27,SREG
        PUSH    R27
        PUSH    R17          ;保护现场
        MOV     R27,R25      ;取数据指针
        MOV     R26,R24
        LD      R17,X+       ;
        MOV     R25,R27
        MOV     R24,R26      ;增1后将指针送回
        CPI     R17,3        ;是停止符?
        BRNE    INT1SD
        CLR     R17
        OUT     GIMSK,R17    ;禁止INT1中断
        RJMP    INT1ED
INT1SD: OUT     PORTC,R17    ;打印数据输出到打印口
        CBI     PORTD,7      ;clr ($12,7)
        NOP
        NOP
        NOP
        SBI     PORTD,7      ;向打印机发出选通
INT1ED: POP     R17
        POP     R27
        OUT     SREG,R27
        POP     R27
        POP     R26          ;恢复现场
        RETI
        
       ;范例32               ;步进电机控制程序
       .ORG     0
STRT10: RJMP    RST10        ;8535/8515/晶振4MHZ
       .ORG     $011
RST10:  LDI     R16,HIGH(ramend)
        OUT     SPH,R16
        LDI     R16,LOW(ramend)
        OUT     SPL,R16
        SER     R16
        OUT     DDRB,R16     ;B口为输出
        LDI     R17,8
        OUT     PORTB,R16    ;接通总开关
        LDI     R16,50       ;50次基本运作
        RCALL   DELAY5       ;延时5毫秒
LOOPX:  LDI     R17,$68      ;step1时序脉冲控制
        OUT     PORTB,R17
        RCALL   DELAY2       ;延时2毫秒
        LDI     R17,$38      ;step2时序脉冲控制
        OUT     PORTB,R17
        RCALL   DELAY2       ;延时2毫秒
        LDI     R17,$98      ;step3时序脉冲控制
        OUT     PORTB,R17
        RCALL   DELAY2       ;延时2毫秒
        LDI     R17,$C8      ;step4时序脉冲控制
        OUT     PORTB,R17
        RCALL   DELAY2       ;延时2毫秒
        DEC     R16
        BRNE    LOOPX        ;到50次?
        LDI     R17,8
        OUT     PORTB,r17    ;关闭各相位开关
        RCALL   DELAY5
        RCALL   DELAY5       ;延时10毫秒
        CLR     R17
        OUT     PORTB,R17    ;关闭所有相位开关和总开关
HH0:    RJMP    HH0          ;踏步
DELAY1: LDI     R17,$06      ;延时1毫秒
        MOV     R15,R17      ;1000/0.75=1333=$535,外層计数器装入$06
        LDI     R17,$35      ;DEC+BRNE=0.75微秒
        RJMP    DLCOM
DELAY2: LDI     R17,$0B      ;延时2毫秒
        MOV     R15,R17      ;2000/0.75=2666=$0A6A,外層计数器装入$0B
        LDI     R17,$6A
DLCOM:  DEC     R17
        BRNE    DLCOM
        DEC     R15
        BRNE    DLCOM
        RET
DELAY5: LDI     R17,$1B      ;延时5毫秒
        MOV     R15,R17      ;5000/0.75=6666=$1A0A,外層计数器装入$1B
        LDI     R17,$0A
        RJMP    DLCOM
        
       ;范例33
       .ORG     0            ;8515采用定时器中断输出时序脉冲方式控制电机转动
STRT11: RJMP    RST11        ;晶振4MHZ
       .ORG     $007
        RJMP    T0_OVF        ;中断服务程序与STRT12共用
       .ORG     $00D
RST11:  LDI     R17,HIGH(ramend)
        OUT     SPH,R17
        LDI     R17,LOW(ramend)
        OUT     SPL,R17
        LDI     R17,$68
        MOV     R7,R17       ;初始脉冲为0B01101000
        SER     R17
        OUT     DDRB R17     ;B口为输出
        LDI     R17,N        ;运作次数N(N>0)
        RCALL   STPDRV       ;初始化子程序
HH20:   RJMP    HH20         ;实用时改为具体的背景程序!
STPDRV: TST     R17
        BRNE    STPDR1
        INC     R17          ;N=0时,将其改为1
STPDR1: MOV     R6,R17
        INC     R6           ;N+1-->r6(max.is 256;“植树问题”,N必需增1!
        LDI     R17,$A4
        CBR     R17,$20
        STS     $A4,R17      ;清除连续转动电机标志
        LDI     R17,$08
        OUT     PORTB,R17    ;接通总开关
        LDI     R17,4        ;0B00000100/ 256分频(4兆/256=1兆/64)
        OUT     TCCR0,R17    
        LDI     R17,178      ;78*64=4.992ms
        OUT     TCNT0,R17    ;时间常数,首定时为5毫秒
        LDI     R17,$02
        OUT     TIMSK,R17    ;允许T/C0溢出中断
        SEI                  
HH21:   SJMP    HH21
       ;范例34
       .ORG     $000         ;步进电机手动控制程序(8515)晶振4MHZ
STRT12: RJMP    RST12
       .ORG     $007
        RJMP    T0SEV
       .ORG     $00D
RST12:  LDI     R17,HIGH(ramend)
        OUT     SPH,R17
        LDI     R17,LOW(ramend)
        OUT     SPL,r17
        LDI     R17,$68
        MOV     R7,R17       ;第一个时序脉冲
        LDI     R17,$F8
        OUT     DDRB,R17     ;PB7-PB3输出,PB2-PB0输入
        CLR     R17
        OUT     PORTB,R17    ;输出为低电平
        LDS     R17,$A4
        SBR     R17,$20      ;设置连续转动标志
        CBR     R17,$40      ;设置电机正转标志
TSTLP1: SBI     PORTB,1      ;PB1接地,正转
        SBIS    PINB,1
        RJMP    TSTL11       ;
TSTL10: SBI     PORTB,2
        SBIC    PINB,2       ;PB2接地,反转
        RJMP    TSTLP1       ;PB1,PB2都未接地,反复查询
        SBR     R17,$40      ;设置电机反转
TSTL11: STS     $A4,R17      ;保存标志
        CLR     R6
        INC     R6           ;R6中装入1,减一次即为0!
        LDI     R17,$08
        OUT     PORTB,R17    ;接通总开关
        LDI     R17,4        ;0B00000100/256分频(256/4=64微秒)!
        OUT     TCCR0,R17    
        LDI     R17,178      ;178之补为78,78*64=4.992ms
        OUT     TCNT0,R17    ;
        LDI     R17,$02
        OUT     TIMSK,R17    ;允许T/C0中断(toie1=$39,7 toie0=$39,1)
                             ;8535,toie1:$39,2 toie0:$39,0
        SEI                  
TSTLP2: SBI     PORTB,1
        SBI     PORTB,2
        IN      R17,PINB
        ANDI    R17,6
        CPI     R17,6        
        BRNE    TSTLP2       ;两开关未全部打开,查询等待
        LDS     R17,$A4
        CBR     R17,$20      ;清除连续转动标志
        STS     $A4,R17      ;
TSTLP3: IN      R17,TIMSK
        SBRC    R17,1        ;已禁止8515中断?(8535:timsk,0)
        RJMP    TSTLP3       ;未,查询等待
        RJMP    RST12

T0_OVF: PUSH    R17          ;电机控制中断服务子程序
        IN      R17,SREG
        PUSH    R17
        LDS     R17,$A4
        SBRC    R17,7
        RJMP    T0SV2        ;$A4,7:关电机前10毫秒延时标志
        MOV     R17,R7
        CPI     R17,$68
        BRNE    T0SV0
        LDS     R17,$A4
        SBRC    R17,5
        RJMP    T0SV0        ;电机连续转动,不减R6
        DEC     R6           ;R6减为0,将停止电机
        BREQ    T0SV1        ;
T0SV0:  LDI     R17,225      ;每步进延时(256-225)*64=1.984MS err.<0.8%
        OUT     TCNT0,R17    ;
        OUT     PORTB,R7     ;步进控制脉冲输出
        LDS     R17,$A4
        SBRC    R17,6
        RJMP    T0SVA        ;$A4,6=1 为连续反转
        CLC
        SBRC    R7,4         ;组织下一步控制脉冲
        SEC
        ROR     R7
        LDI     R17,$08      ;正转
        OR      R7,R17       ;01101***->00111***->10011***->11001***->01101***.......
        RJMP    T0RET
T0SVA:  MOV     R17,R7       ;
        SBR     R17,$04
        ROL     R17          ;组织下一步控制脉冲(反转)
        BRCS    T0SVB
        CBR     R17,$10      ;01101***->11001***->10011***->00111***->01101***.......!
T0SVB:  MOV     R7,R17
        RJMP    T0RET
T0SV1:  LDS     R17,$A4
        SBR     R17,$80
        STS     $A4,R17      ;总开关关断前10毫秒延时标志
        LDI     R17,$08
        OUT     PORTB,R17    ;关断4个相位开关
        LDI     R17,100      ;156(256-100)*64=9.984ms
        OUT     TCNT0,R17    ;
        RJMP    T0RET
T0SV2:  LDI     R17,$07
        OUT     PORTB,R17    ;关闭所有开关
        CLR     R17
        OUT     TCCR0,R17    ;关T/C0中断
        OUT     TIMSK,R17    
        LDS     R17,$A4
        CBR     R17,$C0
        STS     $A4,R17      ;清除10毫秒延时和反向转动标志
T0RET:  POP     R17
        OUT     SREG,R17
        POP     R17
        RETI
       ;精确定时及时钟日历走时子程序
       ;范例35
.EQU    DTPNT=$75            ;年年月日时分秒(from $7B to $75)
       .ORG     $000
STRT20: RJMP    RST20        ;晶体实测频率4.000119MHZ
       .ORG     $006         ;8515 t1 overflow INT.vector
        RJMP    T1_OVF
       .ORG     $00D
RST20:  LDI     R16,HIGH(ramend)
        OUT     SPH,R16
        LDI     R16,LOW(ramend)
        OUT     SPL,R16
        LDI     R16,2        ;8分频,4000119/8=500015
        OUT     TCCR1B,R16   
        LDI     R16,$5E      ;500015=65536*8-24273=8*$10000-$5ed1/TCC=$5Ed1
        OUT     TCNT1H,R16   ;
        LDI     R16,$D1      ;
        OUT     TCNT1L,R16   ;将TCC写入TCNT1
        LDI     R16,$80      
        OUT     TIMSK,R16    ;允许T/C1溢出中断
        LDI     R16,8        ;8次中断出秒号
        MOV     R6,R16
        SEI                  
HH10:   RJMP    HH10         ;可改为具体的实用程序
T1_OVF: PUSH    R16
        PUSH    R17
        IN      R7,SREG
        DEC     R6           ;到8次中断?
        BRNE    GOON1        
        IN      R17,TCNT1L   ;*
        IN      R16,TCNT1H   ;*读回TCNT1自然计数值
        SUBI    R17,$2F      ;*$5ED1之补为$A12F,以减法替代加法修正TCC
        SBCI    R16,$A1      ;*减去$A12E可不做下面的加1修正
        SUBI    R17,$FF      ;*8条修正指令占用一个计数单位时间
        SBCI    R16,$FF      ;*修正后TCC=$5ED1+(TCNT1)+1
        OUT     TCNT1H,R16   ;*
        OUT     TCNT1L,R17   ;*将修整后TCC写入TCNT1
        LDI     R16,8
        MOV     R6,R16       ;重装中断次数8
        ;.                   
        ;.
        RCALL   ACLK         ;时钟走时
GOON1:  POP     R17
        POP     R16
        OUT     SREG,R7
        RETI
       ;范例36
.EQU    DTPNT=$75            ;yyyy mm dd hh mm ss(from $7B--$75)
       .ORG   $000           ;晶体实测频率8.000267MHZ,8分频
                             ;INT(8000267/8)=1000033
STRT21: RJMP    STRT21
       .ORG     $006         ;8515 t1 overflow INT. vector
        RJMP    T1_OVF
       .ORG     $00D
STRT21: LDI     R16,HIGH(ramend)
        OUT     SPH,R16
        LDI     R16,LOW(ramend)
        OUT     SPL,R16
        LDI     R16,2        
        OUT     TCCR1B,R16   ;8分频
        LDI     R16,1        ;1000033=62332*15+65053
                             ;=($10000-$0C84)*15-$10000-$1E3
        OUT     TCNT1H,R16   ;主常数62332(补码为$0C84) 补尝常数TCC=$01E3
        LDI     R16,$E3      ;$FE1D=65053\65053+62332*15=1000033
        OUT     TCNT1L,R16
        CLR     R16
        OUT     TCCR1A,R16   ;DISABLE CMPA/CMPB/PWM!
        LDI     R16,$80      ;8515
        OUT     TIMSK,R16    ;允许T/C1溢出中断
        LDI     R16,16       ;16次中断
        MOV     R6,R16
        SEI                  
HH11:   RJMP    HH11         ;
T1_OVF: PUSH    R17
        PUSH    R16
        IN      R7,SREG
        DEC     R6           ;中断次数到?未到转装入主常数
        BRNE    COMP         ;否则重装入TCC
        IN      R17,TCNT1L   ;*
        IN      R16,TCNT1H   ;*读回自然计数值
        SUBI    R17,$1D      ;*
        SBCI    R16,$FE      ;*减去TCC之补码
        SUBI    R17,255      ;*再加1
        SBCI    R16,255      ;*修正后TCC=$01E3+(TCNT1)+1
        OUT     TCNT1H,R16   ;*
        OUT     TCNT1L,R17   ;*
        LDI     R16,16
        MOV     R6,R16       ;重写中断次数
        ;.                
        ;.
        RCALL   ACLK         ;时钟走时
        RJMP    GOON2
COMP:   IN      R17,TCNT1L   ;*
        IN      R16,TCNTIH   ;*读回TCNT1自然计数值
        SUBI    R17,$7C      ;*先减去$0C84$'补码$F37C
        SBCI    R16,$F3      ;*再作加1补偿
        SUBI    R17,$FF      ;*
        SBCI    R16,$FF      ;*修整后重装值=[$0C84+(TCNT1)+1]
        OUT     TCNT1H,R16   ;*
        OUT     TCNT1L,R17   ;*
GOON2:  POP     R16
        POP     R17
        OUT     SREG,R7
        RETI
       ;范例37                ;8515使用T/C0定时,64分频,晶振频率40

⌨️ 快捷键说明

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