Đăng vào

MPLAB XC8: Lập trình nút nhấn

Giới thiệu

Ở bài trước mình đã hướng dẫn các bạn lập trình nháy led với MPLAB XC8. Hôm nay chúng ta sẽ tiếp tục lập trình một loại linh kiện điện tử cho phép chúng ta nhập dữ liệu đó là nút nhấn. Bài viết này sẽ lập trình bật tắt đèn led bằng một nút nhấn.

Chúng ta đã biết rằng việc cài đặt một chân trên vi điều khiển PIC là input hay output thực hiện bằng việc đặt bit tương ứng ở thành ghi TRIS là 1 (input) hay 0 (output). Khi một chân là input (hoặc output) thì thanh ghi PORT sẽ đọc (hoặc ghi) tín hiệu logic ở chân tương ứng. Với PIC16F877A, mức logic 1 tương ứng với điện áp trên chân là 5V, mức logic thấp là 0V ( các bạn có thể xem datasheet của PIC16F877A để nắm rõ hơn về với giá trị điện áp nào PIC sẽ hiểu là mức logic 1 hoặc 0).

Khi một chân là input thì nó sẽ ở trạng thái Hi-Impedance (Trở kháng cao). Khi set một bit trong thanh ghi PORT lên 1 thì chân tương ứng sẽ ở xuất tín hiệu ở mức logic cao – logic high (VDD), còn nếu bit đó được set xuống mức 0 thì chân tương ứng sẽ xuất tín hiệu ở mức logic thấp – logic low (VSS). ở chế độ input thanh ghi PORT đọc mức điện áp ở chân tương ứng, nếu chân có mức điện áp gần với giá trị VDD thì thanh ghi PORT có giá trị là 1 còn nếu chân input có mức điện áp gần với giá trị VSS thì thanh ghi PORT có giá trị là 0.

Ví dụ này sử dụng vi điều khiển PIC16F877A, gồm một nút nhấn kết nối với một chân được cài đặt ở chế độ input và một đèn led nói với một chân ở chế độ output. Khi bấm nút nhấn, đèn LED sẽ sáng 3 giây rồi tắt.

Sơ đồ mạch điện

so do mach

Chức năng các linh kiện sử dụng:

  • Chân VDD được nối với nguồn +5VDC và chân VSS nối đất GND.
  • Thạch anh sử dụng có tần số 8MHz
  • Chân RD0 (PIN 19) là chân input nối với nút ấn.
  • Chân RB0 (PIN 33) là chân output nối với đèn LED.
  • Điện trở kéo lên (Pull up resistor) có giá trị 10KΩ. Khi không nhấn nút ấn chân RD0 ở mưc VDD, khi nhấn nút ấn chân RD0 ở mức VSS
  • Điện trở 470Ω mắc nối tiếp để hạn dòng qua đèn LED

MPLAB XC8 Code

#define _XTAL_FREQ 8000000
#include
// BEGIN CONFIG
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = ON // Watchdog Timer Enable bit (WDT enabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
//END CONFIG
int main()
{

TRISB0 = 0; //RB0 la Output PIN
TRISD0 = 1; //RD0 la Input PIN
RB0 = 0; //LED Off
while(1)
{
    if(RD0 == 0) //Neu an button
    {
        RB0 = 1; //LED ON
        __delay_ms(3000); //3 Second Delay
        RB0 = 0; //LED OFF
    }
}
return 0;
}

Lưu ý:

Bạn nên kiểm tra trạng thái của nút nhấn sau một khoảng thời gian delay nhỏ bởi vì: Thời gian thời gian chuyển trạng thái của nút nhấn vào khoảng 100-300ms, vi điều khiển đang hoạt động ở tần số 8MHz. Nếu không có đoạn code delay thì một lần nhấn vi điều khiển có thế hiểu là nhiều lần ấn do tốc đọ thực thi của vi điều khiển là rất nhanh.