BÀI 06: GIAO TIẾP VỚI NÚT NHẤN
1.Đọc đầu vào cơ bản
Việc đầu tiên chúng ta cần làm là đọc dữ liệu đầu vào ở một chân là mức 0 hay 1. Chúng ta thực hiện một bài toán đơn giản như sau: Đọc dữ liệu từ một chân vi điều khiển và xuất dữ liệu ra một chân khác.
Mạch nguyên lí như sau:
Chân 3.7 khi chưa nhấn nút sẽ có điện áp vào 5V, khi nhấn nút sẽ là 0V. LED nối với chân P2.0, LED sáng khi chân P2.0 ở 0V, tắt khi chân P2.0 ở 5V. Chương trình đọc và xuất dữ liệu như sau:
#include <regx52.h>
sbit LED = P2^0;
sbit BUTTON = P3^7;
int main()
{
while(1)
{
LED=BUTTON;
}
}
Đây là 1 chương trình đơn giản, khi nhấn nút thì chân P3.7=0V => chân P2.0=0V dẫn đến LED sáng.Ngược lại khi không nhấn nút, chân P3.7=5V => chân P2.0=5V dẫn đến LED tắt.
2.Đọc đầu vào và xử lí nút nhấn
Bài toán 1: Chúng ta sử dụng 2 nút nhấn để điều khiển 1 đèn LED. Nhấn nút ON thì đèn sáng, nhấn nút OFF thì đèn tắt.
Mạch nguyên lí như sau:
Chân 3.7 tương ứng nút ON, 3.6 tương ứng nút OFF.
Chương trình như sau:
#include <regx52.h>
sbit LED = P2^0;
sbit ON = P3^7;
sbit OFF = P3^6;
int main()
{
LED=1;
while(1)
{
if (ON==0) //Nhan nut ON
{
LED=0; //LED sang
}
if (OFF==0) //Nhan nut OFF
{
LED=1; //LED tat
}
}
}
Trong thực tế, chúng ta hay gặp hiện tượng "Dội phím" (nút nhấn dao động liên tục mức 0-1). Vi điều khiển có thể hiểu là rất nhiều lần nhấn-thả liên tiếp. Để khắc phục vấn đề này, khi đọc trạng thái nút nhấn, chúng ta delay 1 khoảng để xác định chính xác nút được nhấn hay chưa. Viết lại chương trình như sau:#include <regx52.h>
sbit LED = P2^0;
sbit ON = P3^7;
sbit OFF = P3^6;
void Delay(int time);
int main()
{
LED=1;
while(1)
{
if (ON==0) //Nhan nut ON
{
Delay(20);
LED=0; //LED sang
}
if (OFF==0) //Nhan nut OFF
{
Delay(20);
LED=1; //LED tat
}
}
}
void Delay(int time)
{
int i,j;
for(i=0; i<time; i++)
for(j=0; j<125; j++);
}
Bài toán 2: Dùng 1 nút nhấn để điều khiển LED, nhấn 1 lần thì LED sáng, nhấn lần tiếp theo thì LED tắt.
Cách 1 : Dùng hàm While() để chờ chuyển mức
Sau khi chúng ta phát hiện dữ liệu xuống mức 0, chúng ta sẽ dùng vòng lặp while để chờ cho đến khi dữ liệu thoát khỏi mức 0 để xác nhận nút đã được nhấn. Lúc đó ta có thể thực hiện các chức năng khác tương ứng với việc nhấn nút.
Mạch nguyên lí như sau:
Chương trình như sau:
#include <regx52.h>
sbit LED = P2^0;
sbit BUTTON = P3^7;
void Delay(int time);
int main()
{
LED=1;
while(1)
{
if (BUTTON==0)
{
Delay(20);
if (BUTTON==0)
{
while(BUTTON==0){}
LED=!LED;
}
}
}
}
void Delay(int time)
{
int i,j;
for(i=0; i<time; i++)
for(j=0; j<125; j++);
}
Tuy nhiên, khi làm việc với nhiều nút nhấn, cách này không phù hợp mà nên sử dụng cách 2.
Cách 2 : So sánh dữ liệu trước và sau để phát hiện chuyển mức.
Ý tưởng: Chúng ta so sánh giữa mức ngay trước đó và mức mới. Nếu có sự sai khác giữa mức mới và mức ngay sau đó thì đồng nghĩa với việc có sự thay đổi về giá trị nút nhấn. Tùy thuộc vào mục đích của người lập trình chọn sườn lên hay sườn xuống để thực hiện lập trình theo ý muốn. Ở đây, mình chọn sườn xuống của nút nhấn để thực hiện.
Mạch nguyên lí như sau:
Chương trình:
#include <regx52.h>
sbit LED = P2^0;
sbit BUTTON = P3^7;
bit BUTTON_OLD;
void Delay(int time);
int main()
{
LED=1;
while(1)
{
if (BUTTON==0)
{
Delay(20);
if ((BUTTON==0)&&(BUTTON_OLD==1))
{
LED=!LED;
}
}
//Cap nhat trang thái moi cua nut nhan
BUTTON_OLD=BUTTON;
Delay(20);
}
}
void Delay(int time)
{
int i,j;
for(i=0; i<time; i++)
for(j=0; j<125; j++);
}
Good Luck!