金沙js5线路(中国)有限公司

技术热线: 4007-888-234

PIC单片机内部EEPROM读写子程序

更新时间: 2019-03-22
阅读量:2364

单片机方案开发商深圳金沙js5线路分享PIC单片机内部EEPROM读写子程序。

;实战《内部EEPROM读写实验》

;本实战的目的是让大家熟悉PIC16F87X内部EEPROM的读写方法
;项目实现的功能:对于地址为00H-3FH的64个EEPROM数据存储单元,
;分别将数据0-63依次烧写进去,然后再循环读出,显示在8只LED发光二极管上
;程序文件名“MCD-EMP1.ASM”
;程序清单如下:
;************************************
STATUS   EQU 3H       ;定义状态寄存器地址
RP0      EQU 5H       ;定义页选位RP0的位地址
RP1      EQU 6H       ;定义页选位RP1的位地址
Z        EQU 2H       ;定义0状态位的位地址
PORTC    EQU 7H       ;定义RC口数据寄存器地址
TRISC    EQU 87H      ;定义RC口方向控制寄存器地址
EECON1   EQU 18CH     ;定义写控制寄存器1的地址
EECON2   EQU 18DH     ;定义写控制寄存器2的地址
EEDATA   EQU 10CH     ;定义读/写数据寄存器地址
EEADR    EQU 10DH     ;定义读/写地址寄存器地址
RD       EQU  0       ;定义读启动控制位位地址
WR       EQU  1       ;定义写启动控制位位地址
WREN     EQU  2       ;定义写使能控制位位地址
EEPGD    EQU  7       ;定义访问目标选择控制位位址
F        EQU  1       ;定义目标寄存器为RAM的指示符
W        EQU  0       ;定义目标寄存器为W的指示符 

ADDR     EQU  70H     ;定义地址变量
DATA1    EQU  71H     ;定义数据变量
;*************************************
    ORG     0000H        ;
    NOP                  ;放置一条ICD必须的空操作指令
    GOTO    MAIN         ;
    ORG     0008H        ;
MAIN
    BCF     STATUS,RP1   ;选体1为当前体
    BSF     STATUS,RP0   ;
    MOVLW   00H          ;设定RC全部为输出
    MOVWF   TRISC        ;
    BSF     STATUS,RP1   ;体3为当前体
    CLRF    ADDR         ;地址变量清0
    CLRF    DATA1        ;数据变量清0
WRITE
    BSF     STATUS,RP1   ;选定体3
    BTFSC   EECON1,WR    ;上一次写操作是否完成
    GOTO    $-1          ;否!返回继续检测
    BCF     STATUS,RP0   ;选定体2
    MOVF    ADDR,W       ;取地址
    MOVWF   EEADR        ;送地址寄存器
    MOVF    DATA1,W      ;取数据
    MOVWF   EEDATA       ;送数据寄存器
    BSF     STATUS,RP0   ;选定体3
    BCF     EECON1,EEPGD ;选定EEPROM为访问对向
    BSF     EECON1,WREN  ;开放写操作使能控制
    MOVLW   55H         ; 

MOVWF   EECON2       ;送55H到寄存器EECON2(读写内部EEPROM,这句是固定的)
    MOVLW   0AAH         ;
    MOVWF   EECON2       ;送AAH到寄存器EECON2(读写内部EEPROM,这句是固定的)
    BSF     EECON1,WR    ;启动写操作
    BCF     EECON1,WREN  ;禁止写操作发生
    INCF    DATA1,F      ;数据递增
    INCF    ADDR,F       ;地址递增
    MOVF    ADDR,W       ;
    XORLW   D’64’        ;将当前地址与64比较
    BTFSS   STATUS,Z     ;检测=64否
    GOTO    WRITE        ;否!继续写后面单元
READ1
    DECF    ADDR,F       ;地址递减
    BCF     STATUS,RP0   ;选体2为当前体 

BSF     STATUS,RP1   ;
    MOVF    ADDR,W       ;取地址
    MOVWF   EEADR        ;送地址寄存器
    BSF     STATUS,RP0   ;选体3为当前体
    BCF     EECON1,EEPGD  ;选定EEPROM为访问对象
    BSF     EECON1,RD     ;启动读操作
    BCF     STATUS,RP0    ;体2为当前体
    MOVF    EEDATA,W      ;取数据
    BCF     STATUS,RP1    ;体0为当前体
    MOVWF   PORTC         ;送显LED
    CALL    DELAY         ;调用廷时子程序
    MOVF    ADDR,F        ;检测当前地址
    BTFSS   STATUS,Z      ;是否为0?是!跳一步
    GOTO    READ1         ;否!返回继续读出和显示
READ2 
    INCF    ADDR,F        ;地址递增
    BCF     STATUS,RP0    ;选体2为当前体
    BSF     STATUS,RP1    ;
    MOVF    ADDR,W        ;取地址
    MOVWF   EEADR         ;送地址寄存器
    BSF     STATUS,RP0     ;选体3为当前体
    BCF     EECON1,EEPGD   ;选定EEPROM为访问对象
    BSF     EECON1,RD      ;启动读操作
    BCF     STATUS,RP0     ;体2为当前体
    MOVF    EEDATA,W       ;取数据 

BCF     STATUS,RP1     ;体0为当前体
    MOVWF   PORTC          ;送显LED
    CALL    DELAY          ;调用廷时子程序
    MOVF    ADDR,W         ;检测当前地址与64比较
    XORLW   D’64’          ;
    BTFSS   STATUS,Z       ;是否等于64
    GOTO    READ2          ;否!返回继续读出和显示
    GOTO    READ1          ;返回大循环起点
;******************************************
DELAY
    MOVLW    0             ;
    MOVWF    72H           ;将外层循环参数值256送外层循环寄存器
DELAY1
    MOVLW     0            ;将内层循环参数值256送内层循环寄存器
    MOVWF    73H           ;
    DECFSZ   73H,1         ;递减廷时程序
    GOTO     $-1           ;
    DECFSZ   72H,1         ;
    GOTO     DELAY1        ; 

RETURN
;********************************************
    END
;***************************************************** 

(文源网络,侵删)

XML 地图