📄 i2c.a
字号:
/*
I2C_CLK=P1^3; //IC卡时钟
I2C_DAT=P1^4; //IC卡数据位
I2C_Power_Control=P2^5; //IC上电
Insert_Card=P3^2; //检测是否有卡插入
*/
;extrn data(Driver_Code)
org 00h
sjmp M_rute
org 03h
ajmp M_rute
M_rute:
PUSH acc
push 00h
push 01h
push 02h
push 03h
push 04h
push 05h
push 06h
push 07h
PUSH PSW
/*
star: MOV C,P3.2
JC star
MOV R0,#0FFH
LOP1: MOV R1,#0FFH
LOP2: DJNZ R1,LOP2 ;延时5ms
DJNZ R0,LOP1
MOV C,P3.2
JC star ;再次判断
*/
CLR P1.3 ;CLK=0
mov r0,#0FFH
DK: DJNZ R0,DK ;延时几ms,使的端口逻辑稳定。
SETB P2.5 ;上电
setb P1.4 ;DAT=1;
lcall start_bus
mov a,#0a0h ;发送器件地址
WR1: lcall SendByte
jc WR1 ;没有应答信号则退出。
WR3: mov a,#02h ;发送RAM 地址
lcall SendByte
jc WR3 ;没有应答信号则退出。
lcall start_bus ;再次启动I2C总线
WR5: mov a,#0a1h ;发送读信号
call SendByte
jc WR5 ;没有应答信号则退出。
;--------------------------------------------------------------------------------------------
;------------------------以下为接收数,用R1接收数据---------------------------------------------
mov a,#00h
mov r3,#03h ;r3为大循环次数,r4为存放地址
mov r0,#05h
big_lop: clr c
clr p1.3 ;CLK=0
setb p1.4 ;DAT=1,初始化PIO
mov r2,#08
shl_L: CLR P1.3 ;clk=0
NOP
NOP
NOP
setb p1.3 ;clk=1
LCALL Delay_Rute ;延时
MOV C,P1.4
rlc A ;存数
nop
NOP
NOP
djnz r2,shl_L
;-------------------接收完一个数-----------------------------------------
mov @r0,A
INC R0
nop
nop
clr p1.4 ;DAT=0 发出应答ACK信号
LCALL Delay_Rute ;延时
setb p1.3 ;clk=1
lcall Delay_rute
clr p1.3
nop
nop
SETB P1.4
djnz r3,big_lop
;------------------------------接收完三个数,然后发送停止信号----------------------------
clr p1.3 ; CLK=0
clr p1.4 ; DAT=0
setb p1.3 ; clk=1 //结束条件建立时间大于4us
call Delay_Rute
setb p1.4 ; DAt=1发送I2C总线结束命令
call Delay_Rute
clr p1.3
sjmp exit ;退出中断服务程序
;----------启动总线函数-----------------------
start_bus:
SETB P1.4 ; I2C_DAT=1
NOp
SETB P1.3 ;I2C_CLK=1
CALL Delay_Rute ;起始建立时间大于4.7us
CLR P1.4 ;发送起始信号 I2C_DAT=0
CALL Delay_Rute
CLR P1.3 ;钳位 I2C_CLK=0
CALL Delay_Rute
ret
/****************************** ********/
Delay_Rute: mov r4,#27h
Lop_D:DJNZ R4,Lop_D
RET
/*void SendByte(uchar char) 用R1传递参数,位C代表是否有ACK应答信号,R2为循环次数*/
SendByte:clr c ;清除标志位
clr p1.3 ;clk=0
mov r2,#08
sh_L: RLC A
mov p1.4,c ;置DAT PIO 线
; LCALL Delay_Rute ;延时
setb p1.3 ;CLK=1
lcall Delay_Rute ;延时
clr p1.3 ;CLK=0
lcall Delay_Rute
djnz r2,sh_L
;******************以下接收应答信号*************/
lcall Delay_Rute
setb p1.4 ;DAT=1,初始化PIO 1.4口
clr p1.3 ;CLK=0
lcall Delay_Rute
setb p1.3
lcall Delay_Rute
mov c,p1.4 ;把应答信号存放进位C中。
nop
RET
;*********************************退出中断服务程序*************************
exit : pop psw
pop 07h
pop 06h
pop 05h
pop 04h
pop 03h
pop 02h
pop 01h
pop 00h
POP ACC
reti
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -