📄 24c02_3.27.txt
字号:
;-------------------------------------
scl_high macro
b0bset p2.3;ieSCL
endm
;-------------------------------------
scl_low macro
b0bclr p2.3;ieSCL
endm
;------------------------------------
sda_high macro
b0bset p2.4;ieSDA ;24c02 sda become high
endm
;----------------------------------
sda_low macro
b0bclr p2.4;ieSDA
endm
;---------------------------------
sda_input macro
b0bclr p2m.4
endm
;--------------------------------
sda_output macro
b0bset p2m.4
endm
;===============================================================================
;读IIC程序 读IIC的时候不需要加iic_addr,在读的子程序中已经加iic_addr
;===============================================================================
read_iic_data:
clr y
b0mov z,#05h ;21为ROM中的数据首地址
mov a,#31
mov temp2,a
mov a,#10 ;写24c02的启始地址
mov iic_addr,a
read_iic_data_loop:
call display_cntr
clr iic_buf
call read_24c02 ;read data in E2PROM icc_addr=0x21
mov a,iic_buf
b0mov @yz,a ;读回记录的C0~C19(第1个学习遥控)
incms z
decms temp2
jmp read_iic_data_loop
ret
;--------------------------------------------------------------
read_24c02:
;e2pram_enable
call delay_10us
read_24c02_start:
call iic_start ;启动
mov a,#0a0h ;写操作
mov iic_buf,a
call iic_write_byte ;写入一 个字节
call iic_receive_ack ;等待应答
bts1 f_iic_re_ack ;应答标志位
jmp read_24c02_start ;无应答重新启动
mov a,iic_addr ;从存放数据的地址读出
mov iic_buf,a
call iic_write_byte
call iic_receive_ack
bts1 f_iic_re_ack
jmp read_24c02_start
call iic_start ;重新启动
mov a,#10100001b ;读操作
mov iic_buf,a
mov a,iic_buf
call iic_write_byte
call iic_receive_ack
bts1 f_iic_re_ack
jmp read_24c02_start
call iic_read_byte ;读出数据
mov a,iic_buf
call iic_send_no_ack ;发送非应答信号
incms iic_addr
call iic_stop ;停止
; MOV A,@11110111B ;071031
; IOW P5CR ;Bit[n]="1", Set P5[n] as Input Pin, n=3~0
sda_input
ret
;==============================================================================================
;写IIC程序 写IIC需非常注意,写完一个字节最好延时一段时间,否则有可能出现ACK无响应.而且一次
; 最多只能写8位数据(8位必须是0-7/8-15/....类推)否则回出错,最好一个一个字节写
;==============================================================================================
write_iic_data:
mov a,#10 ;先把学习的个数存入 iic 的0aH中
mov iic_addr,a
;mov a,#5
;mov remote_code_cnt,a
mov a, remote_code_cnt_2
mov temp_reg0,a
call write_24c02
;--------------------------------------------------------------------------------------
mov a,display_data
mov remote_code_cnt_2,a
;decms remote_code_cnt_2 ;iic_addr=0x0bh+(remote_code_cnt-1)*3
;mov a,#0
mov a,remote_code_cnt_2 ;e2pram_code_cnt=1(0x11h,0x12h,0x13h)
mov a,remote_code_cnt_2 ;防真器有问题remote_code_cnt送不进a
mov a,remote_code_cnt_2
mov temp2,a ;e2pram_code_cnt=2(0x14h,0x15h,0x16h)
b0bclr fc ;e2pram_code_cnt=3(0x17h,0x18h,0x19h)
rlcm temp2 ;e2pram_code_cnt=4(0x1ah,0x1bh,0x1ch)
mov a,remote_code_cnt_2
add a,temp2
add a,#11
mov iic_addr,a
bclr f_clr_iic_delay
bts0 f_clr_iic_delay
jmp $+3
call display_cntr
jmp $-3
mov a,remote_data_11
mov temp_reg0,a
call write_24c02
bclr f_clr_iic_delay
bts0 f_clr_iic_delay
jmp $+3
call display_cntr
jmp $-3
incms iic_addr
mov a, remote_data_22
mov temp_reg0,a
call write_24c02
bclr f_clr_iic_delay
bts0 f_clr_iic_delay
jmp $+3
call display_cntr
jmp $-3
incms iic_addr
mov a, remote_data_33
mov temp_reg0,a
call write_24c02
;incms remote_code_cnt
bclr f_clr_iic_delay ;此处延时是因为写完后就会执行READ_IIC_DATA,不延时也会出现ACK无响应
bts0 f_clr_iic_delay
jmp $+3
call display_cntr
jmp $-3
ret
;-------------------------------------------------------
write_24c02:
;e2pram_enable
sda_output
call delay_10us
write_24c02_start:
call iic_start ;启动
mov a,#0a0h ;写操作
mov iic_buf,a
call iic_write_byte ;写入一个字节
call iic_receive_ack ;等待应答
bts1 f_iic_re_ack ;应答标志位
jmp write_24c02_start ;无应答重新启动
mov a,iic_addr ;写入存放数据的地址
mov iic_buf,a
call iic_write_byte
call iic_receive_ack
bts1 f_iic_re_ack
jmp write_24c02_start
mov a,temp_reg0 ;写入8位数据
mov iic_buf,a
call iic_write_byte
call iic_receive_ack
bts1 f_iic_re_ack
jmp write_24c02_start
;incms iic_addr ;数据一般不连续写
call iic_stop ;停止
;MOV A,@11110111B ;071031
;IOW P5CR ;Bit[n]="1", Set P5[n] as Input Pin, n=3~0
sda_output
ret
;-------------------------------------------------
iic_start: ;启动
sda_output
jmp $+1
jmp $+1
sda_high
jmp $+1
jmp $+1
scl_high
jmp $+1
jmp $+1
sda_low
jmp $+1
jmp $+1
scl_low
ret
;---------------------------------------------------
iic_stop: ;停止
sda_output
jmp $+1
jmp $+1
sda_low
jmp $+1
jmp $+1
scl_high
jmp $+1
jmp $+1
sda_high
jmp $+1
jmp $+1
scl_low
ret
;----------------------------------------------------------
iic_read_byte:
sda_input
jmp $+1
jmp $+1
mov a,#08
mov iic_cnt,a
iic_read_lp:
scl_low
;sda_high
jmp $+1
jmp $+1
scl_high
jmp $+1
jmp $+1
b0bts1 p_sda
jmp iic_read_zero
iic_read_one:
rlcm iic_buf
bset iic_buf.0
decms iic_cnt
jmp iic_read_lp
ret
iic_read_zero:
rlcm iic_buf
bclr iic_buf.0
decms iic_cnt
jmp iic_read_lp
ret
;---------------------------------------------------
iic_send_no_ack: ;主机应答信号
sda_output
jmp $+1
jmp $+1
sda_high
jmp $+1
jmp $+1
scl_high
jmp $+1
jmp $+1
scl_low
jmp $+1
jmp $+1
sda_low
ret
;--------------------------------------------------
iic_write_byte: ;写一个字节
sda_output
mov a,#8
mov iic_cnt,a
iic_write_lp:
bts1 iic_buf.7 ;check cy bit
jmp iic_wr_zero
rlcm iic_buf ;rlcm
iic_wr_one:
sda_high
jmp $+1
jmp $+1
scl_high
jmp $+1
jmp $+1
scl_low
jmp $+1
jmp $+1
decms iic_cnt
jmp iic_write_lp
ret
iic_wr_zero:
rlcm iic_buf
sda_low
jmp $+1
jmp $+1
scl_high
jmp $+1
jmp $+1
scl_low
jmp $+1
jmp $+1
decms iic_cnt
jmp iic_write_lp
ret
;-------------------------------------------------
iic_receive_ack: ;接受应答
bclr f_iic_re_ack
sda_high
jmp $+1
jmp $+1
sda_input
jmp $+1
jmp $+1
scl_high
;jmp $+1
;jmp $+1
b0bts0 p_sda
jmp $-1
bset f_iic_re_ack
scl_low
ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -