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

📄 24c04.asm

📁 pic16f73汇编程序 对24C04卡操作
💻 ASM
📖 第 1 页 / 共 2 页
字号:

		list	p=16c73
		include"sx3200.inc"

                org	0000h

;子程序文件名:write_eeprom(loca8在bank0,1)
;实现功能:带crc写外部数据ee(24c0x)子程序
;版本:
;作者:
;日期:
;测试人员:
;测试日期:
;测试文件:
;修改说明:
;程序所属区块:page0
;入口参数:
;	 loca5------------------>要写的数据e2prom页地址
;	 loca6------------------>要写的数据e2prom页内地址(为0)
;	 loca7------------------>要写的数据个数(不包括crc)
;	 loca8------------------>要写的数据存放的ram首地址
;	 rp0=rp1=0
;出口参数:
;        logic_status------------> 1 fail; 0 success
;	 rp0=rp1=irp=0
;影响的局部寄存器:loca0~loca4,loca9,ee_buffer
;影响的全局寄存器:io_data,io_addr
;堆栈深度:3级
;执行时间:写16字节8.3ms+7.7ms;写6字节3.3ms+7.7ms
;调用的程序:crcgenerator(1),copydata(1),iic_writedata(2),iic_readdata(2),comparedata(1)
;特殊说明:loca5~loca8保持不变;写n字节数据,将写n+2字节,自动加上2字节crc;页内地址固定为0
;=============================================================================================
write_eeprom:
		bcf	intcon,gie
		btfsc	intcon,gie
		goto	$-2

      		bsf	logic_status
      		movf	loca5,w
      		sublw	.31			;512字节的数据ee,即32页(32*16byte)
      		btfss	status,c
		return
      		movf	loca7,w
		sublw	.14			;最大写的数据长度为14字节(不包括才crc)
		btfss	status,c
		return

		movlw	repeat_count
		movwf	loca9

		movf    loca8,w
		movwf   loca0
		movlw   ee_buffer
		movwf   loca1
		movf	loca7,w
		call    copydata		;复制要写的数据到ee_buffer

		movf	loca7,w
		movwf	loca0			;计算长度
		movlw	ee_buffer
		movwf	fsr
		call	crcgenerator		;计算crc
		movf	loca1,w
		movwf	indf
		incf	fsr,f
		movf	loca2,w
		movwf	indf

write_eeprom_again:
		call	iic_writedata		;把ee_buffer里的数据写到24c04
		btfsc	status,c
		goto	write_eeprom_error

		movlw	.10			;写延时,数据ee的写大约5ms
		movwf	loca0
		clrf	loca1
		decfsz	loca1,f
		goto	$-1			;256×3=768us
		decfsz	loca0,f
		goto	$-4			;(768+4)*10=7.7ms

		call	iic_readdata		;读24c04里的数据到ee_buffer+10h
		btfsc	status,c
		goto	write_eeprom_error

		movlw	ee_buffer
		movwf	loca0
		movlw	ee_buffer+10h
		movwf	loca1
		movf	loca7,w
		addlw	02h
		call	comparedata		;比较数据
		btfss	status,z
		goto	write_eeprom_error
		bcf	logic_status
		bsf	intcon,gie
		return

write_eeprom_error:
                decfsz  loca9,f
		goto	write_eeprom_again
		bsf	intcon,gie
		return
;=============================================================================================
;子程序文件名:read_eerpom(loca8在bank0,1)
;实现功能:带crc读外部数据ee(24c0x)子程序
;版本:
;作者:
;日期:
;测试人员:
;测试日期:
;测试文件:
;修改说明:
;程序所属区块:page0
;入口参数:
;	 loca5------------------->要读的数据e2prom页地址
;	 loca6------------------->要读的数据e2prom页内地址(为0)
;	 loca7------------------->要读的数据个数(不包括crc)
;	 loca8------------------->读出的数据存放的ram首地址
;	 rp0=rp1=0
;出口参数:
;        logic_status------------> 1 fail; 0 success
;	 rp0=rp1=irp=0
;影响的局部寄存器:loca0~loca4,loca9,ee_buffer
;影响的通用寄存器:io_data,io_addr,loca8指向的n字节的数据
;堆栈深度:3级
;执行时间:读16字节8.9ms
;调用的程序:crcgenerator(1),copydata(1),iic_readdata(2),comparedata(1)
;特殊说明:loca5~loca8保持不变,读n字节,将返回n+2字节,即使该页的crc错误也会把错误的crc读出;页内地址固定为0
;=============================================================================================
read_eeprom:
		;bcf	intcon,gie
		;btfsc	intcon,gie
		;goto	$-2

		bsf	logic_status
		movf	loca5,w
      		sublw	.31			;512字节的数据ee,即32页(32*16byte)
      		btfss	status,c
		return
		movf	loca7,w
		sublw	.14			;最大读的数据长度为14字节(不包括才crc)
		btfss	status,c
		return

		movlw	repeat_count
		movwf	loca9
read_eeprom_again:
		call	iic_readdata		;读24c04里的数据到ee_buffer+10h

		movlw	ee_buffer+10h
		movwf	loca0
		movlw   ee_buffer
		movwf   loca1
		movf    loca7,w
		addlw	02h
		call    copydata		;复制到ee_buffer

		movlw	ee_buffer+10h
		movwf	loca0
		movf    loca8,w
		movwf   loca1
		movf    loca7,w
		addlw	02h
		call    copydata		;再复制到ram数据区,不管对错

		call	iic_readdata		;再次读24c04里的数据到ee_buffer+10h
		btfsc	status,c
		goto	read_eeprom_error

		movlw	ee_buffer+10h
		movwf	loca0
		movlw   ee_buffer
		movwf   loca1
		movf	loca7,w
		addlw	02h
		call	comparedata		;比较数据
		btfss	status,z
		goto	read_eeprom_error

		movf	loca7,w
		addlw	02h
		movwf	loca0			;计算长度
		movlw	ee_buffer		;必须是ee_buffer,不能是ee_buffer+10h,否则在计算16字节crc时回溢出
		movwf	fsr
		call	crcgenerator		;计算crc
		movf	loca1,w
		btfss	status,z
		goto	read_eeprom_error
		movf	loca2,w
		btfss	status,z
		goto	read_eeprom_error
		bcf	logic_status
		;bsf	intcon,gie
		return
read_eeprom_error:
		decfsz  loca9,f              	;错误次数减1
		goto    read_eeprom_again
		;bsf	intcon,gie
		return
;=======================================================================================
;子程序文件名:iic_writedata
;实现功能:    把ee_buffer里的数据写道24c0x里面
;版本:
;编写人:
;编写日期:
;测试人:
;测试通过日期:
;测试文件:
;更改记录:
;程序所属区块:page0
;入口参数:loca5---页地址
;	  loca7---字节数
;	  rp0=rp1=irp=0
;出口参数:rp0=rp1=irp=0
;影响的局部寄存器:loca0~loca4
;影响的通用寄存器:
;堆栈深度:2级
;执行时间:(0.5+0.18*n)ms,写16字节需要3.38ms,写3次需要10ms
;调用的程序:get_wordaddress(1),iic_start(1),iic_dataout(1),iic_stop(1)
;特殊说明:改变电平在时钟的低电平,读电平在时钟的高电平;空闲的时候sda为高(输入),scl为高(始终输出)
;========================================================================================
iic_writedata:
		bsf	status,rp0
		bcf	port_wp
		bcf	status,rp0

		call	iic_delay
		bcf	port_wp

		movlw	repeat_count
		movwf	loca4			;写错误最大次数

		movf	loca5,w
		call	get_wordaddress
		movwf	loca3			;暂存字节地址
iic_write_again:
		movf	loca7,w
		addlw	02h
		movwf	loca2			;需要写的字节数

		call	iic_start		;iic总线上产生起始位

		movlw	b'10100000'
		btfsc	loca5,4
		movlw	b'10100010'
		call	iic_dataout		;发送设备号+写
		btfsc   status,c
		goto	iic_write_error

        	movf	loca3,w
		call	iic_dataout		;发送字节地址
		btfsc   status,c
		goto	iic_write_error

		movlw	ee_buffer
		movwf	fsr
iic_writedata_loop:
		movf	indf,w
		call	iic_dataout		;发送当前字节
        	btfsc   status,c
		goto	iic_write_error
		incf	fsr,f
		decfsz	loca2,f
		goto	iic_writedata_loop

		call 	iic_stop		;iic总线上产生停止位
		bcf	status,c
		return
iic_write_error:
		call 	iic_stop		;iic总线上产生停止位
		decfsz	loca4,f
		goto	iic_write_again
		bsf	status,c
		return
;=======================================================================================
;子程序文件名:iic_readdata
;实现功能:    读24c0x里的数据到ee_buffer+10h
;版本:    1.0
;编写人:
;编写日期:
;测试人:
;测试通过日期:
;测试文件:
;更改记录:
;程序所属区块:page0
;入口参数:loca5---页地址
;	  loca7---字节数
;	  rp0=rp1=irp=0
;出口参数:rp0=rp1=irp=0
;影响的局部寄存器:loca0~loca4
;影响的通用寄存器:
;堆栈深度:2级
;执行时间:(0.5+0.19*n)ms,读16字节需要3.54,读3次需要11ms
;调用的程序:set_ram(1),get_wordaddress(1),iic_start(1),iic_datain(1),iic_stop(1),iic_ackout(1),ic_nackout(1)
;特殊说明:
;========================================================================================
iic_readdata:
		bsf	status,rp0
		bcf	port_wp
		bcf	status,rp0

		call	iic_delay
		bsf	port_wp

		movlw	ee_buffer+10h
		movwf	fsr
		movlw	.16
		call	set_ram			;先把缓存区里的数据设置成0ffh

		movlw	repeat_count
		movwf	loca4			;读错误最大次数

		movf	loca5,w
		call	get_wordaddress 	;影响loca0~loca1
		movwf	loca3			;暂存字节地址
iic_read_again:
		movf	loca7,w
		addlw	02h
		movwf	loca2			;需要写的字节数

		call	iic_start		;iic总线上产生起始位

		movlw	b'10100000'
		btfsc	loca5,4
		movlw	b'10100010'
		call	iic_dataout		;发送设备号+写
		btfsc   status,c
		goto	iic_read_error

        	movf	loca3,w
        	call	iic_dataout		;发送字节地址
		btfsc   status,c
		goto	iic_read_error

		call	iic_restart		;产生重复起始位

		movlw	b'10100001'
		btfsc	loca5,4
		movlw	b'10100011'
		call	iic_dataout		;发送设备号+读
		btfsc   status,c
		goto	iic_read_error

		movlw	ee_buffer+10h
		movwf	fsr
iic_readdata_loop:
		call	iic_datain
		movf	loca0,w
		movwf	indf
		incf	fsr,f
		movlw	.1
		subwf	loca2,w
		btfss	status,z
		call	iic_ackout		;主器件发出应答位
		decfsz	loca2,f
		goto	iic_readdata_loop

		call	iic_nackout		;主器件发出非应答位
		call	iic_stop
		bcf	status,c
		return

iic_read_error:
		call	iic_stop
		decfsz	loca4,f
		goto	iic_read_again
		bsf	status,c
		return
;==========================================================================
iic_start:;iic总线上产生起始位
		bsf	status,rp0
		bcf	port_sda		;设置为输出方式
                bcf     port_scl
		bcf	status,rp0
		call	iic_delay
		bsf	port_sda
		call	iic_delay
		bsf	port_scl
		call	iic_delay		;起始位启动和保持为6个周期
		bcf     port_sda		;scl=1时sda由1变成0,起始位产生
		call	iic_delay
		bcf	port_scl
		return				;起始位结束返回
;==========================================================================
iic_restart:;iic总线上产生重复起始位
		bsf	status,rp0
		bcf	port_sda		;设置为输出方式
                bcf     port_scl		;设置为输出方式
		bcf	status,rp0
		call	iic_delay
		bcf	port_scl
		bsf	port_sda		;在scl=0时sda=1,保证不出现停止位
		call	iic_delay
		bsf	port_scl
		call	iic_delay
		bcf	port_sda		;scl=1时sda由1变成0,重复起始位产生
		call	iic_delay
		bcf	port_scl		;时钟变为低电平

⌨️ 快捷键说明

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