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

📄 asm.asm

📁 与AVR开发相关的一百个实例,源码用ASM语言编写
💻 ASM
📖 第 1 页 / 共 5 页
字号:
FERR2:  RCALL   MOVE1        ;显示'F Err.2'
        LDI     R16,2
        STS     $71,R16
        RJMP    FER123
FERR3:  RCALL   MOVE1        ;显示'F Err.3'
        LDI     R16,3
        STS     $71,R16
FER123: LDI     XL,$6C
        LDI     R16,$0F
        ST      X+,R16
        LDI     R16,$24
        ST      X+,R16
        LDI     R16,$0E
        ST      X+,R16
        LDI     R16,$1B
        ST      X+,R16
        LDI     R16,$3B
        ST      X+,R16       ;显示'F Err.1/2/3'
        LDI     R16,$24      ;2秒
        STS     $72,R16
        STS     $73,R16
        RCALL   DL2S
        RET
FIL8:   LDI     R26,8        ;将显示缓存区充空白
        MOV     R10,R26
        LDI     R26,$6C
        CLR     R27
        LDI     R16,$24
FILP:   ST      X+,R16
        DEC     R10
        BRNE    FILP
        RET
FLFUNC: RCALL   FIL8         ;准备显示'Func.'
        LDS     R26,$6C
        LDI     R16,$0F      ;'F'
        ST      X+,R16
        LDI     R16,$1E      ;'u'
        ST      X+,R16
        LDI     R16,$17      ;'n'
        ST      X+,R16
        LDI     R16,$40      ;'c.'
        ST      X+,R16
        RET
EXCH0:  LDI     ZL,$14       ;将显示缓存区内容转移$6C-$73<-->$214-$21B
        LDI	ZH,2
        LDI     XL,$6C
EXL:    LD      R16,X
        LD      R17,Z
        ST      X+,R17
        ST      Z+,R16
        CPI     R26,$74
        BRNE    EXL
        RET
MOVE1:  LDI     ZL,$14       ;将显示缓存区内容传送到$214-$21B		
             LDI     ZH,2		
        LDI     XL,$6C
MV1:    LD      R16,X+
        ST      Z+,R16
        CPI     R26,$74
        BRNE    MV1
        RET
       ;EEPROM 读写程序
       
       ;范例22                           ;读出EEPROM子程序
REEP:   LDI     YH,1
        LDI     YL 0         ;EEPROM 读出首地址:$100
        LDI     XL,$60       ;读出数据存放首地址:$60
        CLR     XH
REEP1:  SBIC    $1C,1        ;查EEWE位,EEWE=1为当前尚有写入操作未结束
        RJMP    REEP1        ;等待EEWE=0
        OUT     $1F,YH
        OUT     $1E,YL       ;读出地址写入EEPRO地址寄存器
        SBI     $1C,0        ;设置读出使能位(EERE)
        IN      R16,$1D      ;从EEPROM数据寄存器中读出数据
        ST      X+R16        ;存入缓存区
        INC     YL
        BRNE    REEP1        ;
        INC     YH
        CPI     YH,2         ;EEPROM最末数据(地址为$1FF)读完?
        BRNE    REEP1
        RET
        
       ;范例23               ;写入EEPROM子程序 
WEEP:   LDI     YH,1
        LDI     YL 0         ;EEPROM 写入之首地址:$100
        LDI     XL,$60       ;写入数据存储区首地址:$60
        CLR     XH
WEEP1:  SBIC    $1C,1        ;查EEWE位,EEWE=1为当前尚有写入操作未结束
        RJMP    WEEP1        ;等待EEWE=0
        OUT     $1F,YH
        OUT     $1E,YL       ;送写入地址到EEPRO地址寄存器
        LD      R16,X+       ;取写入数据并调整数据指针
        OUT     $1D,R16      ;送到EEPROM数据寄存器
        SBI     $1C,2        ;设置EEPROM写入总使能位EEMWE
        SBI     $1C,1        ;设置EEPROM写入使能位EEWE
        INC     YL
        BRNE    WEEP1        
        INC     YH
        CPI     YH,2         ;EEPROM最末写入单元地址为$1FF
        BRNE    WEEP1
        RET
        
       ;时钟日历芯片62×42×读写程序,时钟日历数据读入到显示缓存区$6C--$73
       ;范例24               ;USE 8515!使用DSPA子程序
.EQU    RTCH=$40             ;rtc地址高八位
RDATE:  RCALL   BSYT         ;初始化,兼冻结RTC
        LDI     XL,$6D       ;数据缓存区首地址
        LDI     YL,$06       ;首指日单元
RDLP:   LD      R16,Y+       ;$6b 6c 6d   6e 6f 70  71 72 73
        ANDI    R16,15       ;     2  9(D) - 1  0(M) - 0  2(Y)
        CPI     R16,10
        BRCS    RDL1
        ANDI    R16,$7F      ;容错处理
RDL1:   ST      X,R16$
        DEC     R26
        CPI     R26,$6B
        BRNE    RDLP1
        LDI     XL,$70
RDLP1:  CPI     R26,$6E
        BRNE    RDLP2
        LDI     R16,$14      ;送‘-’到$6E单元
        ST      X,R16
        LDI     XL,$73
RDLP2:  CPI     R26,$71
        BRNE    RDLP
        LDI     R16,$14      
        ST      X,R16        ;送‘-’到$71单元并结束子程序
RDINVL: RJMP    WCRT

RTIME:  RCALL   FIL2         ;请除缓存区
        RCALL   BSYT
        LDI     XL,$73
        LDI     YL,$02       ;指向分单元(只读时分)
RCL:    LD      R16,Y+
        ANDI    R16,15
        CPI     R16,10
        BRCS    RCL0         
        ANDI    R16,$7F      ;容错处理
RCL0:   ST      X,R16
        DEC     R26
        CPI     R26,$71
        BRNE    RCL1
        LDI     R16,$14      ;写入‘-’
        ST      X,R16
        DEC     R26
RCL1:   CPI     R26,$6E      ;$6c 6d 6e 6f 70 71 72 73
        BRNE    RCL          ;           1  6  -  3  5
        CLR     R16
        ST      Y,R16
        LDS     R17,$9FFB    ;时制存储单元
        LDS     R16,$6f
        SWAP    R16
        LDS     R15,$70
        ADD     R16,R15      ;合成小时
        SUBI    R16,$24      ;模24
        RCALL   SUDAA        ;BCD码减法调整
        BRCC    RCL2         ;够减,转
        SUBI    R16,-36      ;否则恢复被减数
RCL2:   CPI     R17,2
        BRNE    PRTD1        ;24小时制,转
        SUBI    R16,$12
        RCALL   SUDAA
        BRCC    PRTD1        ;12小时制处理
        SUBI    R16,-18      
PRTD1:  MOV     R17,R16
        SWAP    R16
        ANDI    R16,$0F
        ANDI    R17,$0F
        STS     $6F,R16
        STS     $70,R17      ;小时数据送入显示区
        RJMP    WCRT

WDATE:  RCALL   WRTC         ;将显示缓存区中日期数据写入RTC
        LDI     XL,$6F
        LD      R16,X
        CPI     R16,10
        BRCC    WDRT         ;非法数据,退出
        LDI     YL,6
WDLP:   LD      R16,X
        DEC     R26
        CPI     R16,$24      ;SPC?
        BRNE    WD0
        CLR     R16          ;变为0
WD0:    ST      Y+,R16
        CPI     R26,$6D
        BRNE    WD1          ;$6d 6e 6f   70 71   72 73
        LDI     XL,$71       ;     2 9(日) 1  1(月) 0  2 (年)
        RJMP    WDLP
WD1:    CPI     R26,$6f
        BRNE    WD2
        LDI     R26,$73
WD2:    CPI     R26,$71
        BRNE    WDLP
LWDRT:  RJMP    WCRT

WTIME:  RCALL   WRTC         ;将显示缓存区中时间数据写入RTC
        LDI     R26,$73
        LD      R16,X
        CPI     R16,10
        BRCC    WCRT         ;非法数据,退出
        LDI     YL,2
WLOP:   LD      R16,X
        CPI     R16,$24
        BRNE    WT1
        CLR     R16          ;容错处理
WT1:    ST      Y+,R16
        DEC     R26
WLP:    CPI     R26,$6F
        BRNE    WLOP         ;$6E 6f 70 71 72 73
WCRT:   CLR     R16          ;        1  5  3  8
        LDI     YL,$0D
        ST      Y,R16        ;解除对RTC之冻结
        IN      R16,MCUCR      
        CBR     R16,$C0
        OUT     MCUCR,R16    ;禁止读写外部RAM
        RET
       ;对rtc初始化/冻结时钟
BSYT:   LDI     YH,RTCH      ;rtc地址高八位
        LDI     YL,$0D       ;指向D寄存器
        IN      R16,MCUCR
        SBR     r16,$C0      ;允许读写外部RAM并选一个时钟周期等待时间
        OUT     MCUCR,R16
        LDI     R16,5        ;设置冻结位和中断申请位
        ST      Y,R16
        CLR     XH
BSRT:   RET
       ;写RTC初始化子程序
WRTC:   RCALL   BSYT
        LDI     YL,$0E       ;指向寄存器E
        LDI     R16,6
        ST      Y+,R16       ;指向寄存器F
        LDI     R16,1        ;设置时制位
        ST      Y,R16
        LDI     R16,4        ;选24小时制
        ST      Y,R16
        CLR     R16          ;请除时制位 
        ST      Y,R16
        RJMP	BSYT
        
       ;范例25               ;显示保护子程序/晶振4MHZ
DSPRV:  LDI     R16,HIGH(ramend)
        OUT     SPH,R16
        LDI     R16,LOW(ramend)
        OUT     SPL,R16
        CLR     R2           ;调DSPY次数寄存器清除
        WDR
        LDI     R16,$0D      ;启动看门狗,溢出时间为0.49s
        OUT     WDTCR,R16    ;写入看门狗控制寄存器
        CLR     XH           
        LDI     XL,$6C
DSPVL:  ST      X+,XH        ;清显示缓存区($6c-$73)
        CPI     XL,$74
        BRNE    DSPVL
DSPV0:  LDI     R16,$66
        MOV     R9,R16
        LDI     R16,$82      ;$6582=25986,高位字节增1为$66
        MOV     R10,R16      ;调25986次DSPA耗时120s
DSNEX:  LDI     XL,$74       ;将显示区十进制数据增1以演示数据变化
DSLOP:  LD      R16,-X       ;实用时可以采样数据更新显示(参考范例96)
        INC     R16
        ST      X,R16
        CPI     R16,$0A
        BRNE    DSPRV1
        CLR     R16
        ST      X,R16
        CPI     R26,$6C
        BRNE    DSLOP        ;增1后如有进位则调整
DSPRV1: DEC     R10
        BRNE    DSPGN
        DEC     R9
        BRNE    DSPGN        ;2分钟定时到?
DSCLOS: RCALL   FIL2         ;将显示缓存区充入空白($24)
        RCALL   DSPA         ;其效果相当于关显
        SBRC    R16,7         
        RJMP    DSCLOS       
        RJMP    DLFUNC       ;有键按下,转出;否则继续关显
DSPGN:  RCALL   DSPA         ;未到,显示数据
        SBRC    R16,7
        RJMP    DSNEX        ;无键按下,继续显示

DLFUNC: CPI     R16,12       ;关显键键值为12
        BEEQ    DSCLOS       ;关显键按下,转关闭显示
       ;.
       ;.
       ;.
       ;.
       ;(其他键值处理,参考范例26 DEALKY程序)
        RJMP    DSPV0        ;执行功能后转入二分钟定时

       ;范例26               ;键值处理程序
DEALKY: LDI     R16,HIGH(ramend)
        OUT     SPH,R16
        LDI     R16,LOW(ramend)
        OUT     SPL,R16
        CLR     R2           ;调DSPY次数寄存器清除
        WDR
        LDI     R16,$0D      ;启动看门狗,溢出时间为0.49”
        OUT     WDTCR,R16    ;写入看门狗控制寄存器      
DEALK0: RCALL   DSPA
        SBRC    R16,7
        RJMP    DEALK0       ;无键按下,反复查询
        CPI     R16,10
        BRCC    FNCKY        ;功能键按下,跳转
        RCALL   FIL2         ;键值<10为数字键 ,先清除显示缓存区
NUMKY:  RCALL   LSDD8        ;8位数字左移,新键值加入序列尾
DSLP:   RCALL   DSPA
        SBRC    R16,7
        RJMP    DSLP         ;无键按下,继续显示
        CPI     R16,11       
        BRCS    NUMKY        ;键入数字形成左移序列/按清除键则清除所有键入数据
        BRNE    DSLP         ;键值大于11无效
                             ;11为回车键,对键入数字进行处理(如将其两两合并为BCD
                                                   ;码,再转为二进制数等)
        RJMP    DEALK0       ;转回

FNCKY:  SUBI    R16,10       ;功能键散转处理,先计算键值偏移量
        LDI     R31,HIGH(FKYTB)
        LDI     R30,LOW(FKYTB);散转表表首
        ADD     R30,R16
        CLR     R16
        ADC     R31,R16      ;偏移量加入指针
        IJMP                 ;散转
FKYTB:  RJMP    CLTTL        ;10:清除累加和
        RJMP    DSTTL        ;11:显示累加和
        RJMP    DSCLS        ;12:关显示
        RJMP    SLFTS        ;13:自检
        RJMP    FDPAP        ;14:打印机走纸
        RJMP    PRSMP        ;15:打印采样
        RJMP    PRTTL        ;16:打印累加和
        RJMP    DSCLK        ;17:显示系统时钟
       ;.............        ;.........
       ;.............        ;.........

CLTTL: ;.............        ;程序内容略
       ;.............
        RJMP    DEALK0       ;程序执行完毕,转回
DSTTL:  RCALL   BRTTL        ;分解累加和送显示缓存区
        RCALL   DSPA         ;显示累加和

⌨️ 快捷键说明

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