Lập Trình Nút Nhấn Cho Pic16F877A

Nhiều khi thi công các mạch điện tử nên sử dụng đến sự việc đọc trạng thái nguồn vào của 2 hoặc các nút bấm nhằm điều khiển, hoặc một việc khác ví như đo tốc độ của 2 rượu cồn cơ mà lại chỉ gồm một ngắt quanh đó thì chúng ta thường làm cầm nào. Có thể bạn sẽ sử dụng cách như quét hàm đọc phím trong vòng lặp vô hạn để kiểm tra trạng thái đầu vào của những chân được nối với những phím bấm. Đây là một cách thiểu chuyên nghiệp và tạo ra sự lãng phí cũng như làm bớt hiệu năng khi cách xử trí chip; chương trình sẽ không còn thục

Một chiến thuật được giới thiệu trong trường phù hợp này là sử dụng ngắt ngoài phối hợp sử dụng điôt (diode)để hiểu trình tìm phím được nhấn.

Trong lấy ví dụ này mình mang sử sơ thiết bị mạch áp dụng với Pic16f877A với 3 nút điều khiển gồm: BT1, BT2, BT3t. Những vi tinh chỉnh khác như 89s52 STM8, ARM M3, AVR…. Chúng ta cũng làm việc một phương pháp tương tự.

Cách cũ (Lãng phí tài nguyên với không buổi tối ưu): lúc chạy lịch trình sẽ quét vào while nên những khi gạp hàm delay sẽ mất thời hạn chờ chấm dứt mới quét lại được từ đầu:

Sơ vật mạch : không có đi ốt nối vào ngắt ngoài:


Bạn đang xem: Lập trình nút nhấn cho pic16f877a

*
thực hiện ngắt ko kể đọc các nút bấm nâng cấp hiệu năng công tác với Pic16f877A 1">

Mạch không buổi tối ưu với ngắt ngoài thực hiện nút bấm công tác quét nút đã không đáp ứng được ngay


Code:

#include #device ADC=10#FUSES NOWDT //No Watch Dog Timer#FUSES NOBROWNOUT //No brownout reset#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used FOR I/O#use delay(crystal=12MHz)#define RC PIN_E0#define LCD_ENABLE_PIN PIN_D2#define LCD_RS_PIN PIN_D0#define LCD_RW_PIN PIN_D1#define LCD_DATA4 PIN_D4#define LCD_DATA5 PIN_D5#define LCD_DATA6 PIN_D6#define LCD_DATA7 PIN_D7#define MFRC522_CS PIN_E0#include #define BT1_PIN PIN_C0#define BT2_PIN PIN_C1#define BT3_PIN PIN_C2#define LED PIN_E0void quet_phim()if(input(BT1_PIN)==0) //neu nut bam duoc bam lcd_gotoxy (12, 2); //Di chuyen den o so 12 cua dong 2printf (LCD_PUTC, "BT1");else if (input(BT2_PIN)==0) //neu nut bam duoc bamlcd_gotoxy (12, 2); //Di chuyen den o so 12 cua dong 2printf (LCD_PUTC, "BT2");else if (input(BT3_PIN)==0) //neu nut bam duoc bamlcd_gotoxy (12, 2); //Di chuyen den o so 12 cua dong 2printf (LCD_PUTC, "BT3");void chuong_trinh_con(){for(int i=0; iMạch buổi tối ưu: chương trình được triển khai trong ngắt nên đáp ứng được ngay. Mạch gồm thêm diode


Xem thêm: Khấu Hao Là Gì? Cách Tính Chi Phí Khấu Hao Là Gì ? Các Phương Pháp Tính

*
sử dụng ngắt bên cạnh đọc nhiều nút bấm cải thiện hiệu năng lịch trình với Pic16f877A 2">

Ngắt xung quanh đọc nút bâm, buổi tối ưu cho pic17f877a


Code:

#include #device ADC=10#FUSES NOWDT //No Watch Dog Timer#FUSES NOBROWNOUT //No brownout reset#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used FOR I/O#use delay(crystal=12MHz)#define RC PIN_E0#define LCD_ENABLE_PIN PIN_D2#define LCD_RS_PIN PIN_D0#define LCD_RW_PIN PIN_D1#define LCD_DATA4 PIN_D4#define LCD_DATA5 PIN_D5#define LCD_DATA6 PIN_D6#define LCD_DATA7 PIN_D7#define MFRC522_CS PIN_E0#include #define BT1_PIN PIN_C0#define BT2_PIN PIN_C1#define BT3_PIN PIN_C2#define LED PIN_E0volatile INT bt1=1, bt2=1,bt3=1;const INT bam=0;void quet_phim(); VOID quet_phim () IF(input(BT1_PIN)==0) //neu nut bam duoc bam lcd_gotoxy (12, 2); //Di chuyen den o so 12 cua dong 2 printf (LCD_PUTC, "BT1"); else IF (input(BT2_PIN)==0) //neu nut bam duoc bam lcd_gotoxy (12, 2); //Di chuyen den o so 12 cua dong 2 printf (LCD_PUTC, "BT2"); else IF (input(BT3_PIN)==0) //neu nut bam duoc bam lcd_gotoxy (12, 2); //Di chuyen den o so 12 cua dong 2 printf (LCD_PUTC, "BT3"); #INT_EXT VOID ngat_ngoai() quet_phim(); VOID chuong_trinh_con() { for(INT i=0; i