📄 sg1.asm
字号:
.device AT90S8535
.equ PORTB =$18
.equ DDRB =$17
.equ PINB =$16
.equ SPH =$3E
.equ SPL =$3D
.equ EECR =$1C
.equ EEDR =$1D
.equ EEARH =$1F
.equ EEARL =$1E
.def ZH =r31
.def ZL =r30
rjmp RESET ;处理复位
EEWrite: ;写EEPROM子程序,r18、r17放写入地址,r16放要写入的数据
sbic EECR,01 ;如果EEWE不清除
rjmp EEWrite ;等待
out EEARH,r18 ;输出地址
out EEARL,r17
out EEDR,r16 ;输出数据
sbi EECR,02 ;设置EEPROM写选通
sbi EECR,01 ;该指令需4个时钟周期,由于它暂停CPU2个时钟周期
ret
EERead: ;读EEPROM子程序,r18、r17放读出地址,r16放读到的数据
sbic EECR,01 ;如果EEWE不清除
rjmp EERead ;等待
out EEARH,r18 ;输出地址
out EEARL,r17
sbi EECR,00 ;设置EEPROM读选通
in r16,EEDR ;读入数据
ret
EEWrite_seq: ;连续写EEPROM子程序,写入地址(r25、r24)+1,写入的数据放r16
sbic EECR,01 ;如果EEWE不清除
rjmp EEWrite_seq ;等待
in r24,EEARL ;得到地址
in r25,EEARH
adiw r24,0x01 ;地址加1
out EEARL,r24 ;输出地址
out EEARH,r25
out EEDR,r16 ;输出数据
sbi EECR,02 ;设置EEPROM写选通
sbi EECR,01
ret
EERead_seq: ;连续读EEPROM子程序,读出地址(r25、r24)+1,读到的数据放r16
sbic EECR,01 ;如果EEWE不清除
rjmp EERead_seq ;等待
in r24,EEARL ;得到地址
in r25,EEARH
adiw r24,0x01 ;地址加1
out EEARL,r24 ;输出地址
out EEARH,r25
sbi EECR,00 ;设置EEPROM读选通
in r16,EEDR ;读入数据
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
;*****以$55、$aa、$55、$aa、...模式填充EEPROM*****
ldi r19,16 ;初始化循环计数器
ser r20 ;r20←$FF
out EEARH,r20 ;EEAR←$FF
ser r20 ;r20←$FF
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 ;计数器减1
brne loop1 ;未完成循环
;*****拷贝EEPROM最前10个字节到r2~r11*****
ser r20
out EEARH,r20 ;EEARH←$FF
ser r20 ;r20←$FF
out EEARL,r20 ;EEAR←$FF(start address-1)
clr ZH
ldi ZL,1 ;Z指针指向r1
loop2: rcall EERead_seq ;得到EEPROM数据
st Z,r16 ;存储到SRAM
inc ZL
cpi ZL,12 ;到结尾?
brne loop2 ;未完成循环
forever:
rjmp forever ;无限循环
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -