專注電子技術(shù)學習與研究
當前位置:單片機教程網(wǎng) >> MCU設計實例 >> 瀏覽文章

PIC單片機內(nèi)部EEPROM讀寫程序

作者:佚名   來源:本站原創(chuàng)   點擊數(shù):  更新時間: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顯示數(shù)
   MOVWF 50H; 
   MOVLW 2;位2顯示數(shù)
   MOVWF 51H;
   MOVLW 3;位3顯示數(shù)
   MOVWF 52H;
   MOVLW 4;位4顯示數(shù)
   MOVWF 53H;
   CLRF 60H
   MOVLW 4;顯示位數(shù)
   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;開總中斷
;**********************************************************
;   按鍵修改數(shù)據(jù)程序
;**********************************************************
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;數(shù)據(jù)寄存器
   CALL WR1;寫數(shù)據(jù)到EEPROM
A3   BCF  STATUS,RP0
   BCF  STATUS,RP1;體0
   BTFSC PORTB,1;判斷B口第1位是否按下
   GOTO A4;
   MOVLW 2;按下存2到EEPROM
   MOVWF 61H;數(shù)據(jù)寄存器
   CALL WR1;寫數(shù)據(jù)到寄存器
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;調(diào)用讀數(shù)據(jù)程序
   GOTO A2;
;***********************************************
;   寫數(shù)據(jù)子程序
;***********************************************
WR1   BSF  STATUS,RP0;
   BSF  STATUS,RP1;體3
   BTFSC EECON1,WR;判斷是否在寫數(shù)據(jù)
   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;需寫入數(shù)據(jù)
   BCF  STATUS,RP0
   BSF  STATUS,RP1;體2
   MOVWF EEDATA;EEPROM數(shù)據(jù)寄存器
   BSF  STATUS,RP0
   BSF  STATUS,RP1;體3
   BCF  EECON1,EEPGD;選擇為EEPROM模式
   BSF  EECON1,WREN;允許使能
;***************************************************
; 寫數(shù)據(jù)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數(shù)據(jù)子程序
;**************************************************   
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;將數(shù)據(jù)存到W中
   BCF  STATUS,RP0;
   BCF  STATUS,RP1;體0
   MOVWF 53H ;將讀取數(shù)存到55H   
   RETURN
;********************************************************
;   定時中斷程序
;********************************************************
ZD01  BCF  INTCON,GIE;關(guān)總中斷
   BTFSS INTCON,T0IF;判斷是否產(chǎn)生定時中斷
   GOTO ZD03;否跳出是繼續(xù)執(zhí)行
;***************************************************
;     保護現(xiàn)場
   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;間接尋址顯示數(shù)據(jù)  
   CALL Q1;查數(shù)據(jù)表
   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;否則繼續(xù)顯示
   MOVLW 4;顯示位數(shù)
   MOVWF 40H;
   MOVLW B'00000001';位碼
   MOVWF 41H;
   MOVLW 50H;
   MOVWF FSR ;間接尋址
ZD02  MOVLW 0FFH;
   MOVFW TMR0;重裝初值
;***************************************************
;     恢復現(xiàn)場
   CLRF STATUS;恢復到體0
   MOVF    PCLATH_TEMP,0;開始恢復數(shù)據(jù) 
   MOVWF PCLATH;恢復PCLATH
   SWAPF STATUS_TEMP,0
   MOVWF STATUS;恢復STATUS
   SWAPF W_TEMP,1;半字交換后放回
   SWAPF W_TEMP,0;再半字交換后送W
;***************************************************
ZD03  BSF  INTCON,GIE;開總中斷
   RETFIE ;中斷返回

;********************************************
;    數(shù)據(jù)表
;********************************************      
   END 
關(guān)閉窗口

相關(guān)文章