zx962032 发表于 2006-6-27 16:23:59

做了个M16的EEPROM的读写实验,汇编的,大家斧正下 ;)

做了个M16的EEPROM的读写实验,汇编的,大家斧正下

硬件电路:

M16的PA口接8个发光二极管到VCC.

先贴个图片来看看,手工制作的,有点丑,将就看吧 ;)

http://cache.amobbs.com/bbs_upload782111/files_6/armok01121768.JPG

http://cache.amobbs.com/bbs_upload782111/files_6/armok01121769.JPG

http://cache.amobbs.com/bbs_upload782111/files_6/armok01121770.JPG



程序代码如下,是汇编写的:

.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

jackrich 发表于 2006-6-27 16:47:56

不错

zx962032 发表于 2006-6-28 22:33:58

重新做了实验,改进了以下几点:

1.用8个数码管显示EEPROM地址和数据

2.使用了T/C中断来控制显示

3.用外部的按键来控制EEPROM的写入和读取显示

硬件电路:

PA口连数码管的段控制

PB口连数码管的位控制

PC口的0,1位连两个按键(按键弹起为高电平,按下为低电平)


-----此内容被zx962032于2006-06-28,22:40:21编辑过

luojiyin 发表于 2010-6-19 22:16:43

看不懂mark

8s209 发表于 2010-6-20 11:10:48

mark

netle8 发表于 2012-10-4 10:08:21

MARK
学习一下
页: [1]
查看完整版本: 做了个M16的EEPROM的读写实验,汇编的,大家斧正下 ;)