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