0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

使用PIC16F877A連接4x4矩陣鍵盤的教程

科技觀察員 ? 來源:circuitdigest ? 作者:蘇拉夫·古普塔 ? 2022-11-15 16:49 ? 次閱讀

鍵盤是廣泛用于各種電子嵌入式項(xiàng)目的輸入設(shè)備。它們用于以數(shù)字和字母的形式獲取輸入,并將其輸入系統(tǒng)以進(jìn)行進(jìn)一步處理。在本教程中,我們將使用PIC16F877A 連接 4x4 矩陣鍵盤。

為什么我們需要 4x4 鍵盤:

通常,我們使用微控制器單元的單個(gè)I / O引腳來讀取數(shù)字信號(hào),例如開關(guān)輸入。在少數(shù)需要 9、12、16 個(gè)鍵進(jìn)行輸入的應(yīng)用中,如果我們?cè)谖⒖刂破?a target="_blank">端口中添加每個(gè)鍵,我們最終將使用 16 個(gè) I/O 端口。這 16 個(gè) I/O 端口不僅用于讀取 I/O 信號(hào),還可以用作外設(shè)連接,如 ADC 支持、I2C、SPI 連接也由這些 I/O 引腳支持。由于這些引腳與開關(guān)/鍵連接,因此我們不能將它們用作I / O端口。這完全沒有意義。那么,如何減少引腳數(shù)呢?答案是,使用十六進(jìn)制鍵盤或矩陣鍵盤;我們可以減少引腳數(shù)量,這些引腳數(shù)與4x4矩陣鍵相關(guān)聯(lián)。它將使用 8 個(gè)引腳,其中 4 個(gè)成行連接,4 個(gè)以列連接,因此節(jié)省了微控制器的 8 個(gè)引腳。

4x4 矩陣鍵盤的工作原理

poYBAGNzUqqAJJNdAACfU54PC0o273.png

在上圖中,矩陣鍵盤模塊顯示在左側(cè)。右側(cè)顯示了內(nèi)部連接以及端口連接。如果我們看到端口有 8 個(gè)引腳,從左到右的前 4 個(gè)是 X1、X2、X3 和 X4 是行,從左到右的最后 4 個(gè)是Y1、Y2、Y3、Y4是四列。如果我們制作 4 行或 X 側(cè)作為輸出并使它們邏輯低或0,并將 4列作為輸入并讀取鍵,我們將在對(duì)應(yīng)Y 得到 0時(shí)讀取開關(guān)按下。

同樣的事情也會(huì)發(fā)生在 nxn 矩陣中,其中 n是數(shù)字??梢允?3x3、6x6 等。

現(xiàn)在只要認(rèn)為1 被按下了。然后1 位于 X1 行和 Y1 列。如果 X1 為 0,則 Y1 將為 0。以同樣的方式,我們可以通過感應(yīng)列 Y1、Y2、Y3 和 Y4 來感知 X1 行中的每個(gè)鍵。每個(gè)開關(guān)都會(huì)發(fā)生這種情況,我們將讀取矩陣中開關(guān)的位置。

每個(gè)綠色圓圈都是開關(guān),它們都以相同的方式連接在一起。

在本教程中,我們將使用以下規(guī)格連接鍵盤-

我們將使用內(nèi)部上拉

我們將添加密鑰去抖動(dòng)選項(xiàng)

但是當(dāng)開關(guān)沒有被按下時(shí),我們需要使Y1、Y2、Y3 和 Y4達(dá)到高或 1。否則,我們無法檢測(cè)到按下開關(guān)時(shí)的邏輯變化。但是我們無法通過代碼或程序來實(shí)現(xiàn)它,因?yàn)檫@些引腳用作輸入,而不是輸出。因此,我們將在微控制器中使用內(nèi)部操作寄存器,并將這些引腳作為弱上拉使能模式運(yùn)行。通過使用此功能,當(dāng)它處于默認(rèn)狀態(tài)時(shí),將有一個(gè)邏輯高使能模式。

此外,當(dāng)我們按鍵時(shí),開關(guān)觸點(diǎn)會(huì)產(chǎn)生尖峰或噪音,因此會(huì)發(fā)生多次開關(guān)按下,這是意料之外的。因此,我們將首先檢測(cè)開關(guān)按下,等待幾毫秒,再次檢查開關(guān)是否仍然按下,如果開關(guān)仍然按下,我們將接受開關(guān)按下最終,否則不會(huì)。這稱為開關(guān)的去抖動(dòng)。

我們將在代碼中實(shí)現(xiàn)這一切,并在面包板上建立連接。

所需材料:

面包板

PC中的Pic-kit 3和開發(fā)環(huán)境,即MPLABX

電線和連接器

字符液晶屏 16x2

20兆赫晶體

2 個(gè) 33pF 陶瓷盤蓋。

4.7k 電阻

10k 預(yù)設(shè)(可變電阻)

4x4 矩陣鍵盤

一個(gè) 5 V 適配器

電路圖:

pYYBAGNzUk6AXZc_AAFD1_Jc-rc776.png

poYBAGNzUqyAVEg3AADztX9_qas970.jpg

我們將連接相關(guān)引腳中的晶體和電阻器。此外,我們將通過PORTD 以 4 位模式連接LCD。我們將六角鍵盤或矩陣鍵盤連接到端口RB4。

編程說明:

最后給出了矩陣鍵盤與PIC微控制器接口的完整代碼。代碼簡單易懂。鍵盤庫只是在代碼中要理解的東西。在這里,我們使用 keyboard.h 和 lcd.h 庫來連接鍵盤和 16x2 LCD。讓我們看看里面發(fā)生了什么。

在keypad.h內(nèi)部,我們將看到我們使用了默認(rèn)寄存器庫的xc.h標(biāo)頭,晶體頻率是為使用kepad.c文件中使用的延遲而定義的。我們?cè)赑ORTRB寄存器上定義了鍵盤端口,并將各個(gè)引腳定義為行 (X)和列(Y)。

我們還使用了兩個(gè)函數(shù),一個(gè)用于鍵盤初始化,它將端口重定向?yàn)檩敵龊洼斎耄硪粋€(gè)是開關(guān)按下掃描,它將在調(diào)用時(shí)返回開關(guān)按下狀態(tài)。

#include

#define _XTAL_FREQ 200000000 //Crystal Frequency, used in delay

#define X_1 RB0

#define X_2 RB1

#define X_3 RB2

#define X_4 RB3

#define Y_1 RB4

#define Y_2 RB5

#define Y_3 RB6

#define Y_4 RB7

#define Keypad_PORT PORTB

#define Keypad_PORT_Direction TRISB

void InitKeypad(void);

char switch_press_scan(void);

在keypad.c中,我們將看到當(dāng)鍵盤掃描儀函數(shù)未返回“n”時(shí),下面的函數(shù)將返回按鍵。

char switch_press_scan(void) // Get key from user

{

char key = 'n'; // Assume no key pressed

while(key=='n') // Wait untill a key is pressed

key = keypad_scanner(); // Scan the keys again and again

return key; //when key pressed then return its value

}

下面是鍵盤讀取功能。在每個(gè)步驟中,我們將行 X1、X2、X3 和 X4 設(shè)為 0,并讀取 Y1、Y2、Y3 和 Y4 狀態(tài)。延遲用于去抖動(dòng)效果,當(dāng)仍然按下開關(guān)時(shí),我們將返回與之關(guān)聯(lián)的值。當(dāng)沒有按下開關(guān)時(shí),我們將返回'n'。

char keypad_scanner(void)

{

X_1 = 0; X_2 = 1; X_3 = 1; X_4 = 1;

if (Y_1 == 0) { __delay_ms(100); while (Y_1==0); return '1'; }

if (Y_2 == 0) { __delay_ms(100); while (Y_2==0); return '2'; }

if (Y_3 == 0) { __delay_ms(100); while (Y_3==0); return '3'; }

if (Y_4 == 0) { __delay_ms(100); while (Y_4==0); return 'A'; }

X_1 = 1; X_2 = 0; X_3 = 1; X_4 = 1;

if (Y_1 == 0) { __delay_ms(100); while (Y_1==0); return '4'; }

if (Y_2 == 0) { __delay_ms(100); while (Y_2==0); return '5'; }

if (Y_3 == 0) { __delay_ms(100); while (Y_3==0); return '6'; }

if (Y_4 == 0) { __delay_ms(100); while (Y_4==0); return 'B'; }

X_1 = 1; X_2 = 1; X_3 = 0; X_4 = 1;

if (Y_1 == 0) { __delay_ms(100); while (Y_1==0); return '7'; }

if (Y_2 == 0) { __delay_ms(100); while (Y_2==0); return '8'; }

if (Y_3 == 0) { __delay_ms(100); while (Y_3==0); return '9'; }

if (Y_4 == 0) { __delay_ms(100); while (Y_4==0); return 'C'; }

X_1 = 1; X_2 = 1; X_3 = 1; X_4 = 0;

if (Y_1 == 0) { __delay_ms(100); while (Y_1==0); return '*'; }

if (Y_2 == 0) { __delay_ms(100); while (Y_2==0); return '0'; }

if (Y_3 == 0) { __delay_ms(100); while (Y_3==0); return '#'; }

if (Y_4 == 0) { __delay_ms(100); while (Y_4==0); return 'D'; }

return 'n';

}

我們還將在最后四個(gè)位上設(shè)置弱上拉,并將端口的方向設(shè)置為最后 4 個(gè)輸入和前 4 個(gè)作為輸出。 OPTION_REG &= 0x7F;用于在最后一個(gè)引腳上設(shè)置弱上拉模式。

void InitKeypad(void)

{

Keypad_PORT = 0x00; // Set Keypad port pin values zero

Keypad_PORT_Direction = 0xF0; // Last 4 pins input, First 4 pins output

OPTION_REG &= 0x7F;

}

在主PIC程序中(如下所示),我們首先設(shè)置了配置位,并包含了一些需要的庫。然后在無效的system_init功能中,我們初始化鍵盤和LCD。最后在主函數(shù)中,我們通過調(diào)用switch_press_scan()函數(shù)并將值返回給 lcd 來讀取鍵盤。

/*

* File: main.c

* Author: Sourav Gupta

* By:- circuitdigest.com

* Created on April 13, 2018, 2:26 PM

*/


// PIC16F877A Configuration Bit Settings


// 'C' source line config statements


// CONFIG

#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/PGM pin has PGM function; low-voltage programming enabled)

#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)





#include

#include

#include

#include "supporing_cfile/lcd.h"

#include "supporing_cfile/Keypad.h"


/*

Hardware related definition

*/

#define _XTAL_FREQ 200000000 //Crystal Frequency, used in delay


/*

Other Specific definition

*/

void system_init(void);



void main(void){

system_init();

char Key = 'n';

lcd_com(0x80);

lcd_puts("CircuitDigest");

lcd_com(0xC0);

while(1){

Key = switch_press_scan();

lcd_data(Key);

}


}


/*

* System Init

*/



void system_init(void){

TRISD = 0x00;

lcd_init(); // This will initialise the lcd

InitKeypad();

}

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • PIC16F877A
    +關(guān)注

    關(guān)注

    2

    文章

    43

    瀏覽量

    21737
  • 矩陣鍵盤
    +關(guān)注

    關(guān)注

    7

    文章

    205

    瀏覽量

    31345
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    PIC16F877A在proteus中讀寫AT24C512

    此時(shí)把I2C DEBUGGER的SCL線連接PIC16F877A和AT24C512的SCL線上,這樣PIC16F877A可以正常的寫AT24C512。當(dāng)PIC16F877A發(fā)送啟動(dòng)信
    發(fā)表于 12-30 16:09

    4x4矩陣鍵盤PIC16F877A問題接口

    嗨,我正在做一個(gè)項(xiàng)目,我需要使用一個(gè)4x4鍵盤,我已經(jīng)寫了代碼,但我不知道為什么它不是沃金。當(dāng)我想按下一個(gè)按鈕,例如7,這是在CulnN1(C1)和ROW1(R1)中,我寫一個(gè)像IF(R1==1
    發(fā)表于 10-16 08:04

    pic16f877a中文資料pdf

    pic16f877a中文資料
    發(fā)表于 07-15 13:20 ?4548次下載
    <b class='flag-5'>pic16f877a</b>中文資料pdf

    4x4矩陣鍵盤程序及原理圖PCB

    4x4矩陣鍵盤程序及原理圖PCB,供大家下載。
    發(fā)表于 12-21 18:25 ?0次下載

    PIC16F877A串口發(fā)送查詢方式

    PIC16F877A串口發(fā)送,查詢方式,就為了調(diào)出這個(gè)費(fèi)了我一天時(shí)間,原來是串口芯片電壓問題,現(xiàn)總結(jié)如下
    發(fā)表于 09-01 11:03 ?10次下載
    <b class='flag-5'>PIC16F877A</b>串口發(fā)送查詢方式

    PIC16F877A串口芯片電壓問題

    PIC16F877A串口發(fā)送,查詢方式,就為了調(diào)出這個(gè)費(fèi)了我一天時(shí)間,原來是串口芯片電壓問題,現(xiàn)總結(jié)如下
    發(fā)表于 09-01 11:15 ?9次下載
    <b class='flag-5'>PIC16F877A</b>串口芯片電壓問題

    PIC16F877矩陣鍵盤的識(shí)別

    PIC16F877矩陣鍵盤的識(shí)別
    發(fā)表于 11-16 19:51 ?7次下載
    <b class='flag-5'>PIC16F877</b><b class='flag-5'>矩陣</b><b class='flag-5'>鍵盤</b>的識(shí)別

    PIC16F877A開發(fā)板 數(shù)碼管動(dòng)態(tài)掃描實(shí)驗(yàn)

    //****************電子園PIC16F877A開發(fā)板 數(shù)碼管動(dòng)態(tài)掃描實(shí)驗(yàn)****************//////mcu: PIC16F877A 4MHz //2010年12月
    發(fā)表于 11-16 19:51 ?13次下載
    <b class='flag-5'>PIC16F877A</b>開發(fā)板 數(shù)碼管動(dòng)態(tài)掃描實(shí)驗(yàn)

    PIC16F877A開發(fā)板 普通IO驅(qū)動(dòng)74595實(shí)驗(yàn)

    : PIC16F877A 4MHz //2010年7月10日21:52:30//*********************************************************...
    發(fā)表于 11-16 19:51 ?13次下載
    <b class='flag-5'>PIC16F877A</b>開發(fā)板 普通IO驅(qū)動(dòng)74595實(shí)驗(yàn)

    PIC16F877A 看門狗定時(shí)器實(shí)驗(yàn)

    復(fù)位時(shí)為輸入狀態(tài) //PORTA.4(RA4)為開漏輸出 // //WDT運(yùn)行于獨(dú)立的內(nèi)部RC振蕩器,即使器件時(shí)鐘停振,WDT仍正常工作 //PIC16F877A單片機(jī)的WDT只...
    發(fā)表于 11-16 20:06 ?8次下載
    <b class='flag-5'>PIC16F877A</b> 看門狗定時(shí)器實(shí)驗(yàn)

    PIC16F877矩陣鍵盤的識(shí)別

    PIC16F877矩陣鍵盤的識(shí)別
    發(fā)表于 11-16 21:06 ?17次下載
    <b class='flag-5'>PIC16F877</b><b class='flag-5'>矩陣</b><b class='flag-5'>鍵盤</b>的識(shí)別

    帶有stm32的宏鍵盤4x4矩陣

    電子發(fā)燒友網(wǎng)站提供《帶有stm32的宏鍵盤4x4矩陣.zip》資料免費(fèi)下載
    發(fā)表于 07-28 14:19 ?5次下載
    帶有stm32的宏<b class='flag-5'>鍵盤</b><b class='flag-5'>4x4</b><b class='flag-5'>矩陣</b>

    使用熱敏打印機(jī)連接PIC16F877A并使用輕觸開關(guān)實(shí)現(xiàn)打印的教程

    在本教程中,我們將熱敏打印機(jī) CSN A1 與廣泛使用的 PIC 微控制器 PIC16F877A 連接。在本項(xiàng)目中,熱敏打印機(jī)連接
    的頭像 發(fā)表于 11-04 15:10 ?2469次閱讀
    使用熱敏打印機(jī)<b class='flag-5'>連接</b><b class='flag-5'>PIC16F877A</b>并使用輕觸開關(guān)實(shí)現(xiàn)打印的教程

    PIC16F877A開發(fā)板原理圖

    PIC16F877A開發(fā)板原理圖免費(fèi)下載。
    發(fā)表于 03-21 15:47 ?12次下載

    基于PIC16F877A4位密碼電子鎖的制作

    電子發(fā)燒友網(wǎng)站提供《基于PIC16F877A4位密碼電子鎖的制作.pdf》資料免費(fèi)下載
    發(fā)表于 10-10 09:19 ?0次下載
    基于<b class='flag-5'>PIC16F877A</b>的<b class='flag-5'>4</b>位密碼電子鎖的制作