xin chào các a chị trong diễn đàn. e có vấn đề cần nhờ mọi người giúp em ạ. e định dùng 6 nút nhấn nối với các chân b0,b1,b2,b3,b4,b5 port b (pic16f877a) và kết hợp chế độ định thời của timer1 để xuất tín hiệu ra port c là chân C0, C1,C2. chân b0 nhấn thì xuất ra c0 chân này không dùng ngắt int_timer1. chân b0 e làm dc rồi. chân b1 xuất ra chân c1 không dùng ngắt thì e cũng làm đươc. chỉ còn 3 chân b2,b3,b4, là chưa kết hợp với chế độ định thời của timer 1 để xuất ra chân c2. chân b5 là chân stop cho các chân còn lại. vấn đề của e đã dùng ngắt int_timer1 nhưng nó chạy ngắt trước khi e nhấn các nút b2,b3,b4 ở portb. nhờ a chị giúp đỡ e ạ
đây là code của e:
#include <16F877A.h>
#device ADC=16
#bit TMR1IF=0X0C.0 // dinh nghia bit tran thanh ghi
#FUSES NOWDT //No Watch Dog Timer
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES HS
//!#FUSES NOWDT //No Watch Dog Timer
//!#FUSES NOBROWNOUT //No brownout reset
//!#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
//!#FUSES XT
//!#FUSES NOPUT
//!#FUSES NOPROTECT
//!#FUSES NODEBUG
//!#FUSES NOCPD
#use delay(crystal=8000000)// thach anh 8Mhz
/* dinh nghia lcd
#define LCD_ENABLE_PIN PIN_E0
#define LCD_RS_PIN PIN_E1
#define LCD_RW_PIN PIN_E2
#define LCD_DATA4 PIN_D4
#define LCD_DATA5 PIN_D5
#define LCD_DATA6 PIN_D6
#define LCD_DATA7 PIN_D7
#include<LCD.C>
*/
///////////////////////////////////////////
#define button_0 input(pin_b0)
#define button_1 input(pin_b1)
#define button_2 input(pin_b2)
#define button_3 input(pin_b3)
#define button_4 input(pin_b4)
#define button_5 input(pin_b5)
#define output_bit(c0)
#define output_bit(c1)
#define output_bit(c2)
/////////////////////////////////////////
unsigned long bdt = 0 ;
unsigned char mode = 0 ;
int1 t0;
int1 t1;
//int1 t2;
//int1 t3;
//int1 t4;
#int_timer1 // ngat timer 1
void timer1_isr()
{
set_timer1(0);// set gia tri ban dau cho timer 1 la 0
bdt++;//tang bien dem tran
for(mode=0;mode<=4;mode++)// vong lap cho bien mode
{
if(MODE==1)
{
if(bdt == 45)
{
output_high(pin_c2);// xuat tin hieu sau 3s
}
if(bdt == 122)
{
output_low(pin_c2);// tat tin hieu sau 5s
bdt=0;//xoa co tran
set_timer1(0);// set gia tri ban dau cho timer 1 la 0
}
}
}
}
//! if(MODE==2) // tuong tu MODE 1
//! {
//! if(bdt == 45)
//! {
//! output_high(pin_c2);
//! }
//! if(bdt == 106)
//! {
//! output_low(pin_c2);
//! bdt=0;
//! }
//! set_timer1(0);
//! }
//! if(MODE==3) // cach viet tuong tu MODE 1
//! {
//! if(bdt == 45)
//! {
//! output_high(pin_c2);
//! }
//! if(bdt == 91)
//! {
//! output_low(pin_c2);
//! bdt=0;
//! }
//! set_timer1(0);
//! }
//!
//! if(MODE==4) // cach viet tuong tu MODE 1
//! {
//! output_c(0x00);
//! bdt=0;
//! set_timer1(0);
//! }
//! }
//!}
void ktrr()
{
if((button_0)==0)
delay_ms(20);
{
if((button_0)==0)
{
t0=1;
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc(" JSC ");
delay_ms(20);
lcd_gotoxy(1,2);
lcd_putc(" DANG CAP KHI ");
delay_ms(20);
}
}
}
void tatkhi()
{
if((button_5)==0)
delay_ms(20);
{
if((button_5)==0)
{
t0=0;
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc(" JSC ");
delay_ms(20);
lcd_gotoxy(1,2);
lcd_putc(" STOP ");
delay_ms(20);
}
}
}
void batbom()
{
if((button_1)==0)
delay_ms(20);
{
if((button_1)==0)
{
t1=1;
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc(" JSC ");
delay_ms(20);
lcd_gotoxy(1,2);
lcd_putc(" DANG CAP NUOC ");
delay_ms(20);
}
}
}
void tatbom()
{
if((button_5)==0)
delay_ms(20);
{
if((button_5)==0)
{
t1=0;
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc(" JSC ");
delay_ms(20);
lcd_gotoxy(1,2);
lcd_putc(" STOP ");
delay_ms(20);
}
}
}
void xungthap()
{
if((button_2)==0)
delay_ms(20);
{
if((button_2)==0)
{
bdt++;
mode=1;
if(mode==1)
{
timer1_isr();
//enable_interrupts(int_timer1);
//enable_interrupts(global);
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc(" JSC ");
delay_ms(20);
lcd_gotoxy(1,2);
lcd_putc(" XUNG THAP ");
delay_ms(20);
}
//bdt=0;
//set_timer1(0);
}
}
}
void tatxung()
{
if((button_5)==0)
delay_ms(20);
{
if((button_5)==0)
{
mode=4;
if(mode==4)
{
output_c(0x00);
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc(" HUNG PHAT JSC ");
delay_ms(20);
lcd_gotoxy(1,2);
lcd_putc(" STOP XUNG ");
delay_ms(20);
}
}
}
}
void main()
{
t0=t1=0;
bdt=0;
output_c(0x00);
set_tris_e(0x00);
set_tris_d(0x00);
set_tris_b(0xff);
set_tris_c(0x00);
lcd_init();
delay_ms(20);
lcd_gotoxy(1,1);
lcd_putc(" JSC ");
delay_ms(200);
lcd_gotoxy(1,2);
lcd_putc(" ");
delay_ms(200);
setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_2 );
set_timer1(0);
//disable_interrupts(int_timer1);
//disable_interrupts(global);
enable_interrupts(int_timer1);
enable_interrupts(global);
/*
cach tinh chu ki may voi F=8Mhz va bo chia tan là 2:
Tcyl= 4 x (1/Fosc) x (prescale: là he so chia)
= 4 x (1/8Mhz) x
= 1 us
==> Tmax cua timer1 dem het 65536 gia tri la 65536x1=65536us
muon tao thoi gian tre 1s=1000ms=1000000us
vay so làn xay ra ngat la 1000000/65536=15.2 lan
*/
while(TRUE)
{
ktrr(); if(t0==1) {output_high(pin_c0);}
batbom(); if(t1==1) {output_high(pin_c1);}
tatkhi(); if(t0==0) {output_low(pin_c0);}
tatbom(); if(t1==0) {output_low(pin_c1);}
xungthap();
tatxung();
}
đây là code của e:
#include <16F877A.h>
#device ADC=16
#bit TMR1IF=0X0C.0 // dinh nghia bit tran thanh ghi
#FUSES NOWDT //No Watch Dog Timer
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES HS
//!#FUSES NOWDT //No Watch Dog Timer
//!#FUSES NOBROWNOUT //No brownout reset
//!#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
//!#FUSES XT
//!#FUSES NOPUT
//!#FUSES NOPROTECT
//!#FUSES NODEBUG
//!#FUSES NOCPD
#use delay(crystal=8000000)// thach anh 8Mhz
/* dinh nghia lcd
#define LCD_ENABLE_PIN PIN_E0
#define LCD_RS_PIN PIN_E1
#define LCD_RW_PIN PIN_E2
#define LCD_DATA4 PIN_D4
#define LCD_DATA5 PIN_D5
#define LCD_DATA6 PIN_D6
#define LCD_DATA7 PIN_D7
#include<LCD.C>
*/
///////////////////////////////////////////
#define button_0 input(pin_b0)
#define button_1 input(pin_b1)
#define button_2 input(pin_b2)
#define button_3 input(pin_b3)
#define button_4 input(pin_b4)
#define button_5 input(pin_b5)
#define output_bit(c0)
#define output_bit(c1)
#define output_bit(c2)
/////////////////////////////////////////
unsigned long bdt = 0 ;
unsigned char mode = 0 ;
int1 t0;
int1 t1;
//int1 t2;
//int1 t3;
//int1 t4;
#int_timer1 // ngat timer 1
void timer1_isr()
{
set_timer1(0);// set gia tri ban dau cho timer 1 la 0
bdt++;//tang bien dem tran
for(mode=0;mode<=4;mode++)// vong lap cho bien mode
{
if(MODE==1)
{
if(bdt == 45)
{
output_high(pin_c2);// xuat tin hieu sau 3s
}
if(bdt == 122)
{
output_low(pin_c2);// tat tin hieu sau 5s
bdt=0;//xoa co tran
set_timer1(0);// set gia tri ban dau cho timer 1 la 0
}
}
}
}
//! if(MODE==2) // tuong tu MODE 1
//! {
//! if(bdt == 45)
//! {
//! output_high(pin_c2);
//! }
//! if(bdt == 106)
//! {
//! output_low(pin_c2);
//! bdt=0;
//! }
//! set_timer1(0);
//! }
//! if(MODE==3) // cach viet tuong tu MODE 1
//! {
//! if(bdt == 45)
//! {
//! output_high(pin_c2);
//! }
//! if(bdt == 91)
//! {
//! output_low(pin_c2);
//! bdt=0;
//! }
//! set_timer1(0);
//! }
//!
//! if(MODE==4) // cach viet tuong tu MODE 1
//! {
//! output_c(0x00);
//! bdt=0;
//! set_timer1(0);
//! }
//! }
//!}
void ktrr()
{
if((button_0)==0)
delay_ms(20);
{
if((button_0)==0)
{
t0=1;
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc(" JSC ");
delay_ms(20);
lcd_gotoxy(1,2);
lcd_putc(" DANG CAP KHI ");
delay_ms(20);
}
}
}
void tatkhi()
{
if((button_5)==0)
delay_ms(20);
{
if((button_5)==0)
{
t0=0;
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc(" JSC ");
delay_ms(20);
lcd_gotoxy(1,2);
lcd_putc(" STOP ");
delay_ms(20);
}
}
}
void batbom()
{
if((button_1)==0)
delay_ms(20);
{
if((button_1)==0)
{
t1=1;
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc(" JSC ");
delay_ms(20);
lcd_gotoxy(1,2);
lcd_putc(" DANG CAP NUOC ");
delay_ms(20);
}
}
}
void tatbom()
{
if((button_5)==0)
delay_ms(20);
{
if((button_5)==0)
{
t1=0;
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc(" JSC ");
delay_ms(20);
lcd_gotoxy(1,2);
lcd_putc(" STOP ");
delay_ms(20);
}
}
}
void xungthap()
{
if((button_2)==0)
delay_ms(20);
{
if((button_2)==0)
{
bdt++;
mode=1;
if(mode==1)
{
timer1_isr();
//enable_interrupts(int_timer1);
//enable_interrupts(global);
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc(" JSC ");
delay_ms(20);
lcd_gotoxy(1,2);
lcd_putc(" XUNG THAP ");
delay_ms(20);
}
//bdt=0;
//set_timer1(0);
}
}
}
void tatxung()
{
if((button_5)==0)
delay_ms(20);
{
if((button_5)==0)
{
mode=4;
if(mode==4)
{
output_c(0x00);
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc(" HUNG PHAT JSC ");
delay_ms(20);
lcd_gotoxy(1,2);
lcd_putc(" STOP XUNG ");
delay_ms(20);
}
}
}
}
void main()
{
t0=t1=0;
bdt=0;
output_c(0x00);
set_tris_e(0x00);
set_tris_d(0x00);
set_tris_b(0xff);
set_tris_c(0x00);
lcd_init();
delay_ms(20);
lcd_gotoxy(1,1);
lcd_putc(" JSC ");
delay_ms(200);
lcd_gotoxy(1,2);
lcd_putc(" ");
delay_ms(200);
setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_2 );
set_timer1(0);
//disable_interrupts(int_timer1);
//disable_interrupts(global);
enable_interrupts(int_timer1);
enable_interrupts(global);
/*
cach tinh chu ki may voi F=8Mhz va bo chia tan là 2:
Tcyl= 4 x (1/Fosc) x (prescale: là he so chia)
= 4 x (1/8Mhz) x
= 1 us
==> Tmax cua timer1 dem het 65536 gia tri la 65536x1=65536us
muon tao thoi gian tre 1s=1000ms=1000000us
vay so làn xay ra ngat la 1000000/65536=15.2 lan
*/
while(TRUE)
{
ktrr(); if(t0==1) {output_high(pin_c0);}
batbom(); if(t1==1) {output_high(pin_c1);}
tatkhi(); if(t0==0) {output_low(pin_c0);}
tatbom(); if(t1==0) {output_low(pin_c1);}
xungthap();
tatxung();
}