Nút bấm (Push-button switch) là công tắc liên lạc tạm thời khi nút được nhấn nút sẽ được trả về vị trí bình thường của nó khi thả ra. Có 2 loại nút bấm, loại NO (Normal Open) bình thường hở mạch khi nhấn vào thì nối mạch  và loại NC (Normal Close) bình thường đóng mạch khi nhấn vào hở mạch.

 nutbam

Khi lập trình nút bấm (Push button switch) dùng vi điều khiển PIC các bạn chú ý một số vấn đề sau :

1. Loại nút bầm là NO hay NC

2. Nhớ có phần chống nảy phím trong code CCS.

3. Thời gian thực thi nút bấm trong chương trình.

Nếu không có phần code chống nảy phím các bạn sẽ gặp trường hợp nút bấm tác dụng 2, 3 lần khi nhấn, các bạn cũng cần chú ý thời gian thực thi nút bấm trong chương trình. Nếu các bạn sử dụng ngắt ngoài để thực thi nút bấm thì dường như nó có tác dụng tức thời, vì ngắt luôn luôn được ưu tiên trước. Còn nếu các bạn không sử dụng ngắt ngoài thì thời gian thực thi nút bấm phụ thuộc vào thời gian thực thi tất cả các lệnh trong chương trình chính.

Các bạn vào proteus và vẽ mạnh như hình (sử dụng PIC 16F877A):

nutbam

Trong bài tập này mình sử dụng 2 cách: nút bấm B1 đưa vào chân RB0 dùng ngắt ngoài để thực thi, ưu điểm là nhấn nút thì LED-YELLOW sáng hoặc tắt ngay lập tức. Các bạn có thể tham khảo bài Các ngắt trong PIC

Còn các nút bấm B2 và B3 đưa vào các chân RC1 và RC2 trong bài tập này mình để trong trương trình chính hàm delay_ms(500); như vậy là hên xui tùy thuộc vào lúc nhấn nút  chương trình đang thực hiện ở đâu, có thể phải nhấn 2 , 3 lần thì LED mới sáng.

- Nhấn nút B1 LED-YELLOW sáng hoặc tắt (Nhấn 1 lần là sáng, nhấn tiếp là tắt...)

- Nhấn nút B2 LED-RED sáng hoặc tắt.

- Nhấn nút B3 LED-GREEN sáng hoặc tắt.

Các bạn cũng có thể thay đổi số 500 trong hàm delay_ms(500) rồi cho chạy mô phỏng trên proteus để cảm nhận được hoạt động của nút bầm.

#include <16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=12000000)
// Dinh nghia PIN nut bam
#define B1 PIN_B0
#define B2 PIN_C1
#define B3 PIN_C2
// Dinh nghia LED
#define LED_GREEN PIN_D4
#define LED_RED PIN_D5
#define LED_YELLOW PIN_D6
int1 sw_b1=1,button1=1,sw_b2=1,button2=1,sw_b3=1,button3=1;
int8 n=0,n1=0,n2=0,n3=0;
// Ngat ngoai
#INT_EXT
void ex0_isr(){
// Nhan vao la sang, nhan them lan nua la tat LED theo quy luat chan le cua bien n1
n1++;
if(n1%2==1) output_high(LED_YELLOW);
else output_low(LED_YELLOW);
if(n1==254) n1=0;
}
// Nut Bam B2
void nutbamB2 (void){
if (button2) {
sw_b2 = Input(B2);
if (!sw_b2) {
button2=0;
n=0;
// Nhan vao la sang, nhan them lan nua la tat LED theo quy luat chan le cua bien n2
n2++;
if(n2%2==1) output_high(LED_RED);
else output_low(LED_RED);
if(n2==254) n2=0;
}
}
// Delay chong nay phim
n++;
if (n >3) { // 3*500=1500ms delay de chong nay phim
n=0;
button2=1;
}
}
//Nut bam B3
void nutbamB3 (void){
if (button3) {
sw_b3 = Input(B3);
if (!sw_b3) {
button3=0;
n=0;
// Nhan vao la sang, nhan them lan nua la tat LED theo quy luat chan le cua bien n3
n3++;
if(n3%2==1) output_high(LED_GREEN);
else output_low(LED_GREEN);
if(n3==254) n3=0;
}
}
// Delay chong nay phim
n++;
if (n >3) {
n=0;
button3=1;
}
}

void main() {
enable_interrupts(GLOBAL);
ext_int_edge(H_TO_L);
enable_interrupts(INT_EXT);
output_low(LED_RED);
output_low(LED_GREEN);
output_low(LED_YELLOW);
while(TRUE)
{
nutbamB1();
nutbamB2();
nutbamB3();
delay_ms(500); // Delay co the thay doi gia tri de test hieu ung nhanh cham cua nut bam
}
}

Các bạn có thể download bài học tại đây : Lập trình nút bấm dùng vi điều khiển PIC

Xem video mô phỏng nút bấm push button :

Nếu bạn thấy hay hãy đăng ký , chia sẻ giúp tôi nhé chúng tôi sẽ thường xuyên cập nhật kiến thức mới về vi điều khiển PIC tại đây