[Help] Code dịch bit để quét led.

Lê Thành Nhân

Thành Viên PIF
Các anh xem giúp em đoạn code này với, mục đích của em đó là : Ban đầu ta xuất tín hiệu ra cho led trên chân P1.0 sáng, sau đó ta sẽ dùng phương pháp dịch bit sang trái để các led khác sáng lần lượt, khoảng thời gian delay là 500ms.
Code em nó :
PHP:
/*******************************************************************************
Dich bit quet led
Le Thanh Nhan
Khoa khoa hoc ung dung
*******************************************************************************/
 
#include  <msp430g2553.h>
 
void main(void)
{
  int i;
  WDTCTL = WDTPW + WDTHOLD;                // Stop watchdog timer
  P1DIR = 0x01;
 
 
  for (i=0x01;i<0x80;i=i<<1);
 
  P1OUT = i;
  _delay_cycles(500);
  P1OUT !=i;
  _delay_cycles(500);
 
 
  }
Không hiểu sao chỉ có mỗi con led ở chân P1.0 là sáng thôi, mấy con khác thì im lìm.
Các anh xem thử em viết sao ở chỗ nào ạ! Có phải em dùng hàm sai không ạ?
 

honghiep

Cố Vấn CLB
Staff member
Các anh xem giúp em đoạn code này với, mục đích của em đó là : Ban đầu ta xuất tín hiệu ra cho led trên chân P1.0 sáng, sau đó ta sẽ dùng phương pháp dịch bit sang trái để các led khác sáng lần lượt, khoảng thời gian delay là 500ms.
Code em nó :
PHP:
/*******************************************************************************
Dich bit quet led
Le Thanh Nhan
Khoa khoa hoc ung dung
*******************************************************************************/
 
#include  <msp430g2553.h>
 
void main(void)
{
  int i;
  WDTCTL = WDTPW + WDTHOLD;                // Stop watchdog timer
  P1DIR = 0x01;
 
 
  for (i=0x01;i<0x80;i=i<<1);
 
  P1OUT = i;
  _delay_cycles(500);
  P1OUT !=i;
  _delay_cycles(500);
 
 
  }
Không hiểu sao chỉ có mỗi con led ở chân P1.0 là sáng thôi, mấy con khác thì im lìm.
Các anh xem thử em viết sao ở chỗ nào ạ! Có phải em dùng hàm sai không ạ?
Vì bạn chỉ mới set cho P1.0 là output thôi, các chân còn lại mặc định là input nên không thể xuất ra được.
P.S: dòng _delay_cycles(500) mới chỉ delay 500us thôi nhé :D
 

Lê Thành Nhân

Thành Viên PIF
Vì bạn chỉ mới set cho P1.0 là output thôi, các chân còn lại mặc định là input nên không thể xuất ra được.
P.S: dòng _delay_cycles(500) mới chỉ delay 500us thôi nhé :D
Ủa? vậy mà em cứ tưởng là 500ms rồi chứ, osc là 1 Mhz hả anh?hic, không lẽ bây giờ mình phải set từng bit output hả anh?
Có cách nào chỉ cần 1 dòng là cho output hết không? ví như :
P1DIR = 0xff;
^_^ em hỏi nếu có hơi ngớ ngẩn thì mong anh bỏ qua nha!:gach
 

honghiep

Cố Vấn CLB
Staff member
Ủa? vậy mà em cứ tưởng là 500ms rồi chứ, osc là 1 Mhz hả anh?hic, không lẽ bây giờ mình phải set từng bit output hả anh?
Có cách nào chỉ cần 1 dòng là cho output hết không? ví như :
P1DIR = 0xff;
^_^ em hỏi nếu có hơi ngớ ngẩn thì mong anh bỏ qua nha!:gach
Cũng hơi ngớ ngẩn thật :5cool_beat_plaster:
Vì các pin không liên quan với nhau, và IC chỉ biết có 0 với 1 thôi nên muốn pin nào là output thì cứ set bit tương ứng trong PxDIR lên 1 thôi.
P1DIR = 0xff; là hoàn toàn bình thường để set tất cà là output :D
 

Lê Thành Nhân

Thành Viên PIF
Mấy anh coi lại thử giải thuật như vậy có đúng chưa? Ý em là cho led sáng lần lượt theo kiểu dịch bit ấy, em nạp lại rồi, nhưng led ở P1.7 là sáng thôi, sau khi nạp code , rst lại nó sáng rồi tắt luôn!
????
Code vậy :
PHP:
#include  <msp430g2553.h>
 
void main(void)
{
  int i;
  WDTCTL = WDTPW + WDTHOLD;                // Stop watchdog timer
  P1DIR = 0xff;
 
{
  for (i=0x01;i<0x80;i=i<<1);
 
  P1OUT = i;
  _delay_cycles(500);
  P1OUT !=i;
  _delay_cycles(500);
 
}
  }
 

Lê Thành Nhân

Thành Viên PIF
Vẫn không dịch bit được anh ơi, anh viết cho em thử 1 đoạn code mẫu được không ạ?
 

mafiaWolf

Chủ tịch Hội phụ nữ PIF
cái for() mà bạn cho ";" ở cuối thì nó đâu có thực hiện cái j trong vòng lặp đó..==> nó tương đương lệnh delay à ^^ với lại k có vòng lặp while thì chỉ chạy 1 lần thôi...
SỬa lại theo code của bạn nhé...so sánh coi khác sao ùi coi thử chạy hok :D>....(tại vì chém bừa :">)
PHP:
#include  <msp430g2553.h>
 
void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                // Stop watchdog timer
  P1DIR = 0xff;
 
  while(1)
{
unsigned char i; //char cho nó tiết kiệm :D
  for (i=0x01;i<=0x80;i=<<1)
{
  P1OUT |= i;
  _delay_cycles(500000); //Tăng delay để quan sát
  P1OUT &= ~i; //Mình chỉ biết ~ là đảo bit à
  _delay_cycles(500000);
 
}
}
}
 
Top