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

📄 24c04.asm

📁 pic16f73汇编程序 对24C04卡操作
💻 ASM
📖 第 1 页 / 共 2 页
字号:
		return
;==========================================================================
iic_stop:;iic总线上产生停止位
		bsf	status,rp0
		bcf	port_sda		;设置为输出方式
                bcf     port_scl		;设置为输出方式
		bcf	status,rp0
		call	iic_delay
		bcf	port_sda
		call	iic_delay
		bsf	port_scl		;时钟变为高电平
		call	iic_delay
		bsf	port_sda		;在scl=1时sda由0变成1,停止位产生
		bsf	status,rp0
		bsf	port_sda		;设置为输入方式,主器件释放sda线
		bcf	status,rp0
		return
;===========================================================================
iic_dataout:;写1字节数据到从器件,同时检测从器件的应答,执行时间约185us
		movwf	loca0			;暂存要发送的数据
		movlw	08h
		movwf	loca1			;发送8bit,首先发送高bit
		bsf	status,rp0
		bcf	port_sda		;设置为输出方式
		bcf	status,rp0
bitout:
		call	iic_delay
		btfss   loca0,7
		bcf	port_sda
		btfsc   loca0,7
		bsf	port_sda
		call	iic_delay
		bsf     port_scl		;产生时钟上升沿
		call	iic_delay
		bcf     port_scl		;产生时钟下降沿,1位传输结束
		rlf     loca0,f			;循环左移
		decfsz  loca1,f
		goto    bitout

		bsf	status,rp0
		bsf	port_sda		;设置为输入方式,主器件释放sda线
		bcf	status,rp0
		call	iic_delay
		bsf	port_scl		;时钟变为高电平
		call	iic_delay
		bcf	status,c
		btfsc	port_sda
		bsf	status,c
		bcf	port_scl		;时钟变为低电平
		return				;一次发送过程结束

;==========================================================================
iic_datain:;i2c读ee一字节数据,执行时间约195us
		bsf	status,rp0
		bsf	port_sda		;设置为输入方式,主器件释放sda线
		bcf	status,rp0
		movlw	08h
		movwf	loca1			;接收8bit,首先接收高bit
bitin:
		call	iic_delay
		rlf	loca0,f
		bsf	port_scl		;主器件产生上升沿,从器件输出数据
		call	iic_delay
		bcf	loca0,0
		btfsc	port_sda
		bsf	loca0,0
		call	iic_delay
		bcf	port_scl		;时钟结束
		call	iic_delay
		decfsz	loca1,f
		goto	bitin
		return
;==========================================================================
iic_ackout:;主器件发出应答位
		bsf	status,rp0
		bcf	port_sda		;设置为输出方式
		bcf	status,rp0
		call	iic_delay
		bcf	port_sda		;sda=0
		call	iic_delay
		bsf	port_scl		;时钟产生上升沿
		call	iic_delay
		bcf	port_scl		;时钟结束
		return

;==========================================================================
iic_nackout:;主器件发出非应答位
		bsf	status,rp0
		bcf	port_sda		;设置为输出方式
		bcf	status,rp0
		call	iic_delay
		bsf	port_sda		;sda=1
		call	iic_delay
		bsf	port_scl		;时钟产生上升沿
		call	iic_delay
		bcf	port_scl		;时钟结束
		return

;===========================================================================
iic_delay:
		goto	$+1
		goto	$+1
		goto	$+1
		goto	$+1
		goto	$+1
		goto	$+1
iic_delay_1:
		goto	$+1
		goto	$+1
		return

;===========================================================================
get_wordaddress:;得到字节的地址,地址为16*loca5
		movwf	loca0
		btfsc	status,z
		return

		clrf	loca1
get_address_loop:
		movlw	.16
		addwf	loca1,f
		decfsz	loca0,f
		goto	get_address_loop
		movf	loca1,w
		return

;============================================================================
;子程序文件名:copydata
;实现功能:ram中拷贝块数据
;功能:拷贝数据从loca0 到 loca1,长度为loca2
;版本:
;作者:
;日期:
;测试人员:
;测试日期:
;测试文件:
;修改说明:
;程序所属区块:page0
;入口参数:
;	loca0---------------源ram地址指针,
;       loca1---------------目的ram地址指针,
;       loca2---------------长度
;	rp0=rp1=0,irp随意
;出口参数:
;	rp0=rp1=irp=0
;影响的局部寄存器:loca0~loca3
;影响的通用寄存器:无
;执行时间	:(19*n)μs
;堆栈级数	:1
;说明		:loca0 --> loca1(len=loca2)
;=============================================================================
copydata:					;拷贝数据
		movwf	loca2

		movf	loca2,w
		btfsc	status,z
		return
		sublw	20h
		btfss	status,c
		return
copydata_next:					;继续拷贝下一个字节
		movf	loca0,w
		movwf	fsr
		movf	indf,w			;将ram中数据存到loca3
		movwf	loca3
		movf	loca1,w
		movwf	fsr
		movf	loca3,w
		movwf	indf
		incf	loca0,f
		incf	loca1,f
		decfsz	loca2,f
		goto	copydata_next
		return

;=====================================================================
;crc生成子程序crcgenerator
;功能: 将一串二进制数据加上crc校验码
;版本:
;作者:
;日期:
;测试人员:
;测试日期:
;测试文件:
;修改说明:
;程序所属区块:page0
;入口参数:
;	fsr是待编码的数据首地址
;	loca0是待编码的数据的字节数(不包括crc)
;	rp0=rp1=0;irp确定的fsr区域标记
;返回参数:
;	loca1是crc低字节(先发送)
;	loca2是crc高字节(后发送)
;	rp0=rp1=0;fsr指向数据区末尾(应填入crc的地址)
;影响的局部寄存器:loca0~loca4
;影响的通用寄存器:无
;执行时间:	  设编码比特数为n,则执行时间约为(15*n+14)us
;堆栈级数:	  1级
;说明:
;====================================================================
crcgenerator:
		movf    loca0,w
		addwf   fsr,f
		clrf    indf
		incf    fsr,f
		clrf    indf
		decf    fsr,f
		movf    loca0,w
		subwf   fsr,f

		bcf	status,c
		rlf	loca0,f
		rlf	loca0,f
		rlf	loca0,f		;数据区预留crc的位置并清零


		movf    indf, w     	;loca1, loca2, loca3暂存连续的三个字节
		movwf   loca1
		incf    fsr, f
		movf    indf, w
		movwf   loca2
		incf    fsr, f
		movf    indf, w
		movwf   loca3
		movlw   8
		movwf   loca4

crcloop1:
		rrf     loca3,f
		rrf     loca2,f
		rrf     loca1,f
		btfss   status,c   	;检测c标志
		goto    crccont1
		movlw   084h        	;b'10000100'
		xorwf   loca2,f
		movlw   08h		;b'00001000'
		xorwf   loca1,f
crccont1:
		decfsz  loca4,f
		goto    crccont2
		movlw   8
		movwf   loca4
		incf    fsr,f
		movf    indf,w
		movwf   loca3
crccont2:
		decfsz  loca0,f
		goto    crcloop1

		decf    fsr,f		;调整fsr至正确值
		decf    fsr,f
		return

;===============================================================================
;子程序文件名:computercs
;功能:计算n字节的cs
;版本:
;作者:
;日期:
;测试人员:
;测试日期:
;测试文件:
;修改说明:
;程序所属区块:page0
;入口:fsr首地址,w字节数
;	 rp0=rp1=0, irp决定数据所在bank
;返回:w(cs)
;	 rp0=rp1=0,不影响irp
;影响的局部寄存器:loca0~loca1
;影响的通用寄存器: 无
;堆栈深度:1级
;程序执行时间:(5+6*n)us
;调用的子程序:无
;特殊说明:
;===============================================================================
computercs:					;其他程序调用的CS计算程序,IRP在入口处定好;
		movwf	loca0			;字节数
		clrf	loca1
compcsloop:
		movf	indf,w
		addwf	loca1,f
		incf	fsr,f
		decfsz	loca0,f
		goto	compcsloop
		movf	loca1,w
		return
;===============================================================================
;子程序文件名:compare_data
;实现功能:比较数据大小
;版本:
;作者:
;日期:
;测试人员:
;测试日期:
;测试文件:
;修改说明:
;程序所属区块:page0
;入口参数:
;	loca0---------------源ram地址指针,
;       loca1---------------目的ram地址指针,
;       w-------------------长度
;	rp0=rp1=0
;出口参数:
;	z=0-----------------数据相等
;	c=1-----------------(loca0)>(loca1)
;	c=0-----------------(loca0)<(loca1)
;	rp0=rp1=0
;影响的局部寄存器:loca0~loca3
;影响的通用寄存器:无
;执行时间	(18*n)us
;堆栈级数	:1
;说明		:数据是高字节在前,从高字节开始比较
;=============================================================================
comparedata:
		movwf	loca2
comparedata_lp1:
                movf	loca0,w
		movwf	fsr
		movf	indf,w
		movwf	loca3
		movf	loca1,w
		movwf	fsr
		movf	indf,w
		subwf	loca3,w			;(loca0)-(loca1)
		btfss	status,c
		goto	comparedata_le		;(loca0)<(loca1)
		btfss	status,z
		goto	comparedata_gt		;(loca0)>(loca1)
		incf	loca0,f
		incf	loca1,f
		decfsz	loca2,f
		goto	comparedata_lp1
		bsf	status,z
		return
comparedata_le:
comparedata_gt:
		return
;===============================================================================
;子程序文件名:clear_ram
;功能:清ram
;版本:
;作者:
;日期:
;测试人员:
;测试日期:
;测试文件:
;修改说明:
;程序所属区块:page0
;入口:		fsr首地址
;		w字节数
;		rp0=rp1=0,irp决定数据所在bank
;返回:		入口rp0=rp1=0
;影响的局部寄存器:loca0
;影响的通用寄存器: 无
;堆栈深度:1级
;程序执行时间:(5*n+2)us
;调用的子程序:无
;特殊说明:
;===============================================================================
clear_ram:
		movwf	loca0					;字节数
		clrf	indf
		incf	fsr,f
		decfsz	loca0,f
		goto	$-3
		return

;===============================================================================
;子程序文件名:set_ram
;功能:设置ram成0ffh
;版本:
;作者:
;日期:
;测试人员:
;测试日期:
;测试文件:
;修改说明:
;程序所属区块:page0
;入口:		fsr首地址
;		w字节数
;		rp0=rp1=0,irp决定数据所在bank
;返回:		入口rp0=rp1=0
;影响的局部寄存器:loca0
;影响的通用寄存器: 无
;堆栈深度:1级
;程序执行时间:(6*n+2)us
;调用的子程序:无
;特殊说明:
;===============================================================================
set_ram:
		movwf	loca0					;字节数
		movlw	0ffh
		movwf	indf
		incf	fsr,f
		decfsz	loca0,f
		goto	$-4
		return
		end

⌨️ 快捷键说明

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