?? 6.asm
字號:
.include "8535def.inc"
rjmp RESET ;處理復(fù)位
EEWrite: ;寫EEPROM子程,r18:r17放寫入地址,r16放要寫入的數(shù)據(jù)
sbic EECR,EEWE ;如果EEWE不清除
rjmp EEWrite ;等待
out EEARH,r18 ;輸出地址
out EEARL,r17
out EEDR,r16 ;輸出數(shù)據(jù)
sbi EECR,EEMWE ;設(shè)置EEPROM寫選通
sbi EECR,EEWE ;該指令需4個時鐘周期,由于它暫停CPU 2個時鐘周期
ret
EERead: ;讀EEPROM子程,r18:r17放讀出地址,r16放讀到的數(shù)據(jù)
sbic EECR,EEWE ;如果EEWE不清除
rjmp EERead ;等待
out EEARH,r18 ;輸出地址
out EEARL,r17
sbi EECR,EERE ;設(shè)置EEPROM讀選通
in r16,EEDR ;讀入數(shù)據(jù)
ret
EEWrite_seq: ;連續(xù)寫EEPROM子程,寫入地址(r25:r24)+1,寫入的數(shù)據(jù)放r16
sbic EECR,EEWE ;如果EEWE不清除
rjmp EEWrite_seq ;等待
in r24,EEARL ;得到地址
in r25,EEARH
adiw r24,0x01 ;地址加1
out EEARL,r24 ;輸出地址
out EEARH,r25
out EEDR,r16 ;輸出數(shù)據(jù)
sbi EECR,EEMWE ;設(shè)置EEPROM寫選通
sbi EECR,EEWE
ret
EERead_seq: ;連續(xù)讀EEPROM子程,讀出地址(r25:r24)+1,讀到的數(shù)據(jù)放r16
sbic EECR,EEWE ;如果EEWE不清除
rjmp EERead_seq ;等待
in r24,EEARL ;得到地址
in r25,EEARH
adiw r24,0x01 ;地址加1
out EEARL,r24 ;輸出地址
out EEARH,r25
sbi EECR,EERE ;設(shè)置EEPROM讀選通
in r16,EEDR ;讀入數(shù)據(jù)
ret
;測試程序
RESET:
ldi r16,$02 ;棧指針置初值
out SPH,r16
ldi r16,$5F
out SPL,r16
;*****將aa寫入EEPROM的$40地址,再讀出來送B口輸出
ldi r16,$ff ;定義B口為輸出
out DDRB,r16
ldi r16,$aa
ldi r18,$00
ldi r17,$40
rcall EEWrite ;存儲 $aa到EEPROM的$40地址
ldi r18,$00
ldi r17,$40
rcall EERead ;讀$40地址
out PORTB,r16 ;輸出到PORT B口
;*****以 $55,$aa,$55,$aa,...模式填充EEPROM
ldi r19,16 ;初始化循環(huán)計數(shù)器
ser r20 ;r20←$FF
out EEARH,r20 ;EEARH←$FF
ser r20
out EEARL,r20 ;EEAR←$FF (start address - 1)
loop1: ldi r16,$55
rcall EEWrite_seq ;寫$55到EEPROM
ldi r16,$aa
rcall EEWrite_seq ;寫$aa到EEPROM
dec r19 ;計數(shù)器減 1
brne loop1 ;未完成循環(huán)
;*****拷貝EEPROM最前10個字節(jié)到 r2-r11
ser r20
out EEARH,r20 ;EEARH←$FF
ser r20
out EEARL,r20 ;EEAR←$FF (start address - 1)
clr ZH
ldi ZL,1 ;Z-pointer points to r1
loop2:
rcall EERead_seq ;得到 EEPROM 數(shù)據(jù)
st Z,r16 ;存儲到 SRAM
inc ZL
cpi ZL,12 ;到結(jié)尾?
brne loop2 ;未完成循環(huán)
forever:
rjmp forever ;無限循環(huán),原地踏步
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -