单片机与eeprom24C02通讯读写的汇编程序PICC

通过IIC通讯,pin8脚位。

以字节为单位,单次写入或者读取1个字节,存放到定义好的寄存器中,先定义所需寄存器

//读一个byte
R_READ_BYTE                     EQU           0X10
//读到的数据存放
R_RF_REC_1                      EQU           0X11
R_RF_REC_2                      EQU           0X12
R_RF_REC_3                      EQU           0X13
//写入的数据中继
R_WRITE_BYTE                    EQU           0X14

定义与之相连的IO,

#DEFINE    I2C_SCL                         GPIOA,10
#DEFINE    I2C_SDA                         GPIOA,11

读取写入都需要确定一个器件地址和数据地址,器件地址取决于24C02的E0 E1 E2

EEPROM_READ:
    LCALL        I2C_WRITE_START
;器件地址 
    MOVIA        0XA0
    MOVAR        R_WRITE_BYTE
    LCALL        I2C_WRITE1BYTE
;起始地址    
    MOVIA        0XA5
    MOVAR        R_WRITE_BYTE
    LCALL        I2C_WRITE1BYTE
    LCALL        I2C_WRITE_START
 ;数据1   
    MOVIA        0XA1
    MOVAR        R_WRITE_BYTE
    LCALL        I2C_WRITE1BYTE
    
    CLRWDT //清看门狗
    
    CLRR         R_ACK
    LCALL        I2C_READ1BYTE
    MOVR         R_READ_BYTE, TO_A
    MOVAR        R_EEPROM_CHECK
 ;读到的数据1   
    LCALL        I2C_READ1BYTE
    MOVR         R_READ_BYTE, TO_A
    MOVAR        R_RF_REC_1
 ;读到的数据2     
    LCALL        I2C_READ1BYTE
    MOVR         R_READ_BYTE, TO_A
    MOVAR        R_RF_REC_2
    MOVIA        1
    MOVAR        R_ACK
 ;读到的数据3    
    LCALL        I2C_READ1BYTE
    MOVR         R_READ_BYTE, TO_A
    MOVAR        R_RF_REC_3
  ;数据停止位  
    LCALL        I2C_WRITE_STOP
    RET

将0X123456存进0xA5地址,

EEPROM_WRITE:
    LCALL        I2C_WRITE_START
    ;器件地址
    MOVIA        0XA0
    MOVAR        R_WRITE_BYTE    
    LCALL        I2C_WRITE1BYTE
    ;起始地址
    MOVIA        0XA5
    MOVAR        R_WRITE_BYTE 
    ;
    LCALL        I2C_WRITE1BYTE   ;check—bit
    MOVIA        0X05
    MOVAR        R_WRITE_BYTE 
    ;写进去的数据1
    LCALL        I2C_WRITE1BYTE
    MOVIA        0X12
    MOVAR        R_WRITE_BYTE
    ;写进去的数据2
    LCALL        I2C_WRITE1BYTE
    MOVIA        0X34
    MOVAR        R_WRITE_BYTE
    ;写进去的数据3 
    LCALL        I2C_WRITE1BYTE
    MOVIA        0X56
    MOVAR        R_WRITE_BYTE
    LCALL        I2C_WRITE1BYTE
    ;数据停止位
    LCALL        I2C_WRITE_STOP
    RET

启停函数

I2C_WRITE_START:
    BSR          I2C_SDA
    BSR          I2C_SCL
    LCALL        I2C_WAIT_DELAY
    BCR          I2C_SDA
    
    LCALL        I2C_WAIT_DELAY
    BCR          I2C_SCL
    LCALL        I2C_WAIT_DELAY
    RET

I2C_WRITE_STOP:
    BCR          I2C_SDA
    BSR          I2C_SCL
    LCALL        I2C_WAIT_DELAY
    BSR          I2C_SDA    
    LCALL        I2C_WAIT_DELAY
    RET

IIC协议ack应答信号为低有效,

I2C_WRITE1BYTE:
    MOVIA        8
    MOVAR        R_CYCLE_CNT
I2C_WRITE1BYTE_LOOP:
    BCR          I2C_SCL
    RLR          R_WRITE_BYTE, TO_R
    BTRSC        STATUS, C_B
    BSR          I2C_SDA
    BTRSS        STATUS, C_B
    BCR          I2C_SDA
    LCALL        I2C_WAIT_DELAY
    BSR          I2C_SCL
    LCALL        I2C_WAIT_DELAY
    DECR         R_CYCLE_CNT, TO_R
    BTRSS        STATUS, Z_B
    LGOTO        I2C_WRITE1BYTE_LOOP
    
    BCR          I2C_SCL
    LCALL        I2C_SDA_IN    //SDA配置切换到输入
    LCALL        I2C_WAIT_DELAY
    BSR          I2C_SCL
    LCALL        I2C_WAIT_DELAY
    
    BCR          I2C_SCL
    LCALL        I2C_SDA_OUT   //SDA配置切换到输出
    RET

I2C_READ1BYTE:
    CLRR         R_READ_BYTE
    BCR          I2C_SCL
    BSR          I2C_SDA
    LCALL        I2C_SDA_IN    //SDA配置切换到输入
    LCALL        I2C_WAIT_DELAY
    MOVIA        8
    MOVAR        R_CYCLE_CNT
I2C_READ1BYTE_LOOP:
    LCALL        I2C_WAIT_DELAY
    BSR          I2C_SCL
    BCR          STATUS, C_B
    RLR          R_READ_BYTE, TO_R
    BTRSC        I2C_SDA
    BSR          R_READ_BYTE, 0
    LCALL        I2C_WAIT_DELAY
    BCR          I2C_SCL
    DECR         R_CYCLE_CNT, TO_R
    BTRSS        STATUS, Z_B
    LGOTO        I2C_READ1BYTE_LOOP
    
    LCALL        I2C_SDA_OUT   //SDA配置切换到输出
    
    MOVR         R_ACK, TO_A
    BTRSS        STATUS, Z_B
    BSR          I2C_SDA
    BTRSC        STATUS, Z_B
    BCR          I2C_SDA
    
    LCALL        I2C_WAIT_DELAY
    BSR          I2C_SCL
    LCALL        I2C_WAIT_DELAY
    BCR          I2C_SCL
    RET
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值