- UID
- 373967
- 帖子
- 9033
- 主題
- 2609
- 精華
- 0
- 積分
- 1009
- 楓幣
- 0
- 威望
- 986
- 存款
- 36015
- 贊助金額
- 0
- 推廣
- 0
- GP
- 1205
- 閱讀權限
- 70
- 在線時間
- 461 小時
- 註冊時間
- 2023-1-12
- 最後登入
- 2024-12-26
|
基本零件清單
代碼:
所需零件:
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[4] = {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]) { //如果密碼正確
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 矩陣按鍵進行輸入和輸出。 |
|