Code:
#include <16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#device 16F877*=16 ADC=10
#use delay(clock=12000000)
#byte portb=0x06
#byte portc=0x07
#byte portd=0x08
#byte intcon=0x000B
#bit RBIF=intcon.0
#bit RBIE=intcon.3
Int16 ad1,ad2,ad0;
int8 a,a0,a1,a2,b0,b1,b2,c0,c1,c2 ;
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==0)
{
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
{
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_d(0) ;
set_tris_b(0b11110000);
set_tris_c(0);
setup_ADC(ADC_clock_internal);
setup_adc_ports(ALL_ANALOG);
enable_interrupts(global);
enable_interrupts(int_rb);
ext_int_edge(h_to_l);
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];
portc=0x01 ;
delay_ms(2) ;
portc=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] ;
portc=0x02 ;
delay_ms(2) ;
portc=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];
portc=0x04;
delay_ms(2) ;
portc=0x00 ;
}
}
Mình đã đổi sang c0.c1.c2.
nhưng khi nó đang chạy nhấn rb7 1 cái thì nó dính vào ngắt luôn hay sao ấy(Chỉ còn 1 cột đèn và không có đọc trên ADC) mình đã cho RBIF =0 khi thoát khỏi ngắt mà vẫn không được.
-Với lại lúc mình set_tris_b(0b100000000) thì không phải là chỉ ngắt trên rb7 hay sao mấy chi rb4 đến rb5 mình set là output mà.