当前位置: 网站首页 > 技术应用 > 单片机应用 > IIC通讯

单片机之I2C软件处理

SONIX单片机之I2C软件处理

 

;;***********************************
;;
;;程序功能:写字节数据,将要保存的数字写人到epprom中以防掉电丢失
;;调用子程序:start_i2c,stop_i2c,wrbyte,cack_i2c,
;;输入参数:epp_save
;;输出参数:epp_out

;;***********************************************
;;定义局部变量
.data
        i2i_buf_data        ds        1
        temp                ds        1
        flag3                ds        1
        f_f0                equ        flag3.0
;;--------------------------------------
.const
        sda                equ        fp51        ;;数据线
        sdam                equ        fp51m
        scl                equ        fp50        ;;时钟线
        sclm                equ        fp50m
;;---------------------------------------
.code        ;;程序入口
;;---------------------------------------
i2i_24c02:
        bts1        f_start_write                ;;
        jmp        i2i_24c02_90
        bclr        f_start_write
        b0bset        sdam
        b0bset        sclm
        call        delay_5us
;;-------------------------------------
write_24c02:
        call        start_i2i                ;;启动起始信号
        mov        a,#10100000b
        call        write_8bit                ;;写芯片代码
        call        check_ack                ;;读应答信号
        bts0        f_f0                        ;;是否有应答信号
        jmp        i2i_24c02_90
;;------------------------------------
        mov        a,#00                        ;;写起始数据
        call        write_8bit
        call        check_ack
        bts0        f_f0
        jmp        i2i_24c02_90
;;-------------------------------------
                
        mov        a,wk00                ;;数据1
        call        write_8bit
        call        check_ack
        bts0        f_f0
        jmp        i2i_24c02_90
;;-----------------------------
        mov        a,wk01                ;;数据2
        call        write_8bit
        call        check_ack
        bts0        f_f0
        jmp        i2i_24c02_90        
;;----------------------------
        mov        a,wk02                ;;数据3
        call        write_8bit
        call        check_ack
        bts0        f_f0
        jmp        i2i_24c02_90
;;----------------------------
        mov        a,wk03                ;;数据4
        call        write_8bit
        call        check_ack
        bts0        f_f0
        jmp        i2i_24c02_90
;;-----------------------------
        mov        a,b_key_mode        ;;数据5
        call        write_8bit
        call        check_ack
        bts0        f_f0
        jmp        i2i_24c02_90
        call        stop_i2i        ;;停止发送
i2i_24c02_90:
        ret
;;---------------------------------------
;;-------------------------------
;;以下为各个子模块程序
;;
;;
;;*******************************
delay_5us:
        jmp        $+1
        jmp        $+1
        jmp        $+1
        jmp        $+1
        jmp        $+1
        jmp        $+1
        jmp        $+1
        jmp        $+1
        jmp        $+1
        jmp        $+1
        ret
;;-------------------------------
;;--------------------------------
;;发起起始位
;;********************************
start_i2i:
        bset        sda
        
        bset        scl
        call        delay_5us
        bclr        sda
        call        delay_5us
        bclr        scl
        call        delay_5us
        ret
;;--------------------------------
;;----------------------------------
;;发送停止信号条件
;;*******************************
stop_i2i:
        bclr        sda
        bset        scl
        call        delay_5us
        bset        sda
        call        delay_5us
        bclr        scl
        ret
;;--------------------------------
ack_i2i:
        bclr        sda
        bset        scl        
        call        delay_5us
        bclr        scl
        ret
;;----------------------------------
;;-------------------------------
;;检查应答信号子程序,没有应答信号f_f0=1
;;-------------------------------;;
check_ack:
        bclr        sdam
        bset        sda
        bset        scl
        call        delay_5us
        
        bclr        f_f0
        bts0        sda
        jmp        check_ask10
        call        delay_5us
        bclr        scl
        jmp        check_ask20
check_ask10:
        call        delay_5us
        bset        f_f0                ;;无应答信号

        b0bclr        scl
check_ask20:
        bset        sdam
        nop
        bset        sda
        ret
;;---------------------------------
ask:
        call        delay_5us
        bclr        sda
        call        delay_5us
        bset        scl
        call        delay_5us
        bclr        scl
        call        delay_5us
        ret
;;
;;功能:发无确认信号
;;
;;---------------------------------

noask:
        bset        sda
        bset        scl
        call        delay_5us
        bclr        scl
        ret
;;----------------------------------
;;功能:写一个字节数据
;;input:i2i_buf_data,temp        
;;**********************************
write_8bit:
        mov        i2i_buf_data,a
        clr        temp
;;-------------------------------
write_8bit10:
        rlcm        i2i_buf_data
        bts1        fc
        jmp        write_8bit20
        bset        sda
        bset        scl
        call        delay_5us
        bclr        scl
        jmp        write_8bit30
write_8bit20:
        bclr        sda
        bset        scl
        call        delay_5us
        bclr        scl
write_8bit30:
        incms        temp
        cjb_        temp,#8,write_8bit10
        clr        temp
        ret
;--------------------------------
;;功能:读一个数据i2i_buf_data放到的数据
;;
;;*********************************
read_8bit:
        clr        i2i_buf_data        ;;
        clr        temp                ;;
        
        
read_8bit10:
        bclr        sdam
        call        delay_5us
        bset        scl
        call        delay_5us
        b0bclr        fc
        bts0        sda
        bset        fc
        rlcm        i2i_buf_data
        bclr        scl
        bset        sdam
        
        incms        temp
        cjb_        temp,#8,read_8bit10
        clr        temp
        ret
;;
;;----------------------------------;;
;;功能
;;开机时读取eeprom的值共4组数据
;;***********************************
read_24c02:
        call        start_i2i
        mov        a,#10100000b
        call        write_8bit
        call        check_ack
        bts0        f_f0
        ret
        mov        a,#00
        call        write_8bit
        call        check_ack
        bts0        f_f0
        ret
;;-----------------------------
read_ok:
        call        start_i2i
        mov        a,#10100001b
        call        write_8bit
        call        check_ack
        bts0        f_f0
        ret
;;--------------------------------
        ;;------------------------------
read_24c02_10:        
        call        read_8bit                        ;;读数据1
        call        ask
        mov_        i2i_data1,i2i_buf_data
;;--------------------------------
        call        read_8bit
        call        ask                                ;;读数据2
        mov_        i2i_data2,i2i_buf_data
;;--------------------------------
        call        read_8bit
        call        ask                                ;;读数据3
        mov_        i2i_data3,i2i_buf_data
;;--------------------------------
        call        read_8bit                        ;;数据4
        call        ask
        mov_        i2i_data5,i2i_buf_data
;;-------------------------------                
        call        read_8bit
        call        ask                                ;;读数据5
        mov_        i2i_data4,i2i_buf_data
;;----------------------------------------------
        call        stop_i2i        

        ret

点击次数:  【关闭
  • 壹零零单片机©版权所有 2008-2025 粤ICP备17151077号

Powered by  xinfuke  5.2.5 ©2008-2025  www.100mcu.com