做了个M16的EEPROM的读写实验,汇编的,大家斧正下
硬件电路:
M16的PA口接8个发光二极管到VCC.
先贴个图片来看看,手工制作的,有点丑,将就看吧 ;)
程序代码如下,是汇编写的:
.include "m16def.inc"
.org $0000 ;系统复位
rjmp RESET
.org $002A ;跳过中断区
RESET:
ldi r16,high(ramend) ;设置堆栈指针
out sph,r16
ldi r16,low(ramend)
out spl,r16
ser r16 ;置位r16
out ddra,r16 ;设置PA口为输出
out porta,r16 ;设置PA口为高电平
ldi r20,0xff ;设置延时参数
ldi r19,0x00 ;设置写入参数
ldi r18,0x00 ;设置EEPROM地址高位
ldi r17,0x00 ;设置EEPROM地址低位
write: ;初始化EEPROM(格式:00,00,01,00,02,00,03,00,...,FF,00)
rcall flick_init ;EEPROM初始化前提示:PA口闪烁四次
ldi r16,0xFE ;初始化开始,PA口显示:11111110,亮第一个灯
out porta,r16
init_began:
mov r16,r19 ;写R19到EEPROM
rcall EEPROM_write
inc r17 ;写0x00到EEPROM
ldi r16,0x00
rcall EEPROM_write
inc r17
cpi r17,0x00
brne init_next
inc r18
cpi r18,0x02
brne init_next
rjmp init_end
init_next:
inc r19
cpi r19,0x00
brne init_began
init_end:
ldi r16,0x7f ;初始化结束,PA口显示:01111111,亮最后一个灯
out porta,r16
rcall delay
rcall delay
rcall delay
rcall delay
ldi r18,0x00 ;初始化EEPROM地址
ldi r17,0x00
rcall flick_desplay ;PA口灯闪烁,读取EEPROM前的提示
desplay:
rcall EEPROM_read
out porta,r16
rcall delay
inc r17
cpi r17,0x00
brne desplay
inc r18
cpi r18,0x02
brne desplay
ldi r18,0x00
rcall flick_desplay ;重新遍历EEPROM前PA口灯闪烁提示
rjmp desplay
;子函数区
EEPROM_read: ;EEPROM读操作
sbic EECR,EEWE
rjmp EEPROM_read
out EEARH,r18
out EEARL,r17
sbi EECR,EERE
in r16,EEDR
ret
EEPROM_write: ;EEPROM写操作
sbic EECR,EEWE
rjmp EEPROM_write
out EEARH,r18
out EEARL,r17
out EEDR,r16
sbi EECR,EEMWE
sbi EECR,EEWE
ret
delay: ;延时函数
push r20
del1: push r20
del2: push r20
del3: dec r20
brne del3
pop r20
dec r20
brne del2
pop r20
dec r20
brne del1
pop r20
ret
flick_init:
ldi r16,0x00
out porta,r16
rcall delay
ldi r16,0xff
out porta,r16
rcall delay
ldi r16,0x00
out porta,r16
rcall delay
ldi r16,0xff
out porta,r16
rcall delay
ldi r16,0x00
out porta,r16
rcall delay
ldi r16,0xff
out porta,r16
rcall delay
ldi r16,0x00
out porta,r16
rcall delay
ldi r16,0xff
out porta,r16
rcall delay
ret
flick_desplay:
ldi r16,0x0f
out porta,r16
rcall delay
ldi r16,0xf0
out porta,r16
rcall delay
ldi r16,0x0f
out porta,r16
rcall delay
ldi r16,0xf0
out porta,r16
rcall delay
ldi r16,0x0f
out porta,r16
rcall delay
ldi r16,0xf0
out porta,r16
rcall delay
ldi r16,0x0f
out porta,r16
rcall delay
ldi r16,0xf0
out porta,r16
rcall delay
ret |