Code:
#include <16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#device 16F877*=16 ADC=10
#use delay(clock=12000000)
#byte portb=0x06
#byte portc=0x08
#byte portd=0x07
#byte intcon=0x000B
#bit RBIF=intcon.0
#bit RBIE=intcon.3
#bit RB7=portb.7
Int16 ad1,ad2,ad0;
int8 a0,a1,a2,b0,b1,b2,c0,c1,c2 ;
int8 a=0 ;
const unsigned char digital[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x09} ;
#int_rb
void ngatRB7()
{
a=a+1;
RBIF=0;
}
void doc_ADC()
{
if(a%2)
{
portc=0x01;
set_ADC_channel(0);
ad0=read_ADC();
delay_us(10) ;
set_ADC_channel(1);
ad1=read_ADC();
delay_us(10) ;
set_adc_channel(2);
ad2=read_ADC() ;
delay_us(10) ;
}
else
{
portc=0x02;
set_ADC_channel(3);
ad0=read_ADC();
delay_us(10) ;
set_ADC_channel(4);
ad1=read_ADC();
delay_us(10) ;
set_adc_channel(5);
ad2=read_ADC() ;
delay_us(10) ;
}
}
void main()
{
set_tris_b(0b10000000);
set_tris_d(0);
set_tris_c(0);
enable_interrupts(global);
enable_interrupts(int_rb);
ext_int_edge(H_to_L);
setup_ADC(ADC_clock_internal);
setup_adc_ports(ALL_ANALOG);
while(true)
{
doc_ADC() ;
////hien chu so hang tram
// delay_ms(10) ;
portb=0x01 ;
c0=ad0/100 ;
portd=digital[c0] ;
portb=0x02 ;
c1=ad1/100 ;
portd=digital[c1] ;
portb=0x04 ;
c2=ad2/100 ;
portd=digital[c2];
portb=0x20 ;
delay_ms(2) ;
portb=0x00 ;
///chu hang chuc
portb=0x01;
b0=(ad0%100)/10 ;
portd=digital[b0] ;
portb=0x02;
b1=(ad1%100)/10 ;
portd=digital[b1] ;
portb=0x04 ;
b2=(ad2%100)/10 ;
portd=digital[b2] ;
portb=0x10 ;
delay_ms(2) ;
portb=0x00 ;
////chu hang don vi
portb=0x01 ;
a0=(ad0%10)%10 ;
portd=digital[a0] ;
portb=0x02 ;
a1=(ad1%10)%10 ;
portd=digital[a1] ;
portb=0x04 ;
a2=(ad2%10)%10 ;
portd=digital[a2];
portb=0x08;
delay_ms(2) ;
portb=0x00 ;
}
}
Mình thêm vào tí ngắt rb trên RB7 khi nhấn vao thi thay đổi từ 3 kênh 1.2.3 sang 4.5.6 và c0 hoăc c1 sẽ sáng để báo hiểu
Hình như mình viết ngắt ngoài có vấn đề led h ko sáng nữa.