📄 sg1.sdi
字号:
,,,.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,EEWrite: ;写EEPROM子程序,r18、r17放写入地址,r16放要写入的数据
000002,99E1,, sbic EECR,01 ;如果EEWE不清除
000004,CFFE,, rjmp EEWrite ;等待
000006,BB2F,, out EEARH,r18 ;输出地址
000008,BB1E,, out EEARL,r17
00000A,BB0D,, out EEDR,r16 ;输出数据
00000C,9AE2,, sbi EECR,02 ;设置EEPROM写选通
00000E,9AE1,, sbi EECR,01 ;该指令需4个时钟周期,由于它暂停CPU2个时钟周期
000010,9508,, ret
,,EERead,EERead: ;读EEPROM子程序,r18、r17放读出地址,r16放读到的数据
000012,99E1,, sbic EECR,01 ;如果EEWE不清除
000014,CFFE,, rjmp EERead ;等待
000016,BB2F,, out EEARH,r18 ;输出地址
000018,BB1E,, out EEARL,r17
00001A,9AE0,, sbi EECR,00 ;设置EEPROM读选通
00001C,B30D,, in r16,EEDR ;读入数据
00001E,9508,, ret
,,EEWrite_seq,EEWrite_seq: ;连续写EEPROM子程序,写入地址(r25、r24)+1,写入的数据放r16
000020,99E1,, sbic EECR,01 ;如果EEWE不清除
000022,CFFE,, rjmp EEWrite_seq ;等待
000024,B38E,, in r24,EEARL ;得到地址
000026,B39F,, in r25,EEARH
000028,9601,, adiw r24,0x01 ;地址加1
00002A,BB8E,, out EEARL,r24 ;输出地址
00002C,BB9F,, out EEARH,r25
00002E,BB0D,, out EEDR,r16 ;输出数据
000030,9AE2,, sbi EECR,02 ;设置EEPROM写选通
000032,9AE1,, sbi EECR,01
000034,9508,, ret
,,EERead_seq,EERead_seq: ;连续读EEPROM子程序,读出地址(r25、r24)+1,读到的数据放r16
000036,99E1,, sbic EECR,01 ;如果EEWE不清除
000038,CFFE,, rjmp EERead_seq ;等待
00003A,B38E,, in r24,EEARL ;得到地址
00003C,B39F,, in r25,EEARH
00003E,9601,, adiw r24,0x01 ;地址加1
000040,BB8E,, out EEARL,r24 ;输出地址
000042,BB9F,, out EEARH,r25
000044,9AE0,, sbi EECR,00 ;设置EEPROM读选通
000046,B30D,, in r16,EEDR ;读入数据
000048,9508,, ret
,,,
,,RESET,RESET: ;测试程序
00004A,E002,, ldi r16,$02 ;栈指针置初值
00004C,BF0E,, out SPH,r16
00004E,E50F,, ldi r16,$5f
000050,BF0D,, out SPL,r16
,,,;*****将aa写入EEPROM的$40地址,再读出来送B口输出*****
000052,EF0F,, ldi r16,$ff ;定义B口为输出
000054,BB07,, out DDRB,r16
000056,EA0A,, ldi r16,$aa
000058,E020,, ldi r18,$00
00005A,E410,, ldi r17,$40
00005C,DFD2,, rcall EEWrite ;存储$aa到EEPROM的$40地址
00005E,E020,, ldi r18,$00
000060,E410,, ldi r17,$40
000062,DFD7,, rcall EERead ;读$40地址
000064,BB08,, out PORTB,r16
,,,;*****以$55、$aa、$55、$aa、...模式填充EEPROM*****
000066,E130,, ldi r19,16 ;初始化循环计数器
000068,EF4F,, ser r20 ;r20←$FF
00006A,BB4F,, out EEARH,r20 ;EEAR←$FF
00006C,EF4F,, ser r20 ;r20←$FF
00006E,BB4E,, out EEARL,r20 ;EEAR←$FF(start address-1)
000070,E505,loop1,loop1: ldi r16,$55
000072,DFD6,, rcall EEWrite_seq ;写$55到EEPROM
000074,EA0A,, ldi r16,$aa
000076,DFD4,, rcall EEWrite_seq ;写$aa到EEPROM
000078,953A,, dec r19 ;计数器减1
00007A,F7D1,, brne loop1 ;未完成循环
,,,;*****拷贝EEPROM最前10个字节到r2~r11*****
00007C,EF4F,, ser r20
00007E,BB4F,, out EEARH,r20 ;EEARH←$FF
000080,EF4F,, ser r20 ;r20←$FF
000082,BB4E,, out EEARL,r20 ;EEAR←$FF(start address-1)
000084,27FF,, clr ZH
000086,E0E1,, ldi ZL,1 ;Z指针指向r1
000088,DFD6,loop2,loop2: rcall EERead_seq ;得到EEPROM数据
00008A,8300,, st Z,r16 ;存储到SRAM
00008C,95E3,, inc ZL
00008E,30EC,, cpi ZL,12 ;到结尾?
000090,F7D9,, brne loop2 ;未完成循环
,,forever,forever:
000092,CFFF,, rjmp forever ;无限循环
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -