C語言例子:
uint16_t ADC_Read10bit(ADC_CHANNEL channel)
{
uint16_t result;
switch(channel)
{
case ADC_CHANNEL_3:
break;
default:
return 0xFFFF;
}
ADCHS0H = (channel & 0xFF);
ADCHS0L = (channel & 0xFF);
ADCON1Lbits.SAMP = 1; // Start AD sampling/convert sequence
while(ADCON1Lbits.DONE == 0); // Wait for result complete
result = ADCBUF3H;
result <<=8;
result |= ADCBUF3L;
return result;
}
ASM例子:
list p=18f452
; Include file, change directory if needed
include "p18f452.inc"
; Start at the reset vector
Reset_Vector code 0x000
goto Start
; Start application beyond vector area
code 0x002A
Start
clrf PORTB ;Clear PORTB
clrf TRISB ;PORTB all outputs, display 4 MSB's
;of A/D result on LEDs
movlw B'01000001' ;Fosc/8, A/D enabled
movwf ADCON0
movlw B'00001110' ;Left justify,1 analog channel
movwf ADCON1 ;VDD and VSS references
movlw B'11000111' ;TMR0 prescaler, 1:256
movwf T0CON
Main
btfss INTCON,TMR0IF ;Wait for Timer0 to timeout
goto Main
bcf INTCON,TMR0IF
bsf ADCON0,GO ;Start A/D conversion
Wait
btfss PIR1,ADIF ;Wait for conversion to complete
goto Wait
swapf ADRESH,W ;Swap A/D result nibbles
andlw 0x0f ;Mask off lower 4 bits
movwf PORTB ;Write A/D result to PORTB
clrf PORTB
WaitPush ;Pause while switch is pressed
btfss PORTA,4
goto WaitPush
movwf PORTB
goto Main ;Do it again
end
其時好簡單的,多用過幾次就可以了
|