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

📄 rwe2.asm

📁 我自己编写的SPI访问EEPROM的25AA045源代码
💻 ASM
字号:
            LIST    p=16F877A
            #include "P16F877A.INC" 
RXDATA 	EQU 24H			;定义接收数据单元
TXDATA	EQU 25H			;定义发送数据单元
temp_1	EQU	26H	
temp_2	EQU 27H			
HIBYTE 	EQU 29H			;命令高字节暂存单元
LOBYTE 	EQU 2AH			;命令低字节暂存单元	
DATBYT 	EQU 2BH			;数据暂存单元
STATUR 	EQU 40H			;
DATAVAL EQU 33H			;定义数据常数值
CS 		EQU 0			;片选引脚信号
SDI 	EQU 4			;发送引脚信号

      	ORG 	0H
      	nop
	 	goto 	START
	  	nop
	  	nop
	  	ORG 	0004H
START 
		bcf 	STATUS,RP0
      	bsf 	STATUS,RP0
      	movlw 	10H					;设置C口
      	movwf 	TRISC
     	movlw 	00H
      	movwf 	FSR
xxx
     	bcf 	STATUS,RP0
     	movlw	B'00100001'			;发送使能位
      	movwf 	SSPCON
      	call 	EWEN
			
      	movlw 	B'00000010'			;命令位“010”写命令
      	movwf 	HIBYTE
      	movlw 	DATAVAL				;数据
      	movwf 	DATBYT
		call 	WRITE
;		goto	$
		call	delay_20ms
WRNEXT 	
		
		bcf		STATUS,RP0
		call	EWEN
		movlw	B'00000010'
		movwf	HIBYTE
		movlw	20h
		movwf	FSR
		movlw	99h
		movwf	DATBYT
		call	WRITE

		
;		call	delay_20ms
;		call	WRITE
;		call	delay_20ms
;		call	WRITE
       	nop
       	nop
		GOTO	$
       	btfsc 	FSR,4
		goto	WRNEXT

;读回数据
       	movlw 	30H
       	movwf 	FSR
       	movlw 	10H
       	movwf 	LOBYTE
       	movlw 	B'00000011'			;命令位“011”读命令	
       	movwf 	HIBYTE
RDNEXT 
	   	bcf 	STATUS,RP0
      	movlw 	B'00100001'
      	movwf 	SSPCON
      	call 	EWEN
		nop
		nop
		nop
		nop
;	call	delay_20ms
		call READ
       	nop

       	btfsc FSR,4
       	goto RDNEXT
LIMBO 
		nop
      	goto LIMBO
           
;/*********************
;写使能
;/**********************
EWEN 
		bcf 	STATUS,RP0
     	bcf 	PORTC,CS
     	movlw 	B'00000110'
     	call 	OUTPUT
		nop
;		call	delay_20ms
     	bsf 	PORTC,CS
     	return


;/**********************
;读状态寄存器
;入口:无
;出口:读出的状态在STATUR中
;/**********************
RDSR 	
		bcf 	STATUS,RP0
     	bcf 	PORTC,CS
     	movlw B'00000101' 
     	call 	OUTPUT
     	bsf 	PORTC,CS
     	movf 	RXDATA,0
     	movwf 	STATUR
     	return
;/***********************
;写一字节
;入口:"写命令码"在HIBYTE中,EEPROM地址指针在FSR中
;待写数据字节在DATBYT中
;出口:FSR指向下一地址
;/***********************
WRITE 
		bcf 	STATUS,RP0
      	bcf 	PORTC,CS		;片选
      	movf 	HIBYTE,0		;写命令
      	call 	OUTPUT
      	movf 	FSR,0			;送地址
      	call 	OUTPUT
      	movf 	DATBYT,0		;送数据
      	call 	OUTPUT

;	  call	delay_20ms
 	    bsf 	PORTC,CS
      	incf 	FSR
      	return
;******************************************
;读一字节
;入口:读命令在HIBYTE,EEPROM地址在LOBYTE,
;单片机RAM地址在FSR
;出口:RAM单元放入一数据,LOBYTE加1,FSR加1
;******************************************

READ 
		bcf 	STATUS,RP0
     	bcf 	PORTC,CS
 ;    bsf SSPCON,CKP
     	movf 	HIBYTE,0
     	call 	OUTPUT
     	movf 	LOBYTE,0
     	call 	OUTPUT 
     	bcf 	SSPCON,CKP
     	movlw 	0
     	call 	OUTPUT
     	bsf 	PORTC,CS
     	movf 	RXDATA,0
     	movwf 	INDF
     	incf 	FSR
     	incf 	LOBYTE
     	return

;/**********************
;同时发送和接收一字节
;入口:待发送数据在W中
;出口:收到数据在RXDATA
;/***********************
OUTPUT 
		movwf 	SSPBUF
LOOP1  
		bcf 	STATUS,RP1
       	bsf 	STATUS,RP0
       	btfss 	SSPSTAT,BF
       	goto 	LOOP1
       	bcf 	STATUS,RP0
       	movf 	SSPBUF,0
       	movwf 	RXDATA
       	return

delay_20ms
		banksel	temp_1
		movlw	0xff
		movwf	temp_1
		movlw	0x7
		movwf	temp_2

		decfsz	temp_1,f
		goto	$-1
		decfsz	temp_2,f
		goto	$-3
		return
	end























 

⌨️ 快捷键说明

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