Chương trình chạy không ổn định (Nhúng cơ bản)

Như tiêu đề viết em có 1 chương trình nhỏ như sau khi cho chạy thì led(P2) sẽ chớp tắt khi nhấn nút(P1^0) thì led sẽ tắt.Nhưng em cho chạy trên chương trình mô phỏng thì nó không đc kết quả mong muốn lắm xin anh/chị chỉ giáo gỡ rối giúp em!

sbit BTN = P1^0;

void main()
{  
	unsigned char i;
	
	while(1)
	{
		P2 = ~P2;
        i = 0;	
		while(i < 100)
		{ 	
			delay_ms(10);
			if(BTN == 0)
			{
				delay_ms(20);//chong doi phim
				if(BTN == 0)
				{
					P2 = 0x00;
				 	break;
				}
			}
			i++;
		}

		if(i != 100)
			break;
	}
}

Bạn thay cái dòng có comment “Chong doi phim” thành BTN = 0 xem :sweat_smile: thế nó mới chống đối phím chứ cái delay nó chưa chống được đâu, nhả tay khỏi phím là BTN = 1 ngay :joy: Mà bạn bỏ 1 cái if đi cũng được

Dội phím/ Chống dội phím là cái rất vớ vẩn mà SV sợ và dùng mấy cái delay, vòng lặp để xử lý.
Chuyển ngay sang xử lý bắt sườn xung để đảm bảo tốc độ xử lý cao, ổn định.
Còn chương trình của thớt thì chỉ cần viết nó đơn giản thế này:

while(1){
    if(!BTN){P2=0; continue;}
    P2=~P2;
    delay_ms(100);
}
1 Like

sườn xung là gì vậy anh em không hiểu anh có thể nói sâu hơn không ạ!(Lập trình này em đang tự tìm hiểu nếu anh có tài liệu có thể giới thiệu cho em không?) Cảm ơn anh rất nhiều!

cảm ơn anh rất nhiều vì đã giúp em!

1 Like

Khi bạn nhấn nút, chân input sẽ có sự thay đổi điện áp 1-> 0. Khi nhả nút sẽ có điện áp 0->1.
Người ta sẽ phát hiện nút thay đổi trạng thái dựa vào sự thay đổi điện áp. Việc kiểm tra sẽ rất nhanh mà không cần delay để chống việc giữ nút quá lâu.

em cảm ơn anh nhiều!

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?