|
;****************************************************************************** TMR0 EQU 01H ;定義定時(shí)器/計(jì)數(shù)器0寄存器地址 PCL EQU 02H ;定義程序計(jì)數(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 ;定義選項(xiàng)寄存器地址 ADCON1 EQU 9FH ;定義ADC模塊控制寄存器1的地址
C EQU 0 ;定義進(jìn)位標(biāo)志位的位地址 Z EQU 2 ;定義0標(biāo)志位的位地址 RP0 EQU 5 ;定義狀態(tài)寄存器中的頁選位RP0 W EQU 0 ;定義傳送目標(biāo)寄存器為W的指示位 F EQU 1 ;定義傳送目標(biāo)寄存器為RAM的指示位 T0IF EQU 2 ;定義TMR0中斷標(biāo)志位的位地址 T0IE EQU 5 ;定義TMR0中斷使能位的位地址 INTE EQU 4 ;定義外部中斷使能位的位地址 INTF EQU 1 ;定義外部中斷標(biāo)志位的位地址 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 ;
RS EQU 3 ; RW EQU 2 ; LCDE EQU 1 ;
SCL EQU 3 ; SDA EQU 4 ;
FLAG EQU 20H ; N1 EQU D’2’ ; N2 EQU D’30’ ; DATA1 EQU 21H ; DATA2 EQU 22H ; DATA3 EQU 23H ; DATA4 EQU 24H ; DATA5 EQU 25H ; DATA6 EQU 26H ; BUF EQU 27H ; BUF1 EQU 28H ; BUF2 EQU 29H ; BUF3 EQU 2AH ; BUF4 EQU 2BH ; BUF5 EQU 2CH ; CNT1 EQU 2DH ; CNT2 EQU 2EH ; CNT3 EQU 2FH ; CNT4 EQU 30H ; PORTB_B EQU 31H ; PORTC_B EQU 32H ; PORTD_B EQU 33H ; PCLATH_B EQU 34H ; W_TEMP EQU 7FH ;W現(xiàn)場保護(hù)寄存器 STATUS_TEMP EQU 35H ;STATUS現(xiàn)場保護(hù)寄存器 BUF_TEMP EQU 36H ; BUF_TEMP1 EQU 37H ; BUF1_TEMP EQU 38H ; BUF1_TEMP1 EQU 39H ; BUF2_TEMP EQU 3AH ; BUF2_TEMP1 EQU 3BH ; PORTB_TEMP EQU 3CH ; OPTION_TEMP EQU 3DH ; BUFLCD EQU 3EH ; BUFLCD1 EQU 3FH ; KEY_B EQU 40H ; KEYBUF EQU 41H ; KEYBUF1 EQU 42H ; KEYCNT EQU 43H ;
ORG 000H ; NOP ;放置一條ICD必需的空操作指令 GOTO MAIN ; ORG 004H ; GOTO INTSERV ; ORG 008H ; ;********************************** TABLE3 ; ADDWF PCL,1 ; RETLW 0EEH ; RETLW 0DEH ; RETLW 0BEH ; RETLW 7EH ; RETLW 0EDH ; RETLW 0DDH ; RETLW 0BDH ; RETLW 7DH ; RETLW 0EBH ; RETLW 0DBH ; RETLW 0BBH ; RETLW 7BH ; RETLW 0E7H ; RETLW 0D7H ; RETLW 0B7H ; RETLW 77H ; RETLW 55H ; ;*********************************** 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 ;********************************** MAIN BSF STATUS,RP0 ;設(shè)置寄存器體1 MOVLW 07H ;PSA=0 for tmr0, PS2,PS1,PS0=1 分頻比1:256 MOVWF OPTION_REG ;預(yù)分頻器分配給定時(shí)器0,開啟RB口弱上拉. MOVLW 07H ; MOVWF ADCON1 ;設(shè)置RA口全部為普通數(shù)字IO口 MOVLW 00H ; MOVWF TRISC ;RC口全部為輸出 MOVWF TRISE ; MOVLW 0F0H ; MOVWF TRISD ;RD口全部為輸出 MOVLW 0FFH ; MOVWF TRISB ;RB口全部為輸入 BCF STATUS,RP0 ;恢復(fù)寄存器體0 MOVLW 0FFH ; MOVWF PORTD ; ;********************************** KEYLOOP CALL DISP2 ; CALL KEYWORK ; GOTO KEYLOOP ; ;********************************* KEYWORK MOVLW 0FFH ; MOVWF PORTD ; BCF PORTD, 0 ; MOVF PORTD, W ; ANDLW 0F0H ; XORLW 0F0H ; BTFSS STATUS,Z ; GOTO KEYROW ; BSF PORTD, 0 ; BCF PORTD, 1 ; MOVF PORTD, W ; ANDLW 0F0H ; XORLW 0F0H ; BTFSS STATUS,Z ; GOTO KEYROW ; BSF PORTD, 1 ; BCF PORTD, 2 ; MOVF PORTD, W ; ANDLW 0F0H ; XORLW 0F0H ; BTFSS STATUS,Z ; GOTO KEYROW ; BSF PORTD, 2 ; BCF PORTD, 3 ; MOVF PORTD, W ; ANDLW 0F0H ; XORLW 0F0H ; BTFSS STATUS,Z ; GOTO KEYROW ; BSF PORTD, 3 ; GOTO WAITREL ; KEYROW CALL DELAY10MS ; MOVF PORTD, W ; ANDLW 0F0H ; XORLW 0F0H ; BTFSC STATUS,Z ; GOTO WAITREL ; KEYCHE MOVF PORTD,W ; MOVWF KEYBUF ; CLRF KEYCNT ; CHEKEYLP MOVF KEYCNT, W ; CALL TABLE3 ; MOVWF KEYBUF1 ; XORWF KEYBUF, W ; BTFSC STATUS, Z ; GOTO KEYOK ; INCF KEYCNT, 1 ; MOVF KEYBUF1,W ; XORLW 55H ; BTFSC STATUS, Z ; GOTO WAITREL ; GOTO CHEKEYLP ; KEYOK MOVF KEYCNT,W ; XORLW 00H ; BTFSC STATUS,Z ; GOTO WAITREL ;
MOVF KEYCNT, W ; XORLW 01H ; BTFSC STATUS,Z ; GOTO KEY1 ;
MOVF KEYCNT, W ; XORLW 02H ; BTFSC STATUS,Z ; GOTO KEY2 ;
MOVF KEYCNT, W ; XORLW 03H ; BTFSC STATUS,Z ; GOTO KEY3 ;
MOVF KEYCNT, W ; XORLW 04H ; BTFSC STATUS,Z ; GOTO KEY4 ;
MOVF KEYCNT, W ; XORLW 05H ; BTFSC STATUS,Z ; GOTO KEY1 ;
MOVF KEYCNT, W ; XORLW 06H ; BTFSC STATUS,Z ; GOTO KEY2 ;
MOVF KEYCNT, W ; XORLW 07H ; BTFSC STATUS,Z ; GOTO KEY3 ;
MOVF KEYCNT, W ; XORLW 08H ; BTFSC STATUS,Z ; GOTO KEY4 ;
MOVF KEYCNT, W ; XORLW 09H ; BTFSC STATUS,Z ; GOTO KEY1 ;
MOVF KEYCNT, W ; XORLW 0AH ; BTFSC STATUS,Z ; GOTO KEY2 ;
MOVF KEYCNT, W ; XORLW 0BH ; BTFSC STATUS,Z ; GOTO KEY3 ;
MOVF KEYCNT, W ; XORLW 0CH ; BTFSC STATUS,Z ; GOTO KEY4 ;
MOVF KEYCNT, W ; XORLW 0DH ; BTFSC STATUS,Z ; GOTO KEY1 ;
MOVF KEYCNT, W ; XORLW 0EH ; BTFSC STATUS,Z ; GOTO KEY2 ;
MOVF KEYCNT, W ; XORLW 0FH ; BTFSC STATUS,Z ; GOTO KEY3 ; WAITREL CALL DISP2 ; MOVF PORTD,W ; ANDLW B’11110000’ ; XORLW B’11110000’ ; BTFSC STATUS,Z ; GOTO KEYLOOP1 ; GOTO WAITREL ; KEYLOOP1 CALL DELAY10MS ; RETURN ; ;********************************* KEY1 MOVLW 0A0H ; MOVWF INTCON ; MOVLW .16 ; MOVWF CNT2 ; MOVLW .12 ; MOVWF TMR0 ; GOTO WAITREL ; ;********************************* KEY2 MOVLW 00H ; MOVWF INTCON ; GOTO WAITREL ; ;********************************* KEY3 INCF BUF, 1 ; MOVF BUF, W ; ANDLW 0FH ; XORLW 0AH ; BTFSC STATUS,Z ; GOTO MIN_L ; GOTO WAITREL ; MIN_L MOVF BUF, W ; ANDLW 0F0H ; MOVWF BUF ; GOTO WAITREL ; ;********************************* KEY4 MOVLW 10H ; ADDWF BUF, F ; MOVF BUF, W ; ANDLW 0F0H ; XORLW 60H ; BTFSC STATUS,Z ; GOTO MIN_H ; GOTO WAITREL ; MIN_H MOVF BUF, W ; ANDLW 0FH ; MOVWF BUF ; GOTO WAITREL ; ;********************************* 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 ;
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 PORTE,1 ; CALL DELAY ; BSF PORTE,1 ;
MOVF BUF, W ; MOVWF BUF_TEMP ; SWAPF BUF_TEMP,W ; ANDLW 0FH ; CALL convert ; MOVWF PORTC ; BCF PORTE,2 ; CALL DELAY ; BSF PORTE,2 ; 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 .8 ;將外層循環(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 ;返回主程序 END |