I.Đọc đầu vào cơ bản
Trước tiên việc đầu tiên chúng ta cần làm là đọc được dữ liệu đầu vào ở 1 chân đang ở mức 0 hay 1. Để hiểu rõ, chúng ta cùng thực hiện một bài toán đơn giản như sau: Đọc dữ liệu từ 1 chân vi điều khiển và xuất dữ liệu ra một chân khác.
Mạch điện được thiết kế như sau:
Mặc định đầu vào của chân 3.7 sẽ là 5V. Khi nhấn nút, đầu vào chân 3.7 sẽ là 0V. Chúng ta thực hiện việc đọc và xuất dữ liệu liên tục như sau:
#include<REGX52.H>
sbit BUTTON = P3^7;
sbit LED = P2^7;
void main (void)
{
while(1)
{
LED = BUTTON;
}
}
Đây là một chương trình rất đơn giản. Mô phỏng chương trình với Proteus Kết quả khi nút nhấn được nhấn LED sáng.
1.Đọc đầu vào và xử lý nút nhấn
Ở bài toán tiếp theo chúng ta sẽ nghĩ đến việc thực hiện bài toán nhấn nút thì đèn sáng nhấn thêm lần nữa thì đèn tắt.
Cách 1: Dùng hàm while để chờ chuyển mức.
Ở cách này, 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 nào dữ liệu thoát khỏi mức 0 để xác nhận nút đã được nhấn. Lúc đó chúng ta có thể thực hiện các chức năng mà chúng ta mong muốn tương ứng với việc nhấn nút.
Đoạn code như sau :
#include<REGX52.H>
sbit BUTTON = P3^7;
sbit LED = P2^7;
void main (void)
{
while(1)
{
if(BUTTON == 0)
{
while(BUTTON == 0) { }
LED = !LED;
}
}
}
Trong thực tế, nút nhấn rất có khả năng bị chập chờn, dao động liên tục mức 0-1 (run tay khi nhấn chẳng hạn). Như thế, một lần nhấn, thả nút có thể khiến vi điều khiển hiểu là rất nhiều nhấn, thả liên tiếp. Để tránh hiện tượng này, khi phát hiện nút nhấn được nhấn chúng ta delay một khoảng thời gian nhỏ để “vượt qua” thời gian dao động thường gặp. Sau đó, chúng ta kiểm tra lại nút nhấn và thực hiện vòng chờ như trên.
#include<REGX52.H>
sbit BUTTON = P3^7;
sbit LED = P2^7;
void Delay_ms(unsigned int t)
{
unsigned int x,y;
for(x=0;x<t;x++)
{
for(y=0;y<123;y++);
}
}
void main (void)
{
while(1)
{
if(BUTTON == 0)
{
Delay_ms(100);
if(BUTTON == 0)
{
while(BUTTON == 0) { }
LED = !LED;
}
}
}
}
Cách 2: Sử dụng so sánh dữ liệu trước và sau để phát hiện chuyển mức.
Code này chọn sườn xuống của nút nhấn để thực hiện lệnh điều khiển.
#include<REGX52.H>
sbit BUTTON = P3^7;
sbit LED = P2^7;
bit Button_Old;
void Delay_ms(unsigned int t)
{
unsigned int x,y;
for(x=0;x<t;x++)
{
for(y=0;y<123;y++);
}
}
void main (void)
{
while(1)
{
if(BUTTON == 0)
{
Delay_ms(100);
if((BUTTON == 0) && (Button_Old == 1))
{
LED = !LED ;
}
}
Button_Old = BUTTON;
Delay_ms(100);
}
}
Sau khi mô phỏng sẽ thấy ngay khi nút nhấn được nhấn, LED đã được thay đổi mà không cần chờ nút nhấn được thoát như trước nữa.
Như vậy, chúng ta đã tìm hiểu thêm được vấn đề dữ liệu đầu vào, đọc dữ liệu nút nhấn và điều khiển dữ liệu đầu ra. Ngoài ra, có một cách kiểm soát dữ liệu nút nhấn khác bằng ngắt ngoài, chúng ta sẽ cùng tìm hiểu thêm sau.