📄 24c08lamp.asm
字号:
;///////////////////////////////////////////
;本程序源代码由单片机培训网提供.
;单片机培训网,让更多人学习单片机更容易.
;第一网址----www.mcuedu.com
;第二网址----http://51_train.nease.net
;创办人------刘永忠
;热线电话----(0755)27529998
;email-------aa815@163.com
;本程序使用24C08存储流水灯的实时状态
;///////////////////////////////////////////
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,#20h,com1 ;将读回的内容与20H相比较,
com1:
jc loop ;如果超过20H,则清零,否则跳到LOOP显示.
mov 30h,#00h
mov a,30h
loop:
movc a,@a+dptr ;查表显示到P0口
mov p0,a
inc 30h ;取下一内容显示到P2口
mov a,30h
movc a,@a+dptr
mov p2,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,#32,loop ;再做一次比较,此步也可省去.
mov 30h,#00h
mov a,30h
ajmp loop ;重复循环.
delay10ms:
mov r6,#100
tt2:
mov r5,#50
djnz r5,$
djnz r6,tt2
ret
tab: dw 0fffeh,0fffdh,0fffbh,0fff7h
dw 0ffefh,0ffdfh,0ffbfh,0ff7fh
dw 07fffh,0bfffh,0dfffh,0efffh
dw 0f7ffh,0fbffh,0fdffh,0feffh
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; 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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -