#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