⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 24c02_3.27.txt

📁 24c02读写程序,sonix单片机编写
💻 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 + -