📄 sg1.lst
字号:
AVRASM ver. 1.30 sg1.ASM Thu Apr 19 10:38:07 2007
.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
000000 c024 rjmp RESET ;处理复位
EEWrite: ;写EEPROM子程序,r18、r17放写入地址,r16放要写入的数据
000001 99e1 sbic EECR,01 ;如果EEWE不清除
000002 cffe rjmp EEWrite ;等待
000003 bb2f out EEARH,r18 ;输出地址
000004 bb1e out EEARL,r17
000005 bb0d out EEDR,r16 ;输出数据
000006 9ae2 sbi EECR,02 ;设置EEPROM写选通
000007 9ae1 sbi EECR,01 ;该指令需4个时钟周期,由于它暂停CPU2个时钟周期
000008 9508 ret
EERead: ;读EEPROM子程序,r18、r17放读出地址,r16放读到的数据
000009 99e1 sbic EECR,01 ;如果EEWE不清除
00000a cffe rjmp EERead ;等待
00000b bb2f out EEARH,r18 ;输出地址
00000c bb1e out EEARL,r17
00000d 9ae0 sbi EECR,00 ;设置EEPROM读选通
00000e b30d in r16,EEDR ;读入数据
00000f 9508 ret
EEWrite_seq: ;连续写EEPROM子程序,写入地址(r25、r24)+1,写入的数据放r16
000010 99e1 sbic EECR,01 ;如果EEWE不清除
000011 cffe rjmp EEWrite_seq ;等待
000012 b38e in r24,EEARL ;得到地址
000013 b39f in r25,EEARH
000014 9601 adiw r24,0x01 ;地址加1
000015 bb8e out EEARL,r24 ;输出地址
000016 bb9f out EEARH,r25
000017 bb0d out EEDR,r16 ;输出数据
000018 9ae2 sbi EECR,02 ;设置EEPROM写选通
000019 9ae1 sbi EECR,01
00001a 9508 ret
EERead_seq: ;连续读EEPROM子程序,读出地址(r25、r24)+1,读到的数据放r16
00001b 99e1 sbic EECR,01 ;如果EEWE不清除
00001c cffe rjmp EERead_seq ;等待
00001d b38e in r24,EEARL ;得到地址
00001e b39f in r25,EEARH
00001f 9601 adiw r24,0x01 ;地址加1
000020 bb8e out EEARL,r24 ;输出地址
000021 bb9f out EEARH,r25
000022 9ae0 sbi EECR,00 ;设置EEPROM读选通
000023 b30d in r16,EEDR ;读入数据
000024 9508 ret
RESET: ;测试程序
000025 e002 ldi r16,$02 ;栈指针置初值
000026 bf0e out SPH,r16
000027 e50f ldi r16,$5f
000028 bf0d out SPL,r16
;*****将aa写入EEPROM的$40地址,再读出来送B口输出*****
000029 ef0f ldi r16,$ff ;定义B口为输出
00002a bb07 out DDRB,r16
00002b ea0a ldi r16,$aa
00002c e020 ldi r18,$00
00002d e410 ldi r17,$40
00002e dfd2 rcall EEWrite ;存储$aa到EEPROM的$40地址
00002f e020 ldi r18,$00
000030 e410 ldi r17,$40
000031 dfd7 rcall EERead ;读$40地址
000032 bb08 out PORTB,r16
;*****以$55、$aa、$55、$aa、...模式填充EEPROM*****
000033 e130 ldi r19,16 ;初始化循环计数器
000034 ef4f ser r20 ;r20←$FF
000035 bb4f out EEARH,r20 ;EEAR←$FF
000036 ef4f ser r20 ;r20←$FF
000037 bb4e out EEARL,r20 ;EEAR←$FF(start address-1)
000038 e505 loop1: ldi r16,$55
000039 dfd6 rcall EEWrite_seq ;写$55到EEPROM
00003a ea0a ldi r16,$aa
00003b dfd4 rcall EEWrite_seq ;写$aa到EEPROM
00003c 953a dec r19 ;计数器减1
00003d f7d1 brne loop1 ;未完成循环
;*****拷贝EEPROM最前10个字节到r2~r11*****
00003e ef4f ser r20
00003f bb4f out EEARH,r20 ;EEARH←$FF
000040 ef4f ser r20 ;r20←$FF
000041 bb4e out EEARL,r20 ;EEAR←$FF(start address-1)
000042 27ff clr ZH
000043 e0e1 ldi ZL,1 ;Z指针指向r1
000044 dfd6 loop2: rcall EERead_seq ;得到EEPROM数据
000045 8300 st Z,r16 ;存储到SRAM
000046 95e3 inc ZL
000047 30ec cpi ZL,12 ;到结尾?
000048 f7d9 brne loop2 ;未完成循环
forever:
000049 cfff rjmp forever ;无限循环
Assembly complete with no errors.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -