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

📄 sg1.asm

📁 the practice of proteus and avr
💻 ASM
字号:
.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

	rjmp	RESET			;处理复位
EEWrite:				;写EEPROM子程序,r18、r17放写入地址,r16放要写入的数据
	sbic	EECR,01			;如果EEWE不清除
	rjmp	EEWrite			;等待
	out	EEARH,r18		;输出地址
	out	EEARL,r17
	out	EEDR,r16		;输出数据
	sbi	EECR,02		 	;设置EEPROM写选通
	sbi	EECR,01			;该指令需4个时钟周期,由于它暂停CPU2个时钟周期
	ret
EERead:					;读EEPROM子程序,r18、r17放读出地址,r16放读到的数据
	sbic	EECR,01			;如果EEWE不清除
	rjmp	EERead			;等待
	out	EEARH,r18		;输出地址
	out	EEARL,r17
	sbi	EECR,00			;设置EEPROM读选通
	in	r16,EEDR		;读入数据
	ret
EEWrite_seq:				;连续写EEPROM子程序,写入地址(r25、r24)+1,写入的数据放r16
	sbic	EECR,01			;如果EEWE不清除
	rjmp	EEWrite_seq		;等待
	in	r24,EEARL		;得到地址
	in	r25,EEARH
	adiw	r24,0x01		;地址加1
	out	EEARL,r24		;输出地址
	out	EEARH,r25
	out	EEDR,r16		;输出数据
	sbi	EECR,02			;设置EEPROM写选通
	sbi	EECR,01
	ret
EERead_seq:				;连续读EEPROM子程序,读出地址(r25、r24)+1,读到的数据放r16
	sbic	EECR,01			;如果EEWE不清除
	rjmp	EERead_seq		;等待
	in	r24,EEARL		;得到地址
	in	r25,EEARH
	adiw	r24,0x01		;地址加1
	out	EEARL,r24		;输出地址
	out	EEARH,r25
	sbi	EECR,00			;设置EEPROM读选通
	in	r16,EEDR		;读入数据
	ret
	
RESET:					;测试程序
	ldi	r16,$02			;栈指针置初值
	out	SPH,r16
	ldi	r16,$5f
	out	SPL,r16
;*****将aa写入EEPROM的$40地址,再读出来送B口输出*****
	ldi	r16,$ff			;定义B口为输出
	out	DDRB,r16
	ldi	r16,$aa
	ldi	r18,$00
	ldi	r17,$40
	rcall	EEWrite			;存储$aa到EEPROM的$40地址
	ldi	r18,$00
	ldi	r17,$40
	rcall	EERead			;读$40地址
	out	PORTB,r16
;*****以$55、$aa、$55、$aa、...模式填充EEPROM*****
	ldi	r19,16			;初始化循环计数器
	ser	r20			;r20←$FF
	out	EEARH,r20		;EEAR←$FF
	ser	r20			;r20←$FF
	out	EEARL,r20		;EEAR←$FF(start address-1)
loop1:	ldi	r16,$55
	rcall	EEWrite_seq		;写$55到EEPROM
	ldi	r16,$aa
	rcall	EEWrite_seq		;写$aa到EEPROM
	dec	r19			;计数器减1
	brne	loop1			;未完成循环
;*****拷贝EEPROM最前10个字节到r2~r11*****
	ser	r20
	out	EEARH,r20		;EEARH←$FF
	ser	r20			;r20←$FF
	out	EEARL,r20		;EEAR←$FF(start address-1)
	clr	ZH
	ldi	ZL,1			;Z指针指向r1
loop2:	rcall	EERead_seq		;得到EEPROM数据
	st	Z,r16			;存储到SRAM
	inc	ZL
	cpi	ZL,12			;到结尾?
	brne	loop2			;未完成循环
forever:
	rjmp	forever			;无限循环

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -