;///////////////////////////////////////////
;本程序源代码由微电子单片机工作室提供
;网址:www.elemcu.com
;Email:sanplug@126.com
;本程序使用24C02存储流水灯的实时状态
;///////////////////////////////////////////
i2c_clk bit p3.4 ;时钟信号
i2c_data bit p3.5 ;数据信号
org 0000h ;
ajmp main
org 0030h
main:
mov dptr,#tab ;表头
mov r0,#30h ;r0为指针
mov 2bh,#00h ;2bh为地址L
lcall r_d ;调用读EEPROM子程序
lcall delay10ms ;延时10ms
mov a,30h ;
cjne a,#16,com1 ;将读回的内容与16相比较,
com1:
jc loop ;如果超过16,则清零,否则跳到LOOP显示.
mov 30h,#00h
mov a,30h
loop:
movc a,@a+dptr ;查表显示到P1口
mov p1,a
mov r4,#10
tt3:
lcall delay10ms ;延时一秒钟
djnz r4,tt3
inc 30h
mov r0,#30h
mov 2bh,#00h
lcall w_t ;将当前的30H写入到EEPROM.
lcall delay10ms
mov a,30h
cjne a,#16,loop ;再做一次比较,此步也可省去.
mov 30h,#00h
mov a,30h
ajmp loop ;重复循环.
delay10ms:
mov r6,#100
tt2:
mov r5,#50
djnz r5,$
djnz r6,tt2
ret
tab: db 0feh,0fdh,0fbh,0f7h
db 0efh,0dfh,0bfh,07fh
db 07fh,0bfh,0dfh,0efh
db 0f7h,0fbh,0fdh,0feh
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; 2bh为地址L r0为指针
w_t:
a067EH: SETB i2c_data ;;;;写
SETB i2c_clk ;;;clk
CLR i2c_data ;;;sda//start
LCALL a0799H
CLR i2c_clk
LCALL a0799H
MOV A, #0A0H
LCALL a06EEH
SETB i2c_data
LCALL a0799H
SETB i2c_clk
LCALL a0799H
lcall ledb;;; JB i2c_data, $
CLR i2c_clk
LCALL a0799H
MOV A, 2bh ;;;;;写地址L
LCALL a06EEH
SETB i2c_data
LCALL a0799H
SETB i2c_clk
LCALL a0799H
lcall ledb;;; JB i2c_data, $
CLR i2c_clk
LCALL a0799H
a06BDH: MOV A, @R0 ;;;;写数据
LCALL a06EEH
SETB i2c_data
LCALL a0799H
SETB i2c_clk
LCALL a0799H
lcall ledb;;; JB i2c_data, $
CLR i2c_clk
LCALL a0799H
CLR i2c_data
LCALL a0799H
SETB i2c_clk
LCALL a0799H
SETB i2c_data
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
a06EEH: MOV R6, #08H
a06F0H: RLC A ;;;
MOV i2c_data, C
lcall a0799h
SETB i2c_clk
lcall a0799h
CLR i2c_clk
lcall a0799h
DJNZ R6, a06F0H
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;
ae6EEH: MOV R6, #08H
ae6F0H: RLC A ;;;
MOV i2c_data, C
lcall a0799h
SETB i2c_clk
lcall a0799h
CLR i2c_clk
lcall a0799h
DJNZ R6, ae6F0H
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
r_d:
a0718H: SETB i2c_data ;;;;写
SETB i2c_clk
CLR i2c_data
LCALL a0799H
CLR i2c_clk
LCALL a0799H
MOV A, #0A0H
LCALL ae6EEH
SETB i2c_data
LCALL a0799H
SETB i2c_clk
LCALL a0799H
lcall leda;; JB i2c_data, $
CLR i2c_clk
LCALL a0799H
MOV A, 2bh ;;;;;写地址L
LCALL ae6EEH
SETB i2c_data
LCALL a0799H
SETB i2c_clk
LCALL a0799H
lcall leda;; JB i2c_data, $
SETB i2c_data
LCALL a0799H
SETB i2c_clk
LCALL a0799H
CLR i2c_clk
LCALL a0799H
CLR i2c_data
LCALL a0799H
SETB i2c_clk
LCALL a0799H
SETB i2c_data
lcall delay10ms
SETB i2c_data ;;;;;;;读
SETB i2c_clk
CLR i2c_data
LCALL a0799H
CLR i2c_clk
LCALL a0799H
MOV A, #0A1H
LCALL ae6EEH
LCALL a0799H
SETB i2c_data
LCALL a0799H
SETB i2c_clk
LCALL a0799H
lcall leda;; JB i2c_data, $
CLR i2c_clk
LCALL a0799H
NOP
NOP
a0747H: MOV R6, #08H ;;;
CLR A
CLR C
SETB i2c_data
LCALL a0799H
a0750H: SETB i2c_clk ;;;
LCALL a0799H
MOV C, i2c_data
RLC A
CLR i2c_clk
LCALL a0799H
DJNZ R6, a0750H
MOV @R0, A
INC R1
SETB i2c_data
LCALL a0799H
SETB i2c_clk
LCALL a0799H
CLR i2c_clk
LCALL a0799H
CLR i2c_data
LCALL a0799H
SETB i2c_clk
LCALL a0799H
SETB i2c_data
RET
a0784H: CLR i2c_data ;;;
LCALL a0799H
SETB i2c_clk
LCALL a0799H
CLR i2c_clk
LJMP a0747H
;;;;;;
a0799H: NOP
NOP
NOP
nop
NOP
NOP
NOP
nop
NOP
NOP
NOP
nop
NOP
NOP
NOP
nop
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
leda: mov b, #50h
led1: jnb i2c_data, led0
lcall a0799h
djnz b, led1
;mov 4ch, #0ddh
nop
led0: ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ledb: mov b, #50h
led0b: jnb i2c_data, led0a
lcall a0799h
djnz b, led0b
nop
led0a: ret
end