📄 24c04.asm
字号:
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 + -