|
; LIST P=16F877 ;列表偽指令 ; INCLUDE "P16F877.INC" ;把包含文件含入源程序 ;***************************************** ; 請設置顯示相關寄存器 * ;***************************************** Byte EQU 20H Count EQU 21H Count1 EQU 22H CONVERT EQU 23H BUF EQU 24H BUF1 EQU 25H BUF2 EQU 26H BUF_TEMP EQU 27H BUF1_TEMP EQU 28H BUF2_TEMP EQU 29H ;****************************************** ;寄存器用做變量寄存器 ;****************************************** N1 EQU 2 ; N2 EQU 30 ; Temp EQU 30H ; TempH EQU 31H ; TempL EQU 32H ; Count3 EQU 33H ; DATA1 EQU 33H ; DATA2 EQU 34H ; ;****************************************** ORG 0000H ; GOTO START ; ; NOP ;放置一條ICD必段的空操作指令 START: BCF STATUS,RP0 ;設置寄存器體0 CLRF PORTC ;清PORTC MOVLW 41h ;010000001選擇:時鐘時鐘源為FOSC/8,允許ADC工作 MOVWF ADCON0 ;通道AN0,暫時不啟動轉換過程 BSF STATUS,RP0 ;設置寄存器體1 MOVLW 87H ;10000111設定:RB口不用上拉,分頻器配給TMR0 MOVWF OPTION_ ;分頻比設為1:256 CLRF TRISC ;PORTC所有管腳設為輸出(接LED) MOVLW 0EH ;00001110轉換結果左對齊,只選1個A/D通道RA0/AN0 MOVWF ADCON1 ;選擇VDD和VSS作參考源 BCF STATUS,RP0 ;設置寄存器體0 ;--------------------------------- MAIN: ; BTFSS INTCON,T0IF ;等待和循環(huán)檢測TMR0溢出中斷標志位 ; GOTO MAIN ;如果沒有發(fā)生TMR0溢出中斷則返回循環(huán)檢測 ; BCF INTCON,T0IF ;如果發(fā)生了TMR0溢出中斷,則清除標志位T0IF BSF ADCON0,GODONE ;開啟A/D轉換過程 WAIT: GOTO DISP ; BTFSS PIR1,ADIF ;等待A/D轉換過程結束,檢測ADC中斷標志位 GOTO WAIT ;如果沒有轉換結束,則返回循環(huán)檢測 MOVF ADRES,W ;如果轉換完畢,則把A/D結果讀到W ; MOVWF PORTC ;經(jīng)過W送C口LED顯示 MOVWF TEMP ; GOTO BIN2BCD ; MOVF TEMPL,W ; MOVWF BUF ; MOVF TEMPH,W ; MOVWF BUF1 ; GOTO DISP ; GOTO MAIN ;循環(huán)進行A/D轉換 ;************************************************ ;* Bin2BCD - 將 Temp 寄存器內的二進制數(shù)轉 * ;* 換為相應的 ASCII 碼并存為 TempH:TempL 的形式 * ;************************************************ Bin2BCD: clrf TempH ; Initialize variables MOVf Temp,W MOVwf TempL Ttenth: ; Subtract 10 from low variable MOVlw 0AH ; until result is < 0. On each subwf TempL,W ; subtraction, increment the btfss STATUS,C ; temperature high byte. goto Over MOVwf TempL incf TempH,F goto Ttenth Over: return ;********************************* ; 顯示子程序 ; ;********************************* DISP: 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 ; 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) ;------------------------------------------------ END ;源程序結束
|