📄 24c02.txt
字号:
I2cdata equ 4Fh ;发送数据缓冲区的首址
C2402data equ 00h ;接受缓冲区首址
numdata equ 08h ;传送的字节数,传送8个字节
Sda bit p2.1
Scl bit p2.2
main:
clr p1.5
mov 40h,#01h
mov 41h,#02h
mov 42h,#03h
mov 43h,#04h
SETB p2.0 ;位为0时选通
SETB P1.2
SETB P1.1
SETB P1.0
ACALL Mainwr
lcall d1s
ACALL Mainre
lcall d1s
mov 39h,#00h
main1: MOV 30H,40H
MOV 31H,41H
MOV 32H,42H
MOV 33H,43H
ACALL DIR
sjmp main1
Mainwr:Lcall init ;初始化给30h,31h,32h中存入0,1,2的段码
Lcall start2402 ;启动
Mov r7,#0a0h
Lcall send ;发送写24C02的寻址字节
Mov r7,#C2402data
Lcall send ;发送数据存入24C02的地址
Mov r5,#Numdata ;欲发送的字节数
Mov r0,#i2cdata ;发送缓冲区的首址
wrloop: Mov a,@r0
Mov r7,a
Inc r0
Lcall send
Djnz r5, wrloop ;把3个字节的数据发送出去
lcall stop ;停止
lcall d1s
ret
Mainre:
lcall start2402 ;启动
Mov r7,#0a0h
Lcall send ;发送写24C02的寻址字节
Mov r7,#C2402data
Lcall send ;发接受缓冲区首址
Lcall start2402 ; 再次启动
Mov r7,#0a1h
Lcall send ;发送读24C02的寻址字节
mov r1,#40h
mov 24H,#Numdata ; 要读取的字节数重新赋值
Reloop: Lcall read ;调用读取一个字节数据的子程序
; mov p0,r7 ;把读进来的数送到p0口显示
mov a,r7
mov @r1,a
inc r1
; lcall d1s
; lcall d1s
; acall DTR
Djnz 24H,reloop
Lcall stop ;3字节读取完毕发出停止信号
ret
init:
mov 4Fh,#00h ;初始化,50h中存入
mov 50h,#01h
mov 51h,#02h
mov 52h,#03h
mov 53h,#03h
mov 54h,#03h
mov 55h,#03h
mov 56h,#03h
ret
start2402: setb sda ;启动信号子程序,大家可以参考开始信号的时序图
setb scl
lcall d5u
clr sda
lcall d5u
clr scl
ret
stop: clr sda ;停止信号子程序
setb scl
lcall d5u
setb sda
lcall d5u
clr sda
clr scl
ret
;send是发送一个字节子程序
send: mov r6,#08h
mov a,r7 ;要发送的数在r7中
sendlop1 : rlc a ;左环移,把A的最高位移入cy
mov sda,c ;把cy的值通过sda发送出去
setb scl ;在scl上产生一个时钟
lcall d5u
clr scl
djnz r6, sendlop1 ;重复8次,发送一个字节
;cack是检查应答信号的子程序
cack: setb sda ;主机首先拉高sda
setb scl ;发出一个时钟
lcall d5u
sendlop2:mov c,sda ;读入sda的状态,如果是0表示接受到了应答
jc sendlop2
clr scl ;接受到应答位,结束时钟
ret
read: mov r6,#08h ;读取一个字节子程序
readlop1: setb sda ;置sda为输入方式
setb scl ;发出一个时钟
lcall d5u
mov c,sda ;读入sda状态
rlc a ;把该位的状态移入A中
clr scl ;结束时钟
djnz r6,readlop1 ;重复8次,读入一个字节
mov r7,a ;读进来的数放在r7中
;sack是发送应答位子程序
sack: clr sda ;拉低sda线
setb scl ;发出时钟信号
lcall d5u
clr scl
setb sda
ret
d5u: nop ;延时5us子程序
nop
nop
nop
nop
ret
d1s: mov r1,#100 ;延时1s子程序
del1: mov r4,#20
del2: mov r3,#0ffh
del3: djnz r3,del3
djnz r4,del2
djnz r1,del1
ret
DIR:MOV R0,#30H
MOV 39H,#00H ;存4个显示状态
MOV R5,#04H
L4: CLR P1.4 ;产生脉冲
MOV R6,#08H ;数据端A,B要接受8位,点亮一个数码管
MOV A,@R0 ;查表
ADD A,#(TAB-L2)
MOVC A,@A+PC
L2: CLR P1.3 ;发送第一个数据到第一个数码管
RRC A
JNC L3
SETB P1.3
L3: SETB P1.4 ;发CP脉冲
CLR P1.4
DJNZ R6,L2
MOV A,39H ;判断状态,选中数码管
CJNE A,#00H,B5
MOV 39H,#04H
B5: MOV A,39H
CJNE A,#04H,B1
clr p1.0
SETB P1.2
SETB P1.1
SETB P2.0
B1: CJNE A,#03H,B2
CLR p1.1
SETB P1.2
SETB P1.0
SETB P2.0
B2: CJNE A,#02H,B3
clr p1.2
SETB P1.0
SETB P1.1
SETB P2.0
B3: CJNE A,#01H,B4
clr p2.0
SETB P1.2
SETB P1.1
SETB P1.0
B4: ACALL DELYD ;延时显数
DEC 39H
INC R0
DJNZ R5,L4
RET
TAB: DB 84H,0B7H,2CH,25H,17H,45H,44H,0A7H,04H,05H,16h,0c4h,34h ;0-9,h,g,d
DELYD:MOV R7,#09H
DLD0: MOV R6,#06aH
DLD1: DJNZ R6,DLD1
DJNZ R7,DLD0
RET
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -