Chống rung phím (dội phím), nhấn giữ phím

billnee

Trứng gà
Do công tắc nhấn là linh kiện cơ khí lên xuất hiện tượng dội phím khi nhấn, hoặc khi bạn giữu phím ,VĐK sẽ nhận 1 chuỗi lệnh liên tiếp ! ví dụ : việc xử lí 1 lệnh là 10us bạn giữ phím 1s VĐK sẽ xử lý 100 lệnh ! Giải pháp : dùng chống rung phần cứng hoặc phần mềm
Duới đây mình trình bày chống rung bằng phần mềm
Code:
	currentsate1 = 0;
	oldsate1 = 1;
	P0 = 0xff;//trạng thái mặc định
	P2 = 0xff; // của out port

 

 
while (1) //loop to scan the button state
	{ if(P3_2==0)//kiểm tra xem khi chương trình chạy , button khác có đc nhấn ko
	 nut1();         // nếu đc nhấn , sẽ chuyển sang phần xử lí của nút nhấn đó
	 if(P3_4==0)
	 nut3();
	oldsate1 = currentsate1;
	currentsate1 = P3_3;
	   if (!oldsate1&&currentsate1) //if button is pressed and the LED is OFF then turn LED ON
     {	
     // Phần Code xử lí khi nhấn phím

     }
 
     }
đây là phần code của mình ! Trong đó oldsate là biến lưu giữ trạng thái của công tắc trước đó , biến currentsate lưu giữ trạng thái port input( port gắn với công tắc nhấn ).
Nguyên lí : khi trạng thái công tắc thay đổi từ 0->1 sẽ thay đưa ra phần lệnh xử lí .
cách này mình có thể dùng 1 button điều khiển nhiều led như clip sau:
code và phần mô phỏng mạch điều khiển led bằng button
button 1 : chạy hiệu ứng led cài sẵn
button 2 : nhấn lần 1 tắt, nhấn lần 2 mở led
button 3 : nhần lần 1, led 1 sáng. nhấn lần n , led n sáng
Code mình viết thì chạy nhưng chưa tối ưu lắm
mình viết bằng c cho 8951! mọi người xem sửa code giùm mình cho tối ưu nha!
Cám ơn nhìu!
View attachment Code va file mo phong.rar
 

quyettien

Trứng gà
mình down về nhưng khí mở bằng CCS với Orcad thì chỉ ra giấy trắng thôi!
 

Manhdd

Cố Vấn CLB
Staff member
mình down về nhưng khí mở bằng CCS với Orcad thì chỉ ra giấy trắng thôi!
File *.DNS đó là file mô phỏng của Proteus, còn file *.c đính kèm là code của 8051 mà bạn!
 

danganhtuan1992

Trứng gà
Em lên mạng và tìm đc 1 trang cũng nói về chống rung phím, nhưng mà khác so với bạn billnee trình bày.
Địa chỉ của nó: http://www.scribd.com/hoabk08/d/53354756/15-Kĩ-thuật-chống-rung-ban-phim
Cách của bilnee là chỉ cần giá trị thay đổi từ 0->1 thì sẽ thực thi lệnh của phím, còn trên web là chỉ cần 1 thời gian delay cho xung ổn định mới đọc giá trị của phím, nên delay ~ 10ms sau khi nhấn phím, như vậy nếu xử lí 1 lệnh là 10ms bạn giữ phím 1s VĐK sẽ xử lý 99 lệnh ??? Không thoả yêu cầu bạn billnee đưa ra, em đọc 2 phần mà không hiểu được, vậy phần nào là đúng, tối ưu nhất vậy '+_+'+_+'+_+ ?
 

Kisses Hacker

Art Supporter
Staff member
Em mới vào C6, có lập trình nhấn phím để đổi cách chớp LED, cũng gặp tình trạng như vầy, em có 1 giải pháp ngắn gọn và khá hiệu quả: thêm 1 dòng delay vào trong phần code xử lý khi nhấn phím.


VD: viết code nhấn nút để tắt/mở LED.
Code:
if (RA0 == 0) [COLOR="seagreen"]// Co nut nhan
[/COLOR]{
	count = count++;
	t = count % 2;
	if (t == 0)
	{
		PORTD = 0x00;
	}
	else
	{
		PORTD = 0xFF;
	}
	[COLOR="red"]__delay_ms(200);[/COLOR]
}
else [COLOR="seagreen"]// khong co nut nhan[/COLOR]
{
}
Không có dòng delay thì khi nhấn nút nó không chạy đúng theo ý mình. Nếu tay chân dứt khoát, cho delay cỡ 200ms là chạy tốt. Nếu tay nhấn hơi lâu thì delay cỡ 300-500.

Nhược điểm của cách này là trong thời gian delay mà nhấn tiếp phím khác thì không nhận, nhưng dù sao cũng hiếm có trường hợp phải nhấn phím 2-3 lần/s :D

Tốt nhất nên để dòng delay ở cuối đoạn code xử lý.
 

danganhtuan1992

Trứng gà
@kissseshacker: code của bạn, phần delay theo mình nghĩ là giữ trạng thái sau khi PORTD=0xff thôi, chứ không có chống rung phím.
 

Kisses Hacker

Art Supporter
Staff member
À không phải đâu anh (em K11 :D). Thôi em mới up lại bằng thẻ CODE cho dễ nhìn, dòng delay là 1 lệnh nằm trong lệnh if (đọc button), khi nào nhấn button thì dòng delay mới được thực hiện, nên (em nghĩ) không ảnh hưởng đến đoạn code xử lí button.

Em nghĩ tổng quát nó là thế này:
Code:
if (RA0 == 0) [COLOR="seagreen"]// khi nhấn button[/COLOR]
{
        <đoạn code xử lí khi nhấn button>
        __delay_ms(...);
}
else
{
        <...>
}
Em có 1 đoạn code ngắn để test thử: View attachment Test button.rar. Anh thử bỏ lệnh delay rồi cho chạy thử sẽ thấy khác nhau. Em cũng không chắc là cách này giải quyết tối ưu cho việc rung phím, nhưng trình em mới cáu, chưa hấp thu được đoạn code dài ngoẵn phía trên nên em làm cách này ;)
 
Top