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

📄 sh69pxx单片机与24系列e2prom接口程序包.txt

📁 SH69PXX单片机与24系列E2PROM接口程序包
💻 TXT
字号:
SH69PXX单片机与24系列E2PROM接口程序包  
[ 作者:佚名    转贴自:本站原创    点击数:481    文章录入:admin ] 
;指令周期>=1us,即单片机时钟源<=4MHz。
;I/O口PORTB.3和PORTB.2分别为时钟线SCL和数据线SDA。
;定义系统寄存器
  PORTB          EQU  09H         ;PORTB端口状态寄存器 
  PBOUT          EQU  19H         ;PORTB端口输入/输出控制寄存器 
;定义数据寄存器
  PORTB_BUF      EQU  ??H         ;PORTB缓存
  WR_TMP_H       EQU  ??H         ;发送的串行数据(高四位)
  WR_TMP_L       EQU  ??H         ;发送的串行数据(低四位)
  S_DATA_H       EQU  ??H         ;读/写的串行数据缓存(高四位)
  S_DATA_L       EQU  ??H         ;读/写的串行数据缓存(低四位)
  ADDR_H         EQU  ??H         ;要操作的器件地址单元(高四位)
  ADDR_L         EQU  ??H         ;要操作的器件地址单元(低四位)
  DELAY_H        EQU  ??H         ;延时变量(高四位)
  DELAY_L        EQU  ??H         ;延时变量(低四位)

;=============================================================
;写E2PROM程序
;INPUT :ADDR_H,ADDR_L(要操作的单元地址),S_DATA_H,S_DATA_L(要写入的数据)
WRITE24: LDI   PBOUT,1111B       ;SDA(PORTB.2)和SCL(PORTB.3)都设置为输出状态
         CALL  START              ;发起始信号
         LDI   WR_TMP_H,0AH       ;寻址字节(写)送缓存
         LDI   WR_TMP_L,0
         CALL  WRBYTE             ;发寻址字节
         CALL  WRACK              ;释放数据线SDA以便让E2PROM发出应答信号
         LDA   ADDR_H             ;要操作的单元地址送缓存
         STA   WR_TMP_H
         LDA   ADDR_L
         STA   WR_TMP_L
         CALL  WRBYTE             ;写入要操作的单元地址
         CALL  WRACK              ;释放数据线SDA以便让E2PROM发出应答信号
         LDA   S_DATA_H           ;要写入的数据送缓存
         STA   WR_TMP_H
         LDA   S_DATA_L
         STA   WR_TMP_L
         CALL  WRBYTE               ;写入的数据
         CALL  WRACK                ;释放数据线SDA以便让E2PROM发出应答信号
         CALL  STOP_SUB             ;发终止信号
         NOP
         CALL  DELAY1               ;延时5~10ms之后再对E2PROM作下次操作
         CALL  DELAY1
         RTNI                          
; =============================================================
;起始信号子程序
START:   ORIM  PORTB_BUF,0100B      ;SDA置高
         STA   PORTB
         NOP
         NOP
         ORIM  PORTB_BUF,1000B      ;SCL置高 
       STA   PORTB
         NOP
         NOP
         ANDIM PORTB_BUF,1011B      ;SDA拉低
         STA   PORTB  
         CALL  DELAY                ;保持10us
         NOP
         ANDIM PORTB_BUF,0111B      ;恢复SDA
         STA   PORTB
         NOP
         RTNI
;=============================================================
;发送串形数据子程
WRBYTE:  LDA   WR_TMP_H
         BA3   $+3                 
         ANDIM PORTB_BUF,1011B
         JMP   WRBYTE1
         ORIM  PORTB_BUF,0100B
WRBYTE1: STA   PORTB               ;第一位
         CALL  DELAY               ;保持10us  
         ORIM  PORTB_BUF,1000B
         STA   PORTB
         CALL  DELAY
         ANDIM PORTB_BUF,0111B
         STA   PORTB
         CALL  DELAY
         LDA   WR_TMP_H
         BA2   $+3                 
         ANDIM PORTB_BUF,1011B
         JMP   WRBYTE2
         ORIM  PORTB_BUF,0100B
WRBYTE2: STA   PORTB               ;第二位
         CALL  DELAY               
         ORIM  PORTB_BUF,1000B
         STA   PORTB
         CALL  DELAY
         ANDIM PORTB_BUF,0111B
         STA   PORTB
         CALL  DELAY
         LDA   WR_TMP_H
         BA1   $+3
         ANDIM PORTB_BUF,1011B
         JMP   WRBYTE3
         ORIM  PORTB_BUF,0100B
WRBYTE3: STA   PORTB               ;第三位
         CALL  DELAY               
         ORIM  PORTB_BUF,1000B
         STA   PORTB
         CALL  DELAY
         ANDIM PORTB_BUF,0111B
         STA   PORTB  
         CALL  DELAY
         LDA   WR_TMP_H
         BA0   $+3
         ANDIM PORTB_BUF,1011B
         JMP   WRBYTE4
         ORIM  PORTB_BUF,0100B
WRBYTE4: STA   PORTB               ;第四位
         CALL  DELAY               
         ORIM  PORTB_BUF,1000B
         STA   PORTB
         CALL  DELAY
         ANDIM PORTB_BUF,0111B
         STA   PORTB
         CALL  DELAY
         LDA   WR_TMP_L
         BA3   $+3
         ANDIM PORTB_BUF,1011B
         JMP   WRBYTE5
         ORIM  PORTB_BUF,0100B
WRBYTE5: STA   PORTB               ;第五位
         CALL  DELAY               
         ORIM  PORTB_BUF,1000B
         STA   PORTB
         CALL  DELAY
         ANDIM PORTB_BUF,0111B
         STA   PORTB
         CALL  DELAY
         LDA   WR_TMP_L
         BA2   $+3
         ANDIM PORTB_BUF,1011B
         JMP   WRBYTE6
         ORIM  PORTB_BUF,0100B
WRBYTE6: STA   PORTB               ;第六位
         CALL  DELAY               
         ORIM  PORTB_BUF,1000B
         STA   PORTB
         CALL  DELAY
         ANDIM PORTB_BUF,0111B
         STA   PORTB
         CALL  DELAY
         LDA   WR_TMP_L
         BA1   $+3
         ANDIM PORTB_BUF,1011B
         JMP   WRBYTE7
         ORIM  PORTB_BUF,0100B
WRBYTE7: STA   PORTB               ;第七位
         CALL  DELAY                
         ORIM  PORTB_BUF,1000B
         STA   PORTB
         CALL  DELAY
         ANDIM PORTB_BUF,0111B
         STA   PORTB
         CALL  DELAY
         LDA   WR_TMP_L
         BA0   $+3
         ANDIM PORTB_BUF,1011B
         JMP   WRBYTE8
         ORIM  PORTB_BUF,0100B
WRBYTE8: STA   PORTB               ;第八位
         CALL  DELAY               
         ORIM  PORTB_BUF,1000B
         STA   PORTB
         CALL  DELAY
         ANDIM PORTB_BUF,0111B
         STA   PORTB
         CALL  DELAY
         RTNI
;=============================================================
;释放数据线SDA以便让E2PROM发出应答信号
WRACK:   
         LDI   PBOUT,1011B        ;把I/O口PORTB.2设置为输入状态以释放SDA,(Bit3,1,0
                                  ;根据实际情况设置输入/输出状态)
         NOP
         CALL  DELAY
         ORIM  PORTB_BUF,1000B    ;SCL送一个时钟信号
         STA   PORTB
         CALL  DELAY
         ANDIM PORTB_BUF,0111B
         STA   PORTB
         NOP
         LDI   PBOUT,1111B        ;PORTB.2恢复输出状态(Bit3,1,0
                                  ;根据实际情况设置输入/输出状态)
         NOP
         NOP
         RTNI
;=============================================================
;停止信号子程序
STOP_SUB:ANDIM PORTB_BUF,1011B    ;拉低SDA
         STA   PORTB
         NOP
         NOP
         ORIM  PORTB_BUF,1000B    ;置高SCL
         STA   PORTB
         CALL  DELAY              ;保持10us
         ORIM  PORTB_BUF,0100B    ;置高SDA
         STA   PORTB
         NOP
         NOP
         RTNI

;=============================================================
;读E2PROM程序
;INPUT: ADDR_H,ADDR_L(要操作的单元地址)
;OUTPUT:S_DATA_H,S_DATA_L(读出的数据)
READ24: LDI    PBOUT,1111B        ;SDA(PORTB.2)和SCL(PORTB.3)都设置为输出状态
        CALL   START              ;发起始信号
        LDI    WR_TMP_H,0AH       ;寻址字节(写)送缓存
        LDI    WR_TMP_L,0
        CALL   WRBYTE             ;发寻址字节(写)
        CALL   WRACK             ;释放数据线SDA以便让E2PROM发出应答信号
        LDA    ADDR_H            ;要操作的单元地址送缓存
        STA    WR_TMP_H
        LDA    ADDR_L
        STA    WR_TMP_L
        CALL   WRBYTE            ;写入要操作的单元地址
        CALL   WRACK             ;释放数据线SDA以便让E2PROM发出应答信号
        CALL   START             ;发起始信号
        LDI    WR_TMP_H,0AH      ;寻址字节(读)送缓存
        LDI    WR_TMP_L,1
        CALL   WRBYTE            ;发寻址字节(读)
        CALL   WRACK             ;释放数据线SDA以便让E2PROM发出应答信号
        NOP
        CALL   RDBYTE            ;读出数据
        LDA    WR_TMP_H          ;存数据
        STA    S_DATA_H
        LDA    WR_TMP_L
        STA    S_DATA_L
        NOP
        CALL   STOP_SUB          ;发终止信号
        CALL   DELAY1            ;延时5~10ms之后再对E2PROM作下次操作
        CALL   DELAY1
        RTNI        

;=============================================================
;读串形数据子程序
RDBYTE:  LDI   PBOUT,1011B        ; 把I/O口PORTB.2设置为输入状态以释放SDA,(Bit3,1,0
                                  ;根据实际情况设置输入/输出状态)
         NOP
         ORIM  PORTB_BUF,1000B
         STA   PORTB
         CALL  DELAY
         LDA   PORTB              ;读第一位
         BA2   $+3
         ANDIM WR_TMP_H,0111B
         JMP   RDBYTE1
         ORIM  WR_TMP_H,1000B
RDBYTE1: ANDIM PORTB_BUF,0111B
         STA   PORTB
         CALL  DELAY
         ORIM  PORTB_BUF,1000B
         STA   PORTB
         CALL  DELAY
         LDA   PORTB              ;读第二位
         BA2   $+3
         ANDIM WR_TMP_H,1011B
         JMP   RDBYTE2
         ORIM  WR_TMP_H,0100B
RDBYTE2: ANDIM PORTB_BUF,0111B
         STA   PORTB
         CALL  DELAY
         ORIM  PORTB_BUF,1000B
         STA   PORTB
         CALL  DELAY
         LDA   PORTB              ;读第三位
         BA2   $+3
         ANDIM WR_TMP_H,1101B
         JMP   RDBYTE3
         ORIM  WR_TMP_H,0010B
RDBYTE3: ANDIM PORTB_BUF,0111B
         STA   PORTB
         CALL  DELAY
         ORIM  PORTB_BUF,1000B
         STA   PORTB
         CALL  DELAY
         LDA   PORTB
         BA2   $+3                ;读第四位
         ANDIM WR_TMP_H,1110B
         JMP   RDBYTE4
         ORIM  WR_TMP_H,0001B
RDBYTE4: ANDIM PORTB_BUF,0111B
         STA   PORTB
         CALL  DELAY
         ORIM  PORTB_BUF,1000B
         STA   PORTB
         CALL  DELAY
         LDA   PORTB
         BA2   $+3                ;读第五位
         ANDIM WR_TMP_L,0111B
         JMP   RDBYTE5
         ORIM  WR_TMP_L,1000B
RDBYTE5: ANDIM PORTB_BUF,0111B
         STA   PORTB
         CALL  DELAY
         ORIM  PORTB_BUF,1000B
         STA   PORTB
         CALL  DELAY
         LDA   PORTB
         BA2   $+3                ;读第六位
         ANDIM WR_TMP_L,1011B
         JMP   RDBYTE6
         ORIM  WR_TMP_L,0100B
RDBYTE6: ANDIM PORTB_BUF,0111B
         STA   PORTB
         CALL  DELAY
         ORIM  PORTB_BUF,1000B
         STA   PORTB
         CALL  DELAY
         LDA   PORTB
         BA2   $+3                ;读第七位
         ANDIM WR_TMP_L,1101B
         JMP   RDBYTE7
         ORIM  WR_TMP_L,0010B
RDBYTE7: ANDIM PORTB_BUF,0111B
         STA   PORTB
         CALL  DELAY
         ORIM  PORTB_BUF,1000B
         STA   PORTB
         CALL  DELAY
         LDA   PORTB
         BA2   $+3                ;读第八位
         ANDIM WR_TMP_L,1110B
         JMP   RDBYTE8
         ORIM  WR_TMP_L,0001B
RDBYTE8: ANDIM PORTB_BUF,0111B
         STA   PORTB
         CALL  DELAY
         LDI   PBOUT,1111B        ;PORTB.2恢复输出状态(Bit3,1,0
                                  ;根据实际情况设置输入/输出状态)
         RTNI
;=============================================================
;延时子程序(10us)
DELAY:   NOP            
         NOP
         NOP
         NOP
         NOP
         NOP
         NOP
         NOP
         NOP
         RTNI
;=============================================================
;延时子程序(5ms)
DELAY1:  LDI   DELAY_H,0
         LDI   DELAY_L,0
DELAY2:  NOP
         NOP
         NOP
         NOP
         NOP
         NOP
         NOP
         NOP
         NOP
         NOP
         NOP
         NOP
         NOP
         NOP
         NOP
         ADIM  DELAY_L,1
         LDI   TEMP,0
         ADCM  DELAY_H
         BC    $+2
         JMP   DELAY2
         RTNI

 
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -