?? 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 + -