help!! lập trình led chạy xếp hàng theo thứ tự!!:p

nguyenquoctrung-hhk

Thành Viên PIF
mấy ngày nay ở nhà bùn quá nên ngùi lập trình mấy kiểu led chạy!! mình lập trình kiểu led chạy xếp theo hàng từ bit cao giảm giần, nhưng mình chỉ làm được dịch theo thứ tự giảm dần thui, mà không giữ được led sang, ví dụ: chương trình chạy dịch 1 điểm từ bít thấp đến bít thứ 7 rồi giữ cho led sáng, sau đó quay lại dịch típ đến bit 6 rồi giữ cho sáng... cứ thế giảm giần tới bit 0. các bạn xem đoạn code của mình sau đây, rồi đóng góp "cao kiến" đề mình hoàn thiện. thanks :p~^o^~

#include<htc.h>
__CONFIG(XT & WDTDIS & PWRTEN & MCLREN & UNPROTECT & SWBOREN & IESODIS & FCMDIS & LVPDIS & DEBUGDIS);
__CONFIG(BORV21);
#define _XTAL_FREQ 4000000

void delay()
{
unsigned char dem;
dem = 0;
T0CS = 0;
PSA = 0;
PS0 = 1; PS1 = 1; PS2 = 1;
TMR0 = 0;
T0IF = 0;
while(dem < 10)
{
while(T0IF == 0);
TMR0 = 0;
T0IF = 0;
dem++;
}
}

void main()
{
char i, j, count = 7;
ANSEL = 0;
ANSELH = 0;
TRISB = 0X00;
PORTB = 0xff;

while(1)
{
for(i = 0; i <= count; i++)
{
PORTB = ~(1 << i);
delay();

}
if(count == 0)
count = 7;
else
count--;
}
}
 

dinale

Trứng gà
nếu muốn cho led sáng dần từ 0-7 thì sửa lại: PORTB |= 1 << i; // LED sáng mức 1
hoặc: PORTB &= ~(1 << i); // LED sáng mức 0
 

electric_man

Thành Viên PIF
cái khó của bạn ở đây là ví dụ như sau lần dịch thứ nhất muốn bit7 sáng mãi nhưng trong khi đó trong code xử lý cả portb nor cho 1 thì nó luôn bị đảo trạng thái!!>>> cân xử lý nó thôi!!!
 

nguyenquoctrung-hhk

Thành Viên PIF
uhm!! mình nghĩ hoài không ra nủi, tại các bít sau khi dịch lun đổi trạng thái, mà mình nghĩ muốn giữ được trang thái của nó thì phải chốt ngay thời điểm nó sáng, để nó nhớ, sau đó đảo PORT đi, rồi quay lại dịch nó đảo lại thì nó mới giữ sáng. nhưng vẫn chưa làm được,hix!! có bạn nào "cao kiến" nữa giúp mình!!
 

electric_man

Thành Viên PIF
code đây bạn!!! tham khảo nhá!!!
Code:
#include<htc.h>
__CONFIG(XT & WDTDIS & PWRTEN & MCLREN & UNPROTECT & SWBOREN & IESODIS & FCMDIS & LVPDIS & DEBUGDIS);
__CONFIG(BORV21); 
#define _XTAL_FREQ 4000000

void delay()
{
unsigned char dem;
dem = 0;
T0CS = 0;
PSA = 0;
PS0 = 1; PS1 = 1; PS2 = 1;
TMR0 = 0;
T0IF = 0;
while(dem < 10)
{
while(T0IF == 0);
TMR0 = 0;
T0IF = 0;
dem++;
}	
}

     

//================//
void main()
{
char j;
ANSEL = 0;
ANSELH = 0;
TRISB = 0X00;
PORTB=0xFF;

while(1)
{
		for(j=0;j<=7;j++)
	{
      PORTB = ~(1 << j);
      delay();	
	}
	RB7=~RB7;               // SAU KHI CHAY DEN LED 7 (thuc ra la qua ^^) THI DAO TRANG THAI NO
	
	//===========//
		for(j=0;j<=6;j++)
	{
      PORTB = ~(1 << j); 
    RB7=~RB7;                // CAI NAY GOI LA PHU DINH CUA PHU DINH >>HEHE>> DO U UNDERSTAND???
       delay();
	}
	RB6=~RB6;                 // TUON TU NHU CODE TREN LED7

	//==================//
		for(j=0;j<=5;j++)
	{
      PORTB = ~(1 << j); 
     RB7=~RB7; RB6=~RB6;    // TUONG TU THOI!!!
       delay();
	}
	RB5=~RB5;

	//=================//
	for(j=0;j<=4;j++)
	{
      PORTB = ~(1 << j); 
   RB7=~RB7; RB6=~RB6; RB5=~RB5; 
       delay();
	}
    RB4=~RB4;
	//===================//
	for(j=0;j<=3;j++)
	{
      PORTB = ~(1 << j); 
     RB7=~RB7; RB6=~RB6; RB5=~RB5; RB4=~RB4; 
       delay();
	}
	RB3=~RB3;
	//============================//
	for(j=0;j<=2;j++)
	{
      PORTB = ~(1 << j); 
     RB7=~RB7; RB6=~RB6; RB5=~RB5; RB4=~RB4; RB3=~RB3;
       delay();
	}
	RB2=~RB2;
	//======================//
	for(j=0;j<=1;j++)
	{
      PORTB = ~(1 << j); 
     RB7=~RB7; RB6=~RB6; RB5=~RB5; RB4=~RB4; RB3=~RB3;RB2=~RB2;
       delay();
	}
	RB1=~RB1;
	//===================================//
	for(j=0;j<1;j++)
	{
      PORTB = ~(1 << j); 
     RB7=~RB7; RB6=~RB6; RB5=~RB5; RB4=~RB4; RB3=~RB3;RB2=~RB2;RB1=~RB1;
       delay();
	}
	RB0=~RB0;
}	
}
 

nguyenquoctrung-hhk

Thành Viên PIF
cám ơn ý kiến của ban electric_man nhưng ý mình đang muốn là cách tổng quát, nhưng dzù sao cũng cám ơn bạn rất nhiều cũng có 1 ý kiến để mình tham khảo thanks!!, hix, có bạn nào còn cao kiến nữa hem!!
 
đây có thể là code bạn cần:
Code:
for(int i=0;i<=7;i++)
{
a=0xff>>i;
b=0xFF;
for(int j=0;j<=7-i;j++)
{
PORTB=b&a;
if(j==1)
b=b<<1;
else
b=b<<1+1;
__delay_ms(180);
__delay_ms(180);
}
}
 
Mình viết như sau: với NumberOfLed bạn có thể định nghĩa ngay ở đầu chương trình.
while(1)
{
//truong hop dau tien khi chua co led nao sang
for(i=0;i<NumberOfLed;i++)
{
PORTC=~(1<<i);
delays();
};
//khi bat dau co 1 led duoc giu sang
statushold=(1<<(NumberOfLed-1));

for(hold=(NumberOfLed-1);hold>0;hold--)
{
for(i=0;i<hold;i++)
{
PORTC=~((1<<i)+statushold);
delays();
};
statushold=(statushold>>1)+(1<<(NumberOfLed-1));
};
};
 

nguyenquoctrung-hhk

Thành Viên PIF
cám ơn hai bạn rất nhiều!! ,bạn phương tuấn và ban vmhoang, đúng là cái mình đang cần, đoạn code của bạn phương tuấn rất ngắn gọn và hay, nó ra 1 kiểu mới nữa, nhưng mình chưa hình dung ra nữa, hihi. còn đoạn code của bạn vmhoang mình hiểu được ý của bạn, tại nó cũng đi theo hướng mình nghĩ, hihi, phải nói rằng hai bạn thật PRO!! cám ơn hai bạn nhìu!!
 

nguyenquoctrung-hhk

Thành Viên PIF
cho mình hỏi con vi điều khiển 16f887 có 35 chân xuất nhập thôi, nếu 1 bảng điện tủ lớn như vậy nhiều led chẳng lẽ phải cần nhiều vi điều khiển!!! điều này thì không kinh tế lắm vì 1 con vdk rất đắt vậy làm sao mình có thể sử dụng 1 hoặc 2 port để mà thực hiện được 1 bảng điện tử với chức năng như mình đã lập trình 1 port, mình cũng có hỏi các anh trong câu lạc bộ, thì các anh nói dùng bộ giải mã hoặc bộ phân kênh, mà mình nghĩ bộ giải mã nó chỉ ra 1 chân ở mức thấp thui, còn bộ phân kênh thì mình chưa hình dung được như thế nào, mong các bạn có thể hướng dẫn dùm mình. cám ơn các bạn!!
 

2death

Cố Vấn CLB
Staff member
cho mình hỏi con vi điều khiển 16f887 có 35 chân xuất nhập thôi, nếu 1 bảng điện tủ lớn như vậy nhiều led chẳng lẽ phải cần nhiều vi điều khiển!!! điều này thì không kinh tế lắm vì 1 con vdk rất đắt vậy làm sao mình có thể sử dụng 1 hoặc 2 port để mà thực hiện được 1 bảng điện tử với chức năng như mình đã lập trình 1 port, mình cũng có hỏi các anh trong câu lạc bộ, thì các anh nói dùng bộ giải mã hoặc bộ phân kênh, mà mình nghĩ bộ giải mã nó chỉ ra 1 chân ở mức thấp thui, còn bộ phân kênh thì mình chưa hình dung được như thế nào, mong các bạn có thể hướng dẫn dùm mình. cám ơn các bạn!!
Dùng thanh ghi dịch giao tiếp = SPI nên chỉ cần 3 chân để điều khiển 1 đống LED thôi (74hc595), cái này mấy bạn thi LED đợt rồi đều dùng đấy.
 

supergoodfriends

Trứng gà
cho mình hỏi con vi điều khiển 16f887 có 35 chân xuất nhập thôi, nếu 1 bảng điện tủ lớn như vậy nhiều led chẳng lẽ phải cần nhiều vi điều khiển!!! điều này thì không kinh tế lắm vì 1 con vdk rất đắt vậy làm sao mình có thể sử dụng 1 hoặc 2 port để mà thực hiện được 1 bảng điện tử với chức năng như mình đã lập trình 1 port, mình cũng có hỏi các anh trong câu lạc bộ, thì các anh nói dùng bộ giải mã hoặc bộ phân kênh, mà mình nghĩ bộ giải mã nó chỉ ra 1 chân ở mức thấp thui, còn bộ phân kênh thì mình chưa hình dung được như thế nào, mong các bạn có thể hướng dẫn dùm mình. cám ơn các bạn!!
Chào bạn trong vòng 1 cuộc thi raise your arm mình có làm về con 74HC595 và cũng có một số hiệu ứng khi sáng led. Trong đó có cả sơ đồ kết nối.Mình viết dùng cho ARM nên gởi bạn tham khảo sau đó biến chế nó cho Pic nhé.(Chỉ thay đổi một số lệnh, pin thôi)
VD: GPIOSetDir(2,1,1) : Chọn hướng chon chân 2.1 là output
GPIOSetDir(2,1,0) : Chọn hướng chon chân 2.1 là input
GPIOSetValue(2,1,0) : Xuất giá trị 0 trên chân 2.1
Các header nối vào led bạn nhé.Điều khiển sáng led bằng mức 0.

Gởi bạn tham khảo http://www.payitforward.edu.vn/4rum/showthread.php?206-M%E1%BB%99t-s%E1%BB%91-hi%E1%BB%87u-%E1%BB%A9ng-%C4%91i%E1%BB%81u-khi%E1%BB%83n-led-khi-d%C3%B9ng-74hc595
Còn đây là tài liệu về con 74595: http://machdientu.net/74hc595/
 

nguyenquoctrung-hhk

Thành Viên PIF
Chào bạn trong vòng 1 cuộc thi raise your arm mình có làm về con 74HC595 và cũng có một số hiệu ứng khi sáng led. Trong đó có cả sơ đồ kết nối.Mình viết dùng cho ARM nên gởi bạn tham khảo sau đó biến chế nó cho Pic nhé.(Chỉ thay đổi một số lệnh, pin thôi)
VD: GPIOSetDir(2,1,1) : Chọn hướng chon chân 2.1 là output
GPIOSetDir(2,1,0) : Chọn hướng chon chân 2.1 là input
GPIOSetValue(2,1,0) : Xuất giá trị 0 trên chân 2.1
Các header nối vào led bạn nhé.Điều khiển sáng led bằng mức 0.

Gởi bạn tham khảo http://www.payitforward.edu.vn/4rum/showthread.php?206-M%E1%BB%99t-s%E1%BB%91-hi%E1%BB%87u-%E1%BB%A9ng-%C4%91i%E1%BB%81u-khi%E1%BB%83n-led-khi-d%C3%B9ng-74hc595
Còn đây là tài liệu về con 74595: http://machdientu.net/74hc595/
cám ơn chị Phương, và anh supper good friend, nhưng em chưa học qua giao tiếp SPI và GPIO, hihi, tại chưa học vi xử lý nữa, phải vào tuần sau mới học về giao tiếp I2C, ADC, SPI của con 16f887, nhưng dù sao em cũng hình dung được như thế nào rồi, cám ơn anh chị nhìu!!
 
Top