|
;********************************************************** TMR0 EQU 01H ;定義定時器/計數(shù)器0寄存器地址 PCL EQU 02H ;定義程序計數(shù)器低字節(jié)寄存器地址 STATUS EQU 03H ;定義狀態(tài)寄存器地址 PORTA EQU 05H ;定義RA口數(shù)據(jù)寄存器地址 TRISA EQU 85H ;定義RA口方向控制寄存器地址 PORTB EQU 06H ;定義RB的數(shù)據(jù)寄存器地址 TRISB EQU 86H ;定義RB的方向控制寄存器地址 PORTC EQU 07H ;定義RC口數(shù)據(jù)寄存器地址 TRISC EQU 87H ;定義RC口方向控制寄存器地址 PORTD EQU 08H ;定義RD口數(shù)據(jù)寄存器地址 TRISD EQU 88H ;定義RD口方向控制寄存器地址 PORTE EQU 09H ;定義RE口數(shù)據(jù)寄存器地址 TRISE EQU 89H ;定義RE口方向控制寄存器地址 INTCON EQU 0BH ;定義中斷控制寄存器地址 OPTION_REG EQU 81H ;定義選項寄存器地址 ADCON1 EQU 9FH ;定義ADC模塊控制寄存器1的地址 C EQU 0 ;定義進位標志位的位地址 Z EQU 2 ;定義0標志位的位地址 RP0 EQU 5 ;定義狀態(tài)寄存器中的頁選位RP0 W EQU 0 ;定義傳送目標寄存器為W的指示位 F EQU 1 ;定義傳送目標寄存器為RAM的指示位 T0IF EQU 2 ;定義TMR0中斷標志位的位地址 T0IE EQU 5 ;定義TMR0中斷使能位的位地址 INTE EQU 4 ;定義外部中斷使能位的位地址 INTF EQU 1 ;定義外部中斷標志位的位地址 RBIF EQU 0 ; DC EQU 1 ; RBIE EQU 3 ; GIE EQU 7 ; PSA EQU 3 ; RB4 EQU 4 ; RB5 EQU 5 ; RB6 EQU 6 ; RB7 EQU 7 ; FLAG EQU 20H ; N1 EQU D'2' ; N2 EQU D'30' ; DATA1 EQU 21H ; DATA2 EQU 22H ; DATA3 EQU 23H ; DATA4 EQU 24H ; BUF EQU 28H ; BUF1 EQU 29H ; BUF2 EQU 2AH ; BUF3 EQU 2BH ; BUF4 EQU 2CH ; BUF5 EQU 2DH ; CNT1 EQU 2EH ; CNT2 EQU 2FH ; CNT3 EQU 30H ; CNT4 EQU 31H ; PORTB_B EQU 27H ; PORTC_B EQU 32H ; OPTION_TEMP EQU 33H ; PCLATH_B EQU 34H ; W_TEMP EQU 7FH ;W現(xiàn)場保護寄存器 STATUS_TEMP EQU 35H ;STATUS現(xiàn)場保護寄存器 BUF_TEMP EQU 36H ; BUF_TEMP1 EQU 37H ; BUF1_TEMP EQU 38H ; BUF1_TEMP1 EQU 39H ; PORTB_TEMP EQU 3AH ; PORTD_B EQU 3BH ; BUF2_TEMP EQU 3CH ; BUF2_TEMP1 EQU 3DH ; BUFF EQU 3EH ; ORG 000H ; NOP ;放置一條ICD必需的空操作指令 GOTO MAIN ; ORG 004H ; GOTO INTSERV ; ORG 008H ; MAIN BSF STATUS,RP0 ;設(shè)置寄存器體1 MOVLW 07H ;PSA=0 for tmr0, PS2,PS1,PS0=1 分頻比1:256 MOVWF OPTION_REG ;預(yù)分頻器分配給定時器0,開啟RB口弱上拉. MOVLW 07H ; MOVWF ADCON1 ;設(shè)置RA口全部為普通數(shù)字IO口 MOVLW 00H ; MOVWF TRISC ;RC口全部為輸出 MOVWF TRISD ;RD口全部為輸出 MOVLW 0FFH ; MOVWF TRISB ;RB口全部為輸入 BCF STATUS,RP0 ;恢復(fù)寄存器體0 ;********************************** KEYLOOP CALL DISP2 ; MOVF PORTB,W ; ANDLW B'00110111' ; XORLW B'00110111' ; BTFSC STATUS,Z ; GOTO KEYLOOP ; CALL delay10ms ; MOVF PORTB,W ; ANDLW B'00110111' ; XORLW B'00110111' ; BTFSC STATUS,Z ; GOTO KEYLOOP ; ;********************************* BTFSS PORTB, 0 ; GOTO KEY0 ; BTFSS PORTB, 1 ; GOTO KEY1 ; BTFSS PORTB, 2 ; GOTO KEY2 ; BTFSS PORTB, 4 ; GOTO KEY3 ; BTFSS PORTB, 5 ; GOTO KEY4 ; GOTO KEYLOOP ; ;********************************* KEY0 MOVLW 0A0H ; MOVWF INTCON ; MOVLW .16 ; MOVWF CNT2 ; MOVLW .12 ; MOVWF TMR0 ; GOTO WAITREL ; ;********************************* KEY4 MOVLW 00H ; MOVWF INTCON ; GOTO WAITREL ; ;********************************* KEY1 INCF BUF1, 1 ; MOVF BUF1, W ; ANDLW 0FH ; XORLW 0AH ; BTFSC STATUS,Z ; GOTO MIN_L ; GOTO WAITREL ; MIN_L MOVF BUF1, W ; ANDLW 0F0H ; MOVWF BUF1 ; GOTO WAITREL ; KEY2 MOVLW 10H ; ADDWF BUF1, F ; MOVF BUF1, W ; ANDLW 0F0H ; XORLW 60H ; BTFSC STATUS,Z ; GOTO MIN_H ; GOTO WAITREL ; MIN_H MOVF BUF1, W ; ANDLW 0FH ; MOVWF BUF1 ; GOTO WAITREL ;
KEY3 INCF BUF2, 1 ; MOVF BUF2, W ; ANDLW 0FH ; XORLW 0AH ; BTFSC STATUS,Z ; GOTO HOUR_L ; GOTO HOUR_H ; HOUR_L MOVF BUF2, W ; ANDLW 0F0H ; MOVWF BUF2 ; MOVLW 10H ; ADDWF BUF2, F ; MOVF BUF2, W ; ANDLW 0F0H ; XORLW 20H ; BTFSC STATUS,Z ; GOTO HOUR_H ; HOUR_H MOVF BUF2, W ; XORLW 24H ; BTFSC STATUS,Z ; CLRF BUF2 ; WAITREL CALL DISP2 ; MOVF PORTB,W ; ANDLW B'00110111' ; XORLW B'00110111' ; BTFSC STATUS,Z ; GOTO KEYLOOP1 ; GOTO WAITREL ; KEYLOOP1 CALL delay10ms ; GOTO KEYLOOP ; ;********************************* INTSERV MOVWF W_TEMP ; SWAPF STATUS,W ; CLRF STATUS ; MOVWF STATUS_TEMP ; BCF INTCON,T0IF ; DECFSZ CNT2,1 ; GOTO KEYOUT ; MOVLW .16 ; MOVWF CNT2 ; INCF BUF,1 ; MOVF BUF,W ; ANDLW 0FH ; XORLW 0AH ; BTFSS STATUS,Z ; GOTO KEYOUT ; MOVF BUF,W ; ANDLW 0F0H ; MOVWF BUF ; MOVLW 10H ; ADDWF BUF,1 ; MOVF BUF,W ; ANDLW 0F0H ; XORLW 60H ; BTFSS STATUS,Z ; GOTO KEYOUT ; CLRF BUF ; INCF BUF1,1 ; MOVF BUF1,W ; ANDLW 0FH ; XORLW 0AH ; BTFSS STATUS,Z ; GOTO KEYOUT ; MOVF BUF1,W ; ANDLW 0F0H ; MOVWF BUF1 ; MOVLW 10H ; ADDWF BUF1,1 ; MOVF BUF1,W ; ANDLW 0F0H ; XORLW 60H ; BTFSS STATUS,Z ; GOTO KEYOUT ; CLRF BUF1 ; INCF BUF2,1 ; MOVF BUF2,W ; ANDLW 0FH ; XORLW 0AH ; BTFSS STATUS,Z ; GOTO HOUR_OUT ; MOVF BUF2,W ; ANDLW 0F0H ; MOVWF BUF2 ; MOVLW 10H ; ADDWF BUF2,1 ; MOVF BUF2,W ; ANDLW 0F0H ; XORLW 20H ; BTFSS STATUS,Z ; GOTO HOUR_OUT ; HOUR_OUT MOVF BUF2, W ; XORLW 24H ; BTFSC STATUS,Z ; CLRF BUF2 ; KEYOUT MOVLW .12 ; MOVWF TMR0 ; SWAPF STATUS_TEMP,W ; MOVWF STATUS ; SWAPF W_TEMP,F ; SWAPF W_TEMP,W ; RETFIE ; ;********************************* ; 顯示子程序 ; ;********************************* DISP2 MOVF BUF, W ; ANDLW 0FH ; CALL convert ; MOVWF PORTC ; BCF PORTD,0 ; CALL DELAY ; BSF PORTD,0 ; MOVF BUF, W ; MOVWF BUF_TEMP ; SWAPF BUF_TEMP,W ; ANDLW 0FH ; CALL convert ; MOVWF PORTC ; BCF PORTD,1 ; CALL DELAY ; BSF PORTD,1 ; MOVF BUF1, W ; ANDLW 0FH ; CALL convert ; MOVWF PORTC ; BCF PORTD,2 ; CALL DELAY ; BSF PORTD,2 ; MOVF BUF1, W ; MOVWF BUF1_TEMP ; SWAPF BUF1_TEMP,W ; ANDLW 0FH ; CALL convert ; MOVWF PORTC ; BCF PORTD,3 ; CALL DELAY ; BSF PORTD,3 ; MOVF BUF2, W ; ANDLW 0FH ; CALL convert ; MOVWF PORTC ; BCF PORTD,4 ; CALL DELAY ; BSF PORTD,4 ; MOVF BUF2, W ; MOVWF BUF2_TEMP ; SWAPF BUF2_TEMP,W ; ANDLW 0FH ; CALL convert ; MOVWF PORTC ; BCF PORTD,5 ; CALL DELAY ; BSF PORTD,5 ; RETURN ; ;********************************* DELAY ;{2+[2+(1+2)*(DATA2-1)+2+1+2]*(DATA1-1)+2+2}=0.382MS MOVLW N1 ;(1) MOVWF DATA1 ;(1) DEL1 MOVLW N2 ;(1) MOVWF DATA2 ;(1) DEL2 DECFSZ DATA2,1 ;(1\2)DATA2-1=0? GOTO DEL2 ;(2) DECFSZ DATA1,1 ;(1\2)DATA1-1=0? GOTO DEL1 ;(2) RETURN ;(2) ;;******************************** delay10ms MOVLW .4 ;將外層循環(huán)參數(shù)值送到DATA3 MOVWF DATA3 ; LP0 MOVLW .3 ;將內(nèi)層循環(huán)參數(shù)值送到DATA4 MOVWF DATA4 ; LP1 CALL DISP2 ;(382*4+44)uS=1.572MS DECFSZ DATA4,1 ;變量DATA4內(nèi)容遞減,若為0則跳躍 GOTO LP1 ;跳轉(zhuǎn)到LP1 DECFSZ DATA3,1 ;變量DATA3內(nèi)容遞減,若為0則跳躍 GOTO LP0 ;跳轉(zhuǎn)到LP0 RETURN ;返回主程序 ;********************************** convert ADDWF PCL,1 ; TABLE RETLW 0C0H ; 0 RETLW 0F9H ; 1 RETLW 0A4H ; 2 RETLW 0B0H ; 3 RETLW 99H ; 4 RETLW 92H ; 5 RETLW 82H ; 6 RETLW 0F8H ; 7 RETLW 80H ; 8 RETLW 90H ; 9 END |