PDA

View Full Version : Bài tập nút nhấn cẩn giúp đỡ


socola
01-09-2009, 11:16 AM
Mình có viết 1 CT điều khiển có 2 nút nhấn. Khi nhấn phím 1 thì led đơn 1 sáng và led 7 hiện số 1. Tương tự khi bấm số 2
Vấn đề mình cần giúp là khi mình tắt nguồn và bật lại thì led 7 đoạn, led đơn vẫn hiện 1 số.
Ý mình là khi bật nguồn tất cả sẽ tắt hết để mình chọn lại số mình muốn

Thanks

code: (Nhờ mọi người chỉ mình cách bỏ vào thẻ code)
#include <16F877A.h>
#include <DEF_877A.h>
#fuses NOWDT,PUT,HS,NOPROTECT,NOLVP
#use delay(clock=20000000)

#define led0 rd0
#define led1 rd1

#define bt0 rc0
#define bt1 rc1

#define loa ra2

#define led7vcc ra0

#define data_led portb

#define led_singer portd


char dig[]={0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};

void display_int(int x)
{
int i;
i = x%10;
led7vcc = 0;
data_led = dig[i];
delay_ms(2);
led7vcc = 1;
}

void led_don(int i)
{
switch(i)
{
case 1: led_singer = 0x01; break;
case 2: led_singer = 0x02; break;

default:led_singer = 0x00; break;
}
}

int detect_sw()
{ int i ;

if(bt0 == 0)
{
i=1;
loa = 1;
delay_ms(50);
loa = 0;
delay_ms(200);

}
if(bt1== 0)
{
i=2;
loa = 1;
delay_ms(50);
loa = 0;
delay_ms(200);

}

return i;
}

void main()
{
int i ;

trisa = 0x00;
trisb = 0x00;
trisc = 0xff;
trisd = 0x00;


porta = 0x00;
portb = 0x00;
portc = 0x00;
portd = 0x00;

while(true)
{

i = detect_sw();
display_int(i);
led_don(i);
}
}

Mr.Bi
01-09-2009, 10:40 PM
Mình có viết 1 CT điều khiển có 2 nút nhấn. Khi nhấn phím 1 thì led đơn 1 sáng và led 7 hiện số 1. Tương tự khi bấm số 2
Vấn đề mình cần giúp là khi mình tắt nguồn và bật lại thì led 7 đoạn, led đơn vẫn hiện 1 số.
Ý mình là khi bật nguồn tất cả sẽ tắt hết để mình chọn lại số mình muốn

Thanks

Góp í đầu tiên ,đừng bao giờ dùng biến toàn cục và cục bộ trùng nhau thế


#include <16F877A.h>
#fuses NOWDT,PUT,HS,NOPROTECT,NOLVP
#use delay(clock=20000000)

#define led0 rd0
#define led1 rd1

#define bt0 rc0
#define bt1 rc1

#define loa ra2

#define led7vcc ra0

#define data_led portb

#define led_singer portd


const unsigned char dig[]={0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};

void display_int(int dta)
{ led7vcc = 0;
if(dta==0) data_led = dig[0xFF];
else data_led = dig[dta%10];
delay_ms(2);
led7vcc = 1;
}

void led_don(int dta)
{
switch(dta)
{ case 0: led_singer = 0x00;break;
case 1: led_singer = 0x01; break;
case 2: led_singer = 0x02; break;

default:led_singer = 0x00; break;
}
}

int detect_sw()
{ int dta ;

if(bt0 == 0)
{
dta=1;
loa = 1;
delay_ms(50);
loa = 0;
delay_ms(200);

};
if(bt1== 0)
{
dta=2;
loa = 1;
delay_ms(50);
loa = 0;
delay_ms(200);
} ;

return dta;
}

void main()
{
int i =0;

trisa = 0x00;
trisb = 0x00;
trisc = 0xff;
trisd = 0x00;

porta = portb = portc = portd = 0x00;

while(1)
{ i=detect_sw();
display_int(i);
led_don(i);
}
}

cong1810
02-09-2009, 12:35 AM
khi tắt nguồn các giá trị biến vẫn được lưu. nên bạn lúc đặt biến bạn gán kèm theo giá trị ban đầu cho nó.
anh Mr Bi hình như đã giải quyết dùm bạn!!

cskiller
02-09-2009, 10:46 AM
int detect_sw()
{
int i=0 ;
...
}


Biến cục bộ hoặc toàn cục sau khi reset(đôi khi cả tắt nguồn một thời gian) vẫn giữ giá trị cũ không phải vì nó "được lưu" mà là vì nó có thể được cấp phát lại đúng vào địa chỉ cũ. Vậy nên nếu biến không kèm giá trị khởi đầu sẽ có giá trị bằng lần sau cùng thực thi trước đó.

Regards

tatsuu
03-09-2009, 09:21 AM
chu cung dang co 1 bai tap lam mach nhay 8 led don.bac nao biet mach va chuong trinh nao don gian giup cho chu voi.chu gio moi hoc pic nen con rat mo ho lam.chua hieu gi lam.mong cac bac giup do.cam on cac bac truoc!