📄 asm.asm
字号:
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 + -