积分规则 网站地图 帮助中心    
嵌入式软件 单 片 机 DSP 存储器 传感控制 光电显示
嵌入式硬件 CPLD/FPGA SOPC AD/DA 接口电路 模拟设计
I C设计 通信产品 汽车电子 电源产品 消费电子 数控系统
工业控制 军工/航天 安防产品 医疗电子 计算机外设 测试测量
供应 I C
求购 公司库

  IC 求购 销售 公司 论文 DATASHEET 参考设计 论坛
当前位置: 电子技术 >> 嵌入式软件 >> 汇编
  相关分类: LINUX | WINCE | UC/OS | Bootloader | 下载 | VXWORKS | 网络协议 | JAVA | 汇编 | 驱动设计 | Symbian | XP Embedded | Nucleus | 新产品 | 相关文章 | 综合技术 |
以汇编语言完成读写24LCxx系列的EEPROM的实例
 
作者:未知   来源:本站原创    点击数:82   更新时间:2008-7-17
您可以添加到网摘 让更多人关注此文章:

    
;************************************************************************  
;*    																	*
;*     PIC16F877A I2C Master 家Α﹃Α EEPROM 絛ㄒ祘Α		*
;*                                            							*
;* Written by:  Richard Yang                           					*
;*              Sr. Corporate Application Engineer		       			*
;*              Microchip Technology Inc.           					*
;* Date:        Oct. 2nd '2002                       					*
;* Revision:	1.00                                					*
;************************************************************************


;*****************************************************************************************
; This source code provides a demonstration of the MSSP peripheral
; on the PIC16F87x MCU.  
;
;
;***********      The subroutines for EEPROM      *****************
;
;	EE_Random_Read		; EEPROM Random address Read from EEPROM
;	EE_SEQU_Read		; EEPROM Sequential Read form EEPROM
;	EE_Ack_Check		; Polling current status of EEPROM 
;	EE_Page_Write		; Page Write function for EEPROM
;	EE_Byte_Write		; Write a byte to EEPROM with address setting
;
;***********      The subroutines for I2C      *****************
;
;	Init_I2C_Master		; Initial I2C Module for Master Mode , 7-bit address
;	StartI2C		; Send a START Condition !!
;	StopI2C			; Send s STOP Condition
;	RstartI2C		; Send a Repeat Start conditional to I2C
;	Non_Ack			; Send a Non-acknowledge signal to I2C
;	An_Ack			; Send a acknowledge signal to I2C
;	Sebd_Byte		; Send a byte to I2C bus
;	RecI2C	 		; Enable Read a byte form slave device
;	I2C_Done		: Wait the I2C completed the currect process
;
;***************************************************************************************** 

		list p=16f877a
		#include <p16f877a.inc>

;
;***************************************
;       ﹚竡跑计RAM
;
 		CBLOCK	0x20

		I2C_Ctrl	 
		I2C_Addr
		I2C_Data
		I2C_Page_Length
		D_Count
		ENDC
		cblock	0x40
		I2C_Page_Buffer:8
		I2C_SEQU_Buffer:8
		endc
;
;***************************************
;       ﹚竡い耞既竟

w_temp		EQU	0x72
status_temp	EQU	0x73
pclath_temp	EQU	0x74 
;
;***************************************
;       ﹚竡 I2C の竲
;
EEPROM_CMD	equ	0xA0		; Device adress of Slave Point
EE_Read		equ	.1
EE_Write	equ	.0

;
#define 	SCL	PORTC,3		; I2C SCL pin
#define		SDA	PORTC,4		; I2C SDA pin

;

;********************************************
; Locates startup code @ the reset vector
;********************************************
Reset_Addr
			org		0x00
			nop
			goto	Main_Init
;
			org		0x04
			goto	ISR 
;
;***************************************************************************
;****	The Start Address of ISR is 0x004
;****	"PUSH" & "POP" ㄏノ絛ㄒ : 続ノ钩 PIC16F877 ΤSHARE BANK PIC
;***************************************************************************
ISR 	
Push		movwf   w_temp            	; save off current W register contents
			movf	STATUS,w          	; move status register into W register
			movwf	status_temp       	; save off contents of STATUS register
			movf	PCLATH,W
			movwf	pclath_temp
;	 
;        Put your interrupt code here
;
Pop			movf	pclath_temp,W
			movwf	PCLATH
			movf    status_temp,w   	; retrieve copy of STATUS register
			movwf	STATUS           	; restore pre-isr STATUS register contents
			swapf   w_temp,f
			swapf   w_temp,w         	; restore pre-isr W register contents
;
			retfie                   	; return from interrupt	
	 	
 
;----------------------------------------------------------------------

Main_Init   
			pagesel	Init_I2C_Master		; Set PAGE to PCLATH Register 
   			call    Init_I2C_Master		; Init the MSSP for I2C Master 
;
   			banksel	I2C_Ctrl
			movlw	EEPROM_CMD			; Load EEPROM command address @ 0xA0
			movwf	I2C_Ctrl
;
;
Main	
;
;----------------------------------------------------------------------
;
;* 代刚祘Α穦盢舱计(0x40-0x47)糶RMA0x40-0x47竚      
;* ノPage WriteよΑ盢8じ舱戈糶 EEPROM                   
;* 秈︽篈盎代EEPROM琌ЧΘ糶笆程盢糶                   
;* 戈Sequential ReadよΑ眖EEPROM弄ㄓI2C_SEQU_Bufferい     
;

Test_Page_RW
			movlw	0x08
			movwf	I2C_Page_Length
			movlw	I2C_Page_Buffer
_Fill_RAM	movwf	FSR
			movwf	INDF
			incf	FSR,W
			decfsz	I2C_Page_Length,F
			goto	_Fill_RAM
;				
Test_Page_Write
;			banksel	I2C_Ctrl
			movlw	EEPROM_CMD			; Load EEPROM command address @ 0xA0
			movwf	I2C_Ctrl
			movlw	0x10					; Select EEPROM location at 0x00
			movwf	I2C_Addr
			movlw	.8
			movwf	I2C_Page_Length
			call	EE_Page_Write
;
			call	EE_Ack_Check
;
			banksel	I2C_Ctrl
			movlw	EEPROM_CMD			; Load EEPROM command address @ 0xA0
			movwf	I2C_Ctrl
			movlw	0x10
			movwf	I2C_Addr
			movlw	.8
			movwf	I2C_Page_Length
			call	EE_SEQU_Read
;
			goto	$
;
;---------------------------------------------------------
;
;* 代刚祘Α穦糶じ舱戈糶 EEPROM い                
;* 秈︽篈盎代琌ЧΘ糶笆程盢糶                            
;* 戈眖EEPROM弄ㄓI2C_Data既竟い                       
;								
Test_1byte_RW

			banksel	I2C_Ctrl
			movlw	EEPROM_CMD			; Load EEPROM command address @ 0xA0
			movwf	I2C_Ctrl
			movlw	0x00				; Select EEPROM location at 0x00
			movwf	I2C_Addr
			movlw	0xAA				; Write data 0x5A to location 0x00 of EEPROM
			movwf	I2C_Data
			call	EE_Byte_Write	
;
Test2		call	EE_Ack_Check		; Polling Acknowledge for next access
;
			banksel	I2C_Data
			movlw	0x00				; Clear I2C data buffer
			movwf	I2C_Data
;
Test3	
			banksel	I2C_Ctrl
			movlw	EEPROM_CMD			; Load EEPROM command address @ 0xA0
			movwf	I2C_Ctrl
			movlw	0x00
			movwf	I2C_Addr
			call	EE_Random_Read
			;
			goto 	$	
;

;
;******************************************************
;*           Random Read a Byte from EEPROM          
;*
;* Input:
;*  		 - I2C_Ctrl : Control Byte of EEPROM 		 
;*   		 - I2C_Addr : Location of EEPROM		 
;* Output:
;*   		 - I2C_Data : Read Data from EEPROM			 
;******************************************************
;
; Send Command for RANDOM READ : 
; " Start+ 0xA0 + EE_Address + ReStart + 0xA1 + Read_Data + NAck + Stop "
;

EE_Random_Read
 			call	StartI2C		; Set SSPCON2.SEN
;	
			bcf		I2C_Ctrl,0		; set for write Command
			movf	I2C_Ctrl,W		; Send Slave Address to I2C Bus
			call	Send_Byte 
;
			movf	I2C_Addr,W		; Send out the Rendom address of EEPROM	 
			call	Send_Byte 
;
			call	RstartI2C		; Send a Repeat Start to I2C
;
			bsf		I2C_Ctrl,0		; set for Read Command
			movf	I2C_Ctrl,W		; Send Slave Address to I2C Bus
			call	Send_Byte 
;
			call	RecI2C		; Enable I2C Receive 
;
			BANKSEL	SSPBUF
			movf	SSPBUF,W	; Save to I2C_Data First !!	
			movwf	I2C_Data

			call	Non_Ack		; Initial NACK Response !!

			call	StopI2C		; Initial STOP Condition 
			return
;
;***************************************************************
;*                Sequential Read from EEPROM          
;*
;* Input:
;*  		 - I2C_Ctrl : Control Byte of EEPROM 		 
;*   		 - I2C_Addr : Start Location of EEPROM
;*		 	 - I2C_Page_Length : How many byte need to read		 
;* Output:
;*   		 - I2C_SEQU_Buffer : Sequential Read Data buffer 
;*		 
;***************************************************************
;
; Send Command for RANDOM READ : 
; " Start+ 0xA0 + EE_Address + ReStart + 0xA1 + Read_Data + NAck + Stop "
;
EE_SEQU_Read
 			call	StartI2C		; Set SSPCON2.SEN
;	
			bcf		I2C_Ctrl,0		; set for write Command
			movf	I2C_Ctrl,W		; Send Slave Address to I2C Bus
			call	Send_Byte 
;
			movf	I2C_Addr,W		; Send out the Rendom address of EEPROM	 
			call	Send_Byte 
;
			call	RstartI2C		; Send a Repeat Start to I2C
;
			bsf		I2C_Ctrl,0		; set for Read Command
			movf	I2C_Ctrl,W		; Send Slave Address to I2C Bus
			call	Send_Byte 
;
			movlw	I2C_SEQU_Buffer
			movwf	FSR	
;
_Sequ_Loop	call	RecI2C			; Enable I2C Receive 
			BANKSEL	SSPBUF
			movf	SSPBUF,W		; Save to I2C_Data First !!	
			movwf	INDF
			incf	FSR,F
			decfsz	I2C_Page_Length,F
			goto	_Cont_Read
			goto	_End_Read
_Cont_Read	call	An_Ack
			goto	_Sequ_Loop
;
_End_Read	call	Non_Ack			; Initial NACK Response !!
			call	StopI2C			; Initial STOP Condition 
			return
;
;******************************************************
;*              EEPROM Acknowledge Polling
;*          	 
;*   	 --  The routine will polling the ACK		 
;*           response from EEPROM   				 
;*  	 --  ACK=0 return 							 
;*		 --  ACK=1 send Restart & loop check	
;*	 
;******************************************************
;
EE_Ack_Check
 			call	StartI2C		; Set SSPCON2.SEN
 			
			bcf		I2C_Ctrl,0		; Clear for Write Command	
			movf	I2C_Ctrl,W		; Send Slave Address to I2C Bus
			call	Send_Byte 
_Ack_Polling	
			BANKSEL	SSPCON2
			btfss	SSPCON2,ACKSTAT	; Check ACKSTAT bit , 0 = ACK , 1 = NACK
			goto	ACK_Return		; Ack = 0 ; EEPROM is Ready
_Ack_Hi								; Ack = 1 ; EEPROM is Busy for Write
			call	Delay_mS		; Delay 500uS for next Ack polling
			call	RstartI2C		; Send a Repeat Start to I2C
			bcf		I2C_Ctrl,0		; Clear for Write Command
			movf	I2C_Ctrl,W		; Send Slave Address to I2C Bus
			call	Send_Byte 
			goto	_Ack_Polling
	
ACK_Return 
			call	StopI2C			; Initial STOP Condition 
			return
;
;**********************************************************
;*           Page Write 1 to 8 Bytes to EEPROM         
;*
;*  Input: 
;*   		- I2C_Ctrl : Control Byte of EEPROM		 
;*   		- I2C_Addr : Location of EEPROM		 
;*	 	- I2C_Page_Buffer: RAM location of Data	
;*   		- I2C_Page_Length : Data length count	
;*	  
;**********************************************************
;
; Send Command for PAGE WRITE : 
; " Start+ 0xA0 + EE_Address + W_Data 0+ .. + W_Data N + Stop "
;
EE_Page_Write
			movf	I2C_Page_Length,W
			btfsc	STATUS,Z
			return
;			
 			call	StartI2C		; Set SSPCON2.SEN
;	
			bcf		I2C_Ctrl,0		; Clear for Write Command
			movf	I2C_Ctrl,W		; Send Slave Address to I2C Bus
			call	Send_Byte 
;
			movf	I2C_Addr,W		; Send out the Command	 
			call	Send_Byte 
;
			movlw	I2C_Page_Buffer
			movwf	FSR
_W1			movf	INDF,W
			call	Send_Byte 
			incf	FSR,F
			decfsz	I2C_Page_Length,F
			goto	_W1
;
 			call	StopI2C			; Initial STOP Condition 
			return
;
;
;*******************************************************
;*               Write a Byte to EEPROM                
;*
;* Input:
;*  		 - I2C_Ctrl : Control Byte of EEPROM 		 
;*   		 - I2C_Addr : Location of EEPROM		 
;*   		 - I2C_Data : Data to EEPROM
;*			
;*******************************************************
;
; Send Command for BYTE WRITE : 
; " Start+ 0xA0 + EE_Address + Write_Data + Stop "
;
EE_Byte_Write
 			call	StartI2C		; Set SSPCON2.SEN
;	
			bcf		I2C_Ctrl,0		; Clear for Write Command
			movf	I2C_Ctrl,W		; Send Slave Address to I2C Bus
			call	Send_Byte 
;
			movf	I2C_Addr,W		; Send out the Command	 
			call	Send_Byte 
;
			movf	I2C_Data,W		; Send out the Data	
			call	Send_Byte 
;
 			call	StopI2C			; Initial STOP Condition 
			return
;
;**********************************************************************
;
;   As following subroutines perform commonly used I2C functions.
;      You can use these subroutines for your I2C access
;
;**********************************************************************
;
;*** Initial I2Cmodule fot 7-bit I2C Master Mode with 100Kcps @4MHz
;
Init_I2C_Master				 
			BANKSEL	TRISC			; Initial PortC,bit 3 & 4 as Input
 			bsf		SCL				; RC3 = SCL  ,  RC4 = SDA
			bsf		SDA		 
;
 			BANKSEL	PORTC
 			bsf		SCL				; SCL = Hi
 			bsf		SDA 			; SDA = Hi
;
			movlw	b'00101000'		; I2C Master Mode, Clock Rate: FOSC/(4*SSPADD+1)
			movwf	SSPCON			; 
;
        	banksel SSPADD
	        movlw   .9             	; This gives 100KHz I2C clock @ 4MHz
			movwf   SSPADD			; (4MHz/4) / (9+1)= 100KHz
;
     		movlw   b'10000000'     ; Disable slew rate control,
        	movwf   SSPSTAT			; and clear status bits
;
 	        movlw   b'00000000'     ; Set SCL,SDA into Ready status
        	movwf   SSPCON2          
;     
			return
;
;******   Send START condition to bus   *******
;
StartI2C				; Initiate the I2C START condition.
   	   		banksel SSPCON2
     	   	bsf     SSPCON2,SEN
     	  	goto	I2C_Done
;
;******   Send STOP condition to bus   *******
;
StopI2C				 
      		banksel SSPCON2
        	bsf     SSPCON2,PEN
        	goto	I2C_Done
;
;******   Send RESTART condition to bus   *******
;      
RstartI2C			 
        	banksel SSPCON2
        	bsf     SSPCON2,RSEN
        	goto	I2C_Done
;
;******   Send a Non-Acknowledge status to bus (ACK=1)    *******
;        
Non_Ack
        	banksel SSPCON2
        	bsf     SSPCON2,ACKDT    ; Set the ACK bit
        	bsf     SSPCON2,ACKEN    ; Initiate the NACK sequence.
        	goto	I2C_Done
;
;******   Send an Acknowledge status to bus (ACK=0)     *******
;         
An_Ack
       	 	banksel SSPCON2
        	bcf     SSPCON2,ACKDT    ; Clear the ACK bit
        	bsf     SSPCON2,ACKEN    ; Initiate the NACK sequence.
        	goto	I2C_Done
;
;******   Send data to I2C bus from Wreg.     *******
; 
Send_Byte
			banksel	SSPBUF
			movwf	SSPBUF
			goto	I2C_Done
;
;******   Enable I2C Receive for Master Mode     *******
; 
RecI2C
      		banksel SSPCON2          
        	bsf     SSPCON2,RCEN    ; Set the receive enable bit.
			goto	I2C_Done
;
;******  Check the I2C stage is completed   ********
; 
I2C_Done
	       	banksel PIR1
 			btfss   PIR1,SSPIF	; Poll for SSPIF
        	goto    $-1
        	bcf     PIR1,SSPIF
        	return
;
Delay_mS
			banksel	D_Count
			movlw	.124			; Load .5mS Dealy Value
 			movwf	D_Count			 
_D_mS		nop
			decfsz	D_Count,F		 
			goto	_D_mS		
			return					     
;
; *********** End Of Program !!!!!
;
			end


相关文章
· AVR内部EEPROM读写范例[84]
· 基于NiosII的SOPC中EEPROM Controller Core的设计[239]
· 单片机实现对CF卡的读写[94]
· 一种基于单片机和串行EEPROM的智能密码锁[187]
· I2C串行EEPROM应用系统的健壮性设计[407]
热门评论排行
·VHDL设计中电路简化问题的
·江苏嵌入式Linux教育培训
·锐极LINUX驱动培训班定于
·基于实时操作系统μC/OS-
·ARM处理器应用开发4步骤

文章评论
    没有任何评论
*只显示最新10条评论。评论内容只代表网友观点,与本站立场无关。更多评论
发表评论
  * 请先[登陆]再进行评论,谢谢。
评分: 1分 2分 3分 4分 5分
内容: *
发帖须知:
一.所发文章必须遵守《互联网电子公告服务管理规定》;
二.严禁发布供求代理信息,公司介绍,产品信息等广告宣传信息;
三.严禁恶意重复发帖;
四.严禁对个人,实体,民族,国家等进行漫骂,污蔑,诽谤。
 
热点新闻 [更多]
 
Hitachi Elect
中国芯片供需缺口达七成
西班牙研发出视觉鼠标 眨眼
首条OLED生产线昆山投产 
宇航服电子元器件:航天员的“生命保护
美研发出可卷曲太阳能电池
美国研发嗅觉感受器获新进展 
首尔半导体就日亚(NICHIA)专利
MIPS 科技授权国家集成
美国微芯科技公司与安森美半导体拟以每
 
热门下载 [更多]
 
[ PCB设计] Protel99教程下载
[ ] 手把手学单片机20个例
[ ] 单片机做的智能台灯
[ ] 单片机入门书
[ ] linux系统移植开发文档
[ ] IC卡的读写程序
[ ] 8051单片机C语言彻底应用
[ 常用软件] 555定时器电路设计软件V1.2
[ 常用软件] 51定时器计算软件
[ ] ARM处理器应用开发4步骤
 
论坛新帖 [更多]
 
Agilent代理商 0755...
AD代理商 0755-8832...
Actel代理商 0755-8...
嵌入式系统免费网上学习!...
ARM与uClinux...
ARM与uClinux...
NORDIC最新推出nRF24...
网络摄像机技术的调试与测试...
对于新人,为什么公司不再会成为...
[转帖]低价销售各种数码相机,...

 
赞助商 [更多]
 

ICP许可证号:[粤 05056597]
联系电话:010-82517432 82517615 传真: 010-82517615

版权所有 Copyright © 2006 嵌入式技术网