PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Cơ bản về vi điều khiển và PIC (http://www.picvietnam.com/forum/forumdisplay.php?f=8)
-   -   Bài tập nút nhấn cẩn giúp đỡ (http://www.picvietnam.com/forum/showthread.php?t=4856)

socola 01-09-2009 11:16 AM

Bài tập nút nhấn cẩn giúp đỡ
 
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

Trích:

Nguyên văn bởi socola (Post 29183)
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ế

Code:

#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

Code:

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!


Múi giờ GMT. Hiện tại là 06:08 AM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam