洪嵐峰 發表於 2023-4-11 05:55:28

PIC16F887-I/P 電子門鎖

基本零件清單

代碼:

所需零件:

PIC16F887-I/P 微控制器
16x2 LCD 液晶屏幕
4x4 矩陣按鍵
5V 電源模塊
12V 電動鎖
BC547 NPN 晶體管
1N4007 整流二極管
杜邦線、麵包板等
連接腳位:

PIC16F887-I/P:
RB0 - 液晶屏幕 D4
RB1 - 液晶屏幕 D5
RB2 - 液晶屏幕 D6
RB3 - 液晶屏幕 D7
RB4 - 矩陣按鍵列 1
RB5 - 矩陣按鍵列 2
RB6 - 矩陣按鍵列 3
RB7 - 矩陣按鍵列 4
RC0 - 電動鎖控制引腳
RC1 - 液晶屏幕 RS
RC2 - 液晶屏幕 E
RC3 - 矩陣按鍵行 1
RC4 - 矩陣按鍵行 2
RC5 - 矩陣按鍵行 3
RC6 - 矩陣按鍵行 4
4x4 矩陣按鍵:
行 1 - RC3
行 2 - RC4
行 3 - RC5
行 4 - RC6
列 1 - RB4
列 2 - RB5
列 3 - RB6
列 4 - RB7
示例代碼:


#include <xc.h>
#include <stdio.h>
#include "lcd.h"

#pragma config FOSC = HS       // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF      // Watchdog Timer Enable bit (WDT disabled)
#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)

#define _XTAL_FREQ 20000000

#define lock RC0            //鎖控制引腳
#define keypad PORTB        //矩陣按鍵連接到PORTB

//初始化函數
void init() {
    TRISB = 0xF0;           //設置RB0~3輸出,RB4~7輸入
    TRISC = 0

ANSEL = 0;              //關閉模擬輸入
ANSELH = 0;
lcd_init();             //初始化液晶屏幕
}

//矩陣按鍵掃描函數
unsigned char keypad_scan() {
unsigned char row, col, key;
keypad = 0xFF; //矩陣按鍵設置為輸入模式
for (col = 0; col < 4; col++) {
keypad = (1 << (4 + col)); //設置當前列為低電平
for (row = 0; row < 4; row++) {
if (!(keypad & (1 << row))) { //檢測行是否為低電平
key = row * 4 + col + 1; //計算按鍵編號
return key;
}
}
}
return 0; //如果沒有按鍵按下,則返回0
}

//主函數
void main() {
unsigned char password = {1, 2, 3, 4}; //設置密碼為1234
unsigned char key, count = 0;
lcd_clear();
lcd_puts("Enter Password:");
init();
while (1) {
key = keypad_scan();
if (key != 0) { //如果檢測到按鍵按下
lcd_putch('*');
if (key == password) { //如果密碼正確
count++;
if (count == 4) { //如果密碼全部正確
lcd_clear();
lcd_puts("Password OK");
__delay_ms(500); //延時500ms
lock = 1; //打開鎖
lcd_clear();
lcd_puts("Door Open");
__delay_ms(2000); //延時2s
lock = 0; //關閉鎖
lcd_clear();
lcd_puts("Door Close");
count = 0; //重置計數器
}
} else { //如果密碼錯誤
lcd_clear();
lcd_puts("Password Error");
__delay_ms(500); //延時500ms
lcd_clear();
lcd_puts("Enter Password:");
count = 0; //重置計數器
}
}
}
}



注意事項:

1. 在使用 PIC16F887-I/P 之前,需要根據實際需要配置相應的寄存器位,以滿足您的應用程序要求。

在示例代碼中,使用了 MPLAB X IDE 自帶的配置位工具進行配置。

2. 本示例程序為演示用途,未對密碼進行加密或其他安全處理,請勿在實際應用中使用。

如果您需要在實際應用中使用,請考慮使用更為安全的密碼輸入方式。

3. 本示例程序使用了 LCD1602 液晶屏幕和 4x4 矩陣按鍵進行輸入和輸出。
頁: [1]
查看完整版本: PIC16F887-I/P 電子門鎖