Code:
#include <16f887.h> #fuses HS,NOWDT,NOPROTECT,NOLVP #use delay(clock=4000000) //su dung thach anh 4Mhz #use fast_io(a) #use fast_io(b) #use fast_io(c) #use fast_io(d) #byte PORTA=0x05 #byte PORTB=0x06 #byte PORTC=0x07 #byte PORTD=0x08 #byte PORTE=0x09 #byte intcon=0x000b #bit RA0=PORTA.0 #bit RA1=PORTA.1 #bit RA2=PORTA.2 #bit RA3=PORTA.3 #bit RB0=PORTB.0 #bit RB1=PORTB.1 #bit RB2=PORTB.2 #bit RB3=PORTB.3 #bit RB4=PORTB.4 #bit RB5=PORTB.5 #bit RB6=PORTB.6 #bit RB7=PORTB.7 #bit RC0=PORTC.0 #bit RC1=PORTC.1 #bit RC2=PORTC.2 #bit RD0=PORTD.0 #bit RD1=PORTD.1 #bit RD2=PORTD.2 #bit RD3=PORTD.3 #bit RD4=PORTD.4 #bit RD5=PORTD.5 #bit RD6=PORTD.6 #bit RD7=PORTD.7 #bit RBIF=intcon.0 //dinh nghia co ngat RB #bit RBIE=intcon.3 //dinh nghia bit cho phep ngat RB unsigned char so[10]={0b00000000, 0b00000001, 0b00000010, 0b00000011, 0b00000100, 0b00000101, 0b00000110, 0b00000111, 0b00001000, 0b00001001}; int o=0; int m=0; int n=0; int k; int z, t, i; int ON=0; int RESET=0; int START=0; int OFF=0; int MACDINH=0; int DIEUCHINH=0; void dem() { if(n==10) { n=0; m++; if(m==10) { m=0; o++; if(o==10) o=0; } } } void xuly() { RC0=1;RC1=0;RC2=0; PORTD=so[n]; delay_ms(10); RC0=0;RC1=1;RC2=0; PORTD=so[m]; delay_ms(10); RC0=0;RC1=0;RC2=1; PORTD=so[o]; delay_ms(10); } #int_RB void ngat_RB() { if((RBIF)&&(RBIE)) { if(RB4&&RB0) k=0; if(RB4&&RB1) k=1; if(RB4&&RB2) k=2; if(RB4&&RB3) k=3; if(RB5&&RB0) k=4; if(RB5&&RB1) k=5; if(RB5&&RB2) k=6; if(RB5&&RB3) k=7; if(RB6&&RB0) k=8; if(RB6&&RB1) k=9; if(RB6&&RB2) {START=1;RESET=0;} if(RB6&&RB3) {RESET=1; START=0;} if(RB7&&RB0) {ON=1;OFF=0;} if(RB7&&RB1) {OFF=1;ON=0;} if(RB7&&RB2) MACDINH=1; if(RB7&&RB3) DIEUCHINH=1; RBIF=0; //Xoa co ngat RB } } void main() { set_tris_a(0b0); set_tris_b(0b11110000); set_tris_c(0b0); set_tris_d(0b00000000); set_tris_e(0b11111111); enable_interrupts(global); enable_interrupts(int_RB); ext_int_edge(H_to_L); //RC0=1;RC1=1;RC2=1; //PORTD=so[0]; //delay_ms(10); while(true) { PORTB=0b1110; PORTB=0b1101; PORTB=0b1011; PORTB=0b0111; xuly(); } }
Vô vấn đề chính. Em quét phím sử dụng ngắt RB. Nếu bỏ phần gọi hàm ở trong while(1) thì quét bình thường, còn nếu đặt hàm quét led trong while(1) thì không quét phím được.
Hình minh họa không quét phím được thì gọi hàm trong while(1)
Khi có gọi hàm trong while(1) thì nó quét phím bị treo ở chân RB3
Em mới thử gọi 1 hàm mà không được thì làm sao code tiếp được.
Vừa dùng hàm delay vừa interrupt thì k sử dụng hàm xuly() trong hàm interrupt phải không các bác.
Code em có phải sửa ở chỗ nào không, nếu sửa lại thì sửa lại như thế nào, phần code xử lý xuất led khi quét phím nằm ở hàm interrupt hay nằm trong while(1) hả các bác
Comment