實驗板顯示8位AD值
;**
list p=16f877A ; list directive to define processor
include ; processor specific variable definitions
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF
;——————————-
COUNTER EQU 20H ;計數寄存器
COUNT1 EQU 21H
COUNT2 EQU 22H
TABADD EQU 23H ;查表地址寄存器
DISPBUF EQU 24H ;顯示值暫存
DISPBUF_H EQU 25H ;顯示器高位
DISPBUF_L EQU 26H ;顯示器低位
BUFFER EQU 27H ;BCD十進制結果存放
BUFFER1 EQU 28H ;BCD轉換緩存
SUM EQU 29H ;校正+3緩存
DIGIT EQU 2AH ;數據顯示寄存器
HB EQU 2BH ;百位寄存器
;——————————
ORG 0000H
NOP
GOTO MAIN
ORG 0005H
MAIN
;** 初始化程序 *
CLRF PORTA
CLRF PORTC ;初始化IO口
BSF STATUS,RP0 ;設置寄存器體1
MOVLW 0EH ;轉換結果左對齊,只選1個A/D通道RA0/AN0
MOVWF ADCON1 ;選擇VDD和VSS作參考源
MOVLW 01H ;RA0為模擬輸入
MOVWF TRISA ;RA1~5為輸出
MOVLW 00H ;RC為LED段輸出
MOVWF TRISC
BCF STATUS,RP0 ;恢復寄存器體0
MOVLW 0FFH ;先讓數碼管全部不顯示
MOVWF PORTC
MOVWF PORTA
MOVLW 81H ;選擇:時鐘時鐘源為FOSC/8,允許ADC工作
MOVWF ADCON0 ;通道AN0,暫時不啟動轉換過程
CLRF DISPBUF ;清顯示值
;**
ADC
BSF ADCON0,GO ;開啟A/D轉換過程
BTFSS PIR1,ADIF ;等待A/D轉換過程結束,檢測ADC中斷標志位
GOTO ADC ;如果沒有轉換結束,則返回循環檢測
MOVF ADRESH,W ;僅取高8位,把A/D結果讀到W
MOVWF DIGIT ;注入顯示寄存器
;** BCD **
LOOP1
CALL DISP ;調用顯示子程序
MOVLW 8
MOVWF COUNTER ;循環左移計數器置8
CLRF BUFFER ;清除緩沖器
MOVF DIGIT,W
MOVWF BUFFER1
LOOP2
RLF BUFFER1,1 ;二進制數轉換成BCD碼(以便顯示)
RLF BUFFER,1
DECFSZ COUNTER,1 ;左移8次
GOTO ADJUST ;
MOVFW BUFFER
MOVWF DISPBUF ;是否有進位(即已達100),如已計數到100則
GOTO ADC
;GOTO MAIN
ADJUST
MOVLW 3 ;二進制轉BCD的調整
ADDWF BUFFER,W ;每次移位后都檢查低四位LSD+3是否大于7
MOVWF SUM
BTFSC SUM,3
MOVWF BUFFER
MOVLW 30H
ADDWF BUFFER,W ;如果是則再加3,否則不加。
MOVWF SUM
BTFSC SUM,7
MOVWF BUFFER ;接著再將高四位MSD作相同處理
GOTO LOOP2
;** 顯示程序 *
DISP
CLRF HB
MOVLW 0C8H ; 送入199至W,
SUBWF DIGIT,W ; F-W
BTFSC STATUS,C ; 檢測C是否出現借位
GOTO HB200 ; F>199,百位數顯示2
MOVLW 64H ; F<199,再送99至W
SUBWF DIGIT,W ; F-W
BTFSC STATUS,C ; 檢測C是否出現借
位
GOTO HB100 ; 199>F>99,百位數顯示1
GOTO DISP10 ; F<99,百位不顯示
HB200 MOVLW 2H
MOVWF HB ;百位顯示數移入寄存器
GOTO DISP100
HB100 MOVLW 1H
MOVWF HB ;百位顯示數移入寄存器
DISP100 MOVLW 0FFH ;顯示百位
MOVWF PORTC
BCF PORTA,2 ;RA2為百位顯示
BSF PORTA,5
BSF PORTA,4
MOVLW TABLE ;查表
MOVWF TABADD
MOVF HB,W
ADDWF TABADD,W
CALL CONVERT
MOVWF PORTC ;顯示內容送RC
CALL DELAY
DISP10 MOVF DISPBUF,W ;顯示值低位處理
ANDLW 0FH ;屏蔽掉高位
MOVWF DISPBUF_L ;存入寄存器
SWAPF DISPBUF,W ;顯示值高低位交換,先處理高位
ANDLW 0FH ;屏蔽掉高位
MOVWF DISPBUF_H ;存入寄存器
MOVF HB,W
ADDWF DISPBUF_H,W ;如果百位和十位同為零不顯示
BTFSC STATUS,Z
GOTO DISP01
MOVLW 0FFH ;顯示十位
MOVWF PORTC ;先熄滅數碼管以免閃爍
BCF PORTA,5 ;先顯示低位
BSF PORTA,2
BSF PORTA,4
MOVLW TABLE
MOVWF TABADD ;將轉換表的首地址存入
TABADD
MOVFW DISPBUF_H ;計數值(W)與轉換表的起始地址相加
ADDWF TABADD,W
CALL CONVERT ;存入W后調用轉換表子程序
MOVWF PORTC ;送RB口顯示
CALL DELAY ;廷時4。7MS
DISP01 MOVLW 0FFH ;同樣方法顯示個位
MOVWF PORTC
BCF PORTA,4
BSF PORTA,2
BSF PORTA,5
MOVLW TABLE
MOVWF TABADD
MOVFW DISPBUF_L
ADDWF TABADD,W
CALL CONVERT
MOVWF PORTC
CALL DELAY
RETLW 0
;** 查表顯示 *
CONVERT
MOVWF PCL ;將W寄存器內的7段顯示碼地址放入PC
TABLE ;PC執行新地址指令, 跳到相對的地址執行?
RETLW 0C0H ;0
RETLW 0F9H ;1
RETLW 0A4H ;2
RETLW 0B0H ;3
RETLW 099H ;4
RETLW 092H ;5
RETLW 082H ;6
RETLW 0D8H ;7
RETLW 080H ;8
RETLW 090H ;9
;* 延時程序 **
CONVERT
MOVWF PCL ;將W寄存器內的7段顯示碼地址放入PC
TABLE ;PC執行新地址指令, 跳到相對的地址執行?
RETLW 0C0H ;0
RETLW 0F9H ;1
RETLW 0A4H ;2
RETLW 0B0H ;3
RETLW 099H ;4
RETLW 092H ;5
RETLW 082H ;6
RETLW 0D8H ;7
RETLW 080H ;8
RETLW 090H ;9
;* 延時程序 **