⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sg1.sdi

📁 基于PROTERUS仿真的AVR例子
💻 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 + -