专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

PIC单片机内部EEPROM读写程序

作者:佚名   来源:本站原创   点击数:  更新时间:2012年09月26日   【字体:
 #INCLUDE"P16F877.inc"
   W_TEMP  EQU 20H ; 实际上20H、A0H、120H和1A0H
   STATUS_TEMP EQU 21H ;在体0中建立保护单元 
   PCLATH_TEMP EQU 22H ;在体0中建立保护单元
   ORG  000H
   GOTO A1
   ORG  004H;定时中断入口地址 
   GOTO ZD01;
   ORG  0CH
Q1   ADDWF   PCL,1  
    RETLW     00C0H        ;0
       RETLW     00F9H        ;1
        RETLW     00A4H        ;2
        RETLW     00B0H        ;3
      RETLW     0099H        ;4
      RETLW     0092H        ;5
      RETLW     0082H        ;6
      RETLW     00F8H        ;7
      RETLW     0080H        ;8
      RETLW     0090H        ;9
      RETLW     0088H        ;A
      RETLW     0083H        ;B
      RETLW     00C6H        ;C
      RETLW     00A1H        ;D
      RETLW     0086H        ;E
      RETLW     008EH        ;F
A1   MOVLW 1;位1显示数
   MOVWF 50H; 
   MOVLW 2;位2显示数
   MOVWF 51H;
   MOVLW 3;位3显示数
   MOVWF 52H;
   MOVLW 4;位4显示数
   MOVWF 53H;
   CLRF 60H
   MOVLW 4;显示位数
   MOVWF 40H;
   MOVLW B'00000001';位码
   MOVWF 41H;
   MOVLW 50H;
   MOVWF FSR ;间接寻址
   BSF  STATUS,RP0;选择体1
   BCF  STATUS,RP1;
   MOVLW 00H;1:2TMRO比例
   MOVWF OPTION_REG;分频1/2
   BCF  STATUS,RP0;体0
   BCF  STATUS,RP1;
   MOVLW 0FFH;
   MOVFW TMR0;初值
   BCF  INTCON,T0IF;清定时中断标志
   BSF  INTCON,T0IE;开定时中断
   BSF  INTCON,GIE;开总中断
;**********************************************************
;   按键修改数据程序
;**********************************************************
A2   BSF  STATUS,RP0
   BCF  STATUS,RP1;体1
   MOVLW 0FFH
   MOVWF TRISB;设置B口为输入口
   
   BCF  STATUS,RP0
   BCF  STATUS,RP1;体0
   BTFSC PORTB,0;判断B口第0位是否按下
   GOTO A3;位0则按下按键
   MOVLW 1;按下存1到EEPROM
   MOVWF 61H;数据寄存器
   CALL WR1;写数据到EEPROM
A3   BCF  STATUS,RP0
   BCF  STATUS,RP1;体0
   BTFSC PORTB,1;判断B口第1位是否按下
   GOTO A4;
   MOVLW 2;按下存2到EEPROM
   MOVWF 61H;数据寄存器
   CALL WR1;写数据到寄存器
A4   BCF  STATUS,RP0;
   BCF  STATUS,RP1;体0
   BTFSC PORTB,2;判断B口第2位是否按下
   GOTO A5;
   MOVLW 3;
   MOVWF 61H;
   CALL WR1;
A5   BCF  STATUS,RP0;
   BCF  STATUS,RP1;
   BTFSC PORTB,3;
   GOTO A6;
   MOVLW 4;
   MOVWF 61H;
   CALL WR1;
A6   BCF  STATUS,RP0;
   BCF  STATUS,RP1;
   BTFSC PORTB,4;
   GOTO A7;
   MOVLW 5;
   MOVWF 61H;
   CALL WR1;
A7   BCF  STATUS,RP0;
   BCF  STATUS,RP1;
   BTFSC PORTB,5;
   GOTO A8;
   MOVLW 6;
   MOVWF 61H;
   CALL WR1;
A8   BCF  STATUS,RP0;
   BCF  STATUS,RP1;
   BTFSC PORTB,6;
   GOTO A9;
   MOVLW 7;
   MOVWF 61H;
   CALL WR1;
A9   BCF  STATUS,RP0;
   BCF  STATUS,RP1;
   BTFSC PORTB,7;
   GOTO A10;
   MOVLW 8;
   MOVWF 61H;
   CALL WR1;
A10
   CALL RD01;调用读数据程序
   GOTO A2;
;***********************************************
;   写数据子程序
;***********************************************
WR1   BSF  STATUS,RP0;
   BSF  STATUS,RP1;体3
   BTFSC EECON1,WR;判断是否在写数据
   GOTO $-1;
   BCF  STATUS,RP0;
   BCF  STATUS,RP1;体0
   MOVFW 60H;EEPROM目标地址
   BCF  STATUS,RP0
   BSF  STATUS,RP1;体2
   MOVWF EEADR;EEPROM目标地址寄存器
   BCF  STATUS,RP0
   BCF  STATUS,RP1;体0
   MOVFW 61H;需写入数据
   BCF  STATUS,RP0
   BSF  STATUS,RP1;体2
   MOVWF EEDATA;EEPROM数据寄存器
   BSF  STATUS,RP0
   BSF  STATUS,RP1;体3
   BCF  EECON1,EEPGD;选择为EEPROM模式
   BSF  EECON1,WREN;允许使能
;***************************************************
; 写数据5指令序列PIC特定没有为什么不允许能改变
   MOVLW 55H ;  
   MOVWF EECON2  ;55H送EECON2
   MOVLW 0AAH;
   MOVWF EECON2  ;AAH送EECON2
   BSF  EECON1,WR ;启动写操作
;   
;**************************************************
   BTFSC EECON1,WR;判断是否学完成
   GOTO $-1;
   BCF  STATUS,RP0;恢复体0
   BCF  STATUS,RP1;
   RETURN;
;**************************************************
;   读EEPROM数据子程序
;**************************************************   
RD01  BCF  STATUS,RP0;
   BSF  STATUS,RP1;体2
   MOVLW 0;目标地址
   MOVWF EEADR;目标地址寄存器
   BSF  STATUS,RP0;
   BSF  STATUS,RP0;体3
   BCF  EECON1,EEPGD;选择EEPROM模式
   BSF  EECON1,RD;启动读操作
   BTFSC EECON1,RD;判断是否读取完
   GOTO $-1;
   BCF  STATUS,RP0;
   BSF  STATUS,RP1;体2
   MOVFW EEDATA;将数据存到W中
   BCF  STATUS,RP0;
   BCF  STATUS,RP1;体0
   MOVWF 53H ;将读取数存到55H   
   RETURN
;********************************************************
;   定时中断程序
;********************************************************
ZD01  BCF  INTCON,GIE;关总中断
   BTFSS INTCON,T0IF;判断是否产生定时中断
   GOTO ZD03;否跳出是继续执行
;***************************************************
;     保护现场
   MOVWF  W_TEMP;W备份到W_TEMP中
   SWAPF  STATUS,0;STATUS半字交换后送W
   CLRF  STATUS;选择体0为当前体备份
   MOVWF  STATUS_TEMP;将原来的STATUS送体0上的
   MOVF  PCLATH,0;PCLATH送W 
   MOVWF  PCLATH_TEMP;W送备份寄存器中
   CLRF  PCLATH ;设置为0页
;***************************************************
   BCF  INTCON,T0IF
   BSF  STATUS,RP0;体1
   BCF  STATUS,RP1;
   MOVLW 0;
   MOVWF TRISC;RB口设为输出口
   MOVWF TRISD;RD口设为输出口
   BCF  STATUS,RP0;体0
   BCF  STATUS,RP1;
   MOVLW 0FFH;
   MOVWF PORTC;RB口输出高电平
   MOVLW 0
   MOVWF PORTD;RD口输出低电平起清屏作用
   
   MOVFW INDF;间接寻址显示数据  
   CALL Q1;查数据表
   MOVWF PORTC;显示断码输出到RB口
   INCF FSR,1;间接寻址地址加1
   MOVFW 41H ;位码
   MOVWF PORTD;位码输出到RD口
   RLF  41H,0;处理C
   RLF  41H,1;左移位码
   DECFSZ 40H,1;判断是否显示完4位
   GOTO ZD02;否则继续显示
   MOVLW 4;显示位数
   MOVWF 40H;
   MOVLW B'00000001';位码
   MOVWF 41H;
   MOVLW 50H;
   MOVWF FSR ;间接寻址
ZD02  MOVLW 0FFH;
   MOVFW TMR0;重装初值
;***************************************************
;     恢复现场
   CLRF STATUS;恢复到体0
   MOVF    PCLATH_TEMP,0;开始恢复数据 
   MOVWF PCLATH;恢复PCLATH
   SWAPF STATUS_TEMP,0
   MOVWF STATUS;恢复STATUS
   SWAPF W_TEMP,1;半字交换后放回
   SWAPF W_TEMP,0;再半字交换后送W
;***************************************************
ZD03  BSF  INTCON,GIE;开总中断
   RETFIE ;中断返回

;********************************************
;    数据表
;********************************************      
   END 
关闭窗口

相关文章