24C02(EEPROM)記憶開機(jī)次數(shù)程序
;/////////////////////////////////////////////////////
;將AT24C02(EEPROM)的00H單元的地址清0
;AT24C02存儲(chǔ)開機(jī)次數(shù)(準(zhǔn)備程序)
;////////////////////////////////////////////////////
WP BIT P1.0
SCL BIT P1.1
SDA BIT P1.2
WRDA EQU 41H
ORG 0000H
SJMP MAIN
ORG 0030H
MAIN:CLR WP
MOV SP,70H
LCALL START
MOV WRDA,#0AEH
LCALL SEND
LCALL SACK
MOV WRDA,#00H
LCALL SEND
LCALL SACK
MOV WRDA,#00H
LCALL SEND
LCALL SACK
LCALL STOP
CLR P1.7
SJMP $
;24C02開始數(shù)據(jù)傳送信號(hào)
START:SETB SDA
SETB SCL
LCALL D5U
CLR SDA
LCALL D5U
CLR SCL
RET
;寫一個(gè)字節(jié)子程序
SEND: MOV R0,#08H
MOV A,WRDA
D1:RLC A
MOV SDA,C
LCALL D5U
SETB SCL
LCALL D5U
CLR SCL
DJNZ R0,D1
RET
;24c02應(yīng)答信號(hào)子程序
SACK: SETB SDA
LCALL D5U
SETB SCL
LCALL D5U
D2:MOV C,SDA
JC D2
CLR SCL
RET
;STOP子程序
STOP: CLR SDA
LCALL D5U
SETB SCL
LCALL D5U
SETB SDA
LCALL D5U
CLR SCL
RET
;延時(shí)子程序
D5U: NOP
NOP
NOP
NOP
NOP
RET
END
................................記憶開機(jī)次數(shù)程序(已調(diào)試過).....................................
;/////////////////////////////////////////////////
;AT24C02(EEPROM)存儲(chǔ)開機(jī)次數(shù)
;開機(jī)次數(shù)存儲(chǔ)地址為00H,在記憶前以清0
;////////////////////////////////////////////////
WP BIT P1.0
SCL BIT P1.1
SDA BIT P1.2
WRDA EQU 40H;寫入數(shù)據(jù)暫存器
RDDA EQU 41H;讀出數(shù)據(jù)暫存器
OPUN EQU 42H;開機(jī)次數(shù)暫存器
ORG 0000H
SJMP MAIN
ORG 0030H
MAIN:CLR WP;開寫保護(hù)
MOV SP,70H
LCALL READ
MOV A,RDDA
MOV DPTR,#TAB
INC A
MOV R1,A
CJNE R1,#16,D4
CLR A
D4:MOV OPUN,A;將開機(jī)次數(shù)存入暫存器
MOVC A,@A+DPTR
CLR P2.0
MOV P0,A;顯示開機(jī)次數(shù)
LCALL WIRT
SJMP $
;讀24C02子程序
READ:LCALL START
MOV WRDA,#0AEH
LCALL SEND
LCALL SACK
MOV WRDA,#00H
LCALL SEND
LCALL SACK
LCALL START
MOV WRDA,#0AFH
LCALL SEND
LCALL SACK
LCALL REBY
LCALL STOP
RET
;寫C2402子程序
WIRT:LCALL START
MOV WRDA,#0AEH
LCALL SEND
LCALL SACK
MOV WRDA,#00H
LCALL SEND
LCALL SACK
MOV A,OPUN
MOV WRDA,A
LCALL SEND
LCALL SACK
LCALL STOP
RET
;24C02開始子程序
START:SETB SDA
SETB SCL
LCALL DE5U
CLR SDA
LCALL DE5U
CLR SCL
RET
;讀一個(gè)字節(jié)子程序
REBY: MOV R0,#08H
SETB SDA
D3:LCALL DE5U
SETB SCL
LCALL DE5U
MOV C,SDA
RLC A
CLR SCL
SETB SDA
DJNZ R0,D3
MOV RDDA,A
RET
;傳送一個(gè)字節(jié)子程序
SEND: MOV R0,#08H
MOV A,WRDA
D1:RLC A
MOV SDA,C
LCALL DE5U
SETB SCL
LCALL DE5U
CLR SCL
DJNZ R0,D1
RET
;24C02應(yīng)答信號(hào)檢測(cè)子程序
SACK: SETB SDA
LCALL DE5U
SETB SCL
LCALL DE5U
D2:MOV C,SDA
JC D2
CLR SCL
RET
;24C02停止通信子程序
STOP: CLR SDA
LCALL DE5U
SETB SCL
LCALL DE5U
SETB SDA
LCALL DE5U
CLR SCL
RET
;5U延時(shí)子程序
DE5U: NOP
NOP
NOP
NOP
NOP
RET
;顯示數(shù)據(jù)表
TAB: DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H
DB 0F8H,080H,090H,088H,083H,0C6H,0A1H
DB 086H,08EH
END
................................帶復(fù)位的記憶開機(jī)次數(shù)程序(已調(diào)試過).....................................
wp bit p1.0
scl bit p1.1
sda bit p1.2
count equ 30h;開機(jī)次數(shù)計(jì)數(shù)器
date equ 31h;IIC數(shù)據(jù)緩沖器
org 0000h
sjmp main
org 0003h
ljmp inx0
org 000bh
ljmp itx0
org 0030h
main:clr wp
clr ea
mov sp,#40h
mov dptr,#tab
lcall init
lcall reiic
mov count,date
inc count
mov r1,count
lcall wriic
setb ea
sjmp $
/*=============INT0,TO中斷初始化程序===================*/
init:mov tmod,#00000001b
mov th0,#0d8h
mov tl0,#00h
setb et0
setb it0
setb ex0
setb tr0
ret
/*=============LED動(dòng)態(tài)顯示程序===================*/
itx0:mov th0,#0d8h
mov tl0,#00h
mov a,count
mov b,#100
div ab
mov r0,a
movc a,@a+dptr
mov p0,a
cjne r0,#0,n1
sjmp n2
n1:clr p2.2
lcall d2ms
setb p2.2
n2:mov a,b
mov b,#10
div ab
mov r0,a
movc a,@a+dptr
mov p0,a
cjne r0,#0,n3
sjmp n4
n3:clr p2.1
lcall d2ms
setb p2.1
n4:mov a,b
movc a,@a+dptr
mov p0,a
clr p2.0
lcall d2ms
setb p2.0
reti
/*=============復(fù)位程序===================*/
inx0:clr tr0
mov r1,#00h
lcall wriic
lcall d10ms
lcall reiic
mov count,date
setb tr0
reti
/*=============AT24C02讀寫程序===================*/
wriic:lcall start
mov date,#10101110b
lcall write
lcall wack
mov date,#00h
lcall write
lcall wack
mov date,r1
lcall write
lcall wack
lcall stop
ret
reiic:lcall start
mov date,#10101110b
lcall write
lcall wack
mov date,#00h
lcall write
lcall wack
lcall start
mov date,#10101111b
lcall write
lcall wack
lcall read
lcall stop
ret
read: mov r3,#08h
e1:setb sda
setb scl
lcall d5u
mov c,sda
rlc a
clr scl
lcall d5u
djnz r3,e1
mov date,a
ret
start:setb sda
setb scl
lcall d5u
clr sda
lcall d5u
clr scl
ret
write:mov a,date
mov r4,#08h
w1:rlc a
mov sda,c
lcall d5u
setb scl
lcall d5u
clr scl
lcall d5u
djnz r4,w1
ret
wack: setb sda
setb scl
lcall d5u
w2:mov c,sda
jc w2
clr scl
ret
stop: clr sda
setb scl
lcall d5u
setb sda
lcall d5u
clr scl
ret
tab:DB 0C0H,0F9H,0A4H,0B0H,99H
DB 92H,82H,0F8H,80H,90H
d5u: nop
nop
nop
nop
nop
ret
D10ms: ;誤差 -0.000000000002us
MOV R6,#0F9H
DL0:
MOV R5,#22H
DJNZ R5,$
DJNZ R6,DL0
RET
d2ms: ;誤差 -0.217013888889us
MOV R6,#0b0H
DL1:
MOV R5,#0AH
DJNZ R5,$
DJNZ R6,DL1
RET
end
評(píng)論