?? 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 + -