色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

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

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

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

通常,我們使用微控制器單元的單個I / O引腳來讀取數字信號,例如開關輸入。在少數需要 9、12、16 個鍵進行輸入的應用中,如果我們在微控制器端口中添加每個鍵,我們最終將使用 16 個 I/O 端口。這 16 個 I/O 端口不僅用于讀取 I/O 信號,還可以用作外設連接,如 ADC 支持、I2C、SPI 連接也由這些 I/O 引腳支持。由于這些引腳與開關/鍵連接,因此我們不能將它們用作I / O端口。這完全沒有意義。那么,如何減少引腳數呢?答案是,使用十六進制鍵盤或矩陣鍵盤;我們可以減少引腳數量,這些引腳數與4x4矩陣鍵相關聯。它將使用 8 個引腳,其中 4 個成行連接,4 個以列連接,因此節省了微控制器的 8 個引腳。

4x4 矩陣鍵盤的工作原理

poYBAGNzUqqAJJNdAACfU54PC0o273.png

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

同樣的事情也會發生在 nxn 矩陣中,其中 n是數字。可以是 3x3、6x6 等。

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

每個綠色圓圈都是開關,它們都以相同的方式連接在一起。

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

我們將使用內部上拉

我們將添加密鑰去抖動選項

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

此外,當我們按鍵時,開關觸點會產生尖峰或噪音,因此會發生多次開關按下,這是意料之外的。因此,我們將首先檢測開關按下,等待幾毫秒,再次檢查開關是否仍然按下,如果開關仍然按下,我們將接受開關按下最終,否則不會。這稱為開關的去抖動。

我們將在代碼中實現這一切,并在面包板上建立連接。

所需材料:

面包板

PC中的Pic-kit 3和開發環境,即MPLABX

電線和連接器

字符液晶屏 16x2

20兆赫晶體

2 個 33pF 陶瓷盤蓋。

4.7k 電阻

10k 預設(可變電阻)

4x4 矩陣鍵盤

一個 5 V 適配器

電路圖:

pYYBAGNzUk6AXZc_AAFD1_Jc-rc776.png

poYBAGNzUqyAVEg3AADztX9_qas970.jpg

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

編程說明:

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

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

我們還使用了兩個函數,一個用于鍵盤初始化,它將端口重定向為輸出和輸入,另一個是開關按下掃描,它將在調用時返回開關按下狀態。

#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中,我們將看到當鍵盤掃描儀函數未返回“n”時,下面的函數將返回按鍵。

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

}

下面是鍵盤讀取功能。在每個步驟中,我們將行 X1、X2、X3 和 X4 設為 0,并讀取 Y1、Y2、Y3 和 Y4 狀態。延遲用于去抖動效果,當仍然按下開關時,我們將返回與之關聯的值。當沒有按下開關時,我們將返回'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';

}

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

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程序中(如下所示),我們首先設置了配置位,并包含了一些需要的庫。然后在無效的system_init功能中,我們初始化鍵盤和LCD。最后在主函數中,我們通過調用switch_press_scan()函數并將值返回給 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();

}

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • PIC16F877A
    +關注

    關注

    2

    文章

    43

    瀏覽量

    21800
  • 矩陣鍵盤
    +關注

    關注

    7

    文章

    206

    瀏覽量

    31454
收藏 人收藏

    評論

    相關推薦

    PIC16F877A在proteus中讀寫AT24C512

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

    4x4矩陣鍵盤PIC16F877A問題接口

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

    pic16f877a中文資料pdf

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

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

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

    PIC16F877A串口發送查詢方式

    PIC16F877A串口發送,查詢方式,就為了調出這個費了我一天時間,原來是串口芯片電壓問題,現總結如下
    發表于 09-01 11:03 ?10次下載
    <b class='flag-5'>PIC16F877A</b>串口發送查詢方式

    PIC16F877A串口芯片電壓問題

    PIC16F877A串口發送,查詢方式,就為了調出這個費了我一天時間,原來是串口芯片電壓問題,現總結如下
    發表于 09-01 11:15 ?9次下載
    <b class='flag-5'>PIC16F877A</b>串口芯片電壓問題

    PIC16F877矩陣鍵盤的識別

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

    PIC16F877A開發板 數碼管動態掃描實驗

    //****************電子園PIC16F877A開發板 數碼管動態掃描實驗****************//////mcu: PIC16F877A 4MHz //2010年12月
    發表于 11-16 19:51 ?13次下載
    <b class='flag-5'>PIC16F877A</b>開發板 數碼管動態掃描實驗

    PIC16F877A開發板 普通IO驅動74595實驗

    : PIC16F877A 4MHz //2010年7月10日21:52:30//*********************************************************...
    發表于 11-16 19:51 ?13次下載
    <b class='flag-5'>PIC16F877A</b>開發板 普通IO驅動74595實驗

    PIC16F877A 看門狗定時器實驗

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

    PIC16F877矩陣鍵盤的識別

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

    帶有stm32的宏鍵盤4x4矩陣

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

    使用熱敏打印機連接PIC16F877A并使用輕觸開關實現打印的教程

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

    PIC16F877A開發板原理圖

    PIC16F877A開發板原理圖免費下載。
    發表于 03-21 15:47 ?12次下載

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

    電子發燒友網站提供《基于PIC16F877A4位密碼電子鎖的制作.pdf》資料免費下載
    發表于 10-10 09:19 ?0次下載
    基于<b class='flag-5'>PIC16F877A</b>的<b class='flag-5'>4</b>位密碼電子鎖的制作
    主站蜘蛛池模板: ava云直播| 一色屋精品亚洲香蕉网站| 亚洲看片网站| 18动漫在线观看| 俄罗斯12x13x处| 精品久久久久中文字幕日本| 两个吃奶一个添下面视频| 无码日韩人妻精品久久蜜桃免费| 视频在线观看高清免费看| 伊人网伊人网| 国产 亚洲 另类 欧美 在线| 韩国演艺圈悲惨在线| 欧美黄色第一页| 亚洲精品无码一区二区三区四虎| 97SE亚洲国产综合在线| 国产偷抇久久精品A片蜜臀AV| 妺妺窝人体色777777野大粗| 小小水蜜桃视频高清在线观看免费| 浴室里强摁做开腿呻吟的漫画| 厨房玩朋友娇妻中文字幕| 精品国产自在现线拍400部| 欧美性极品黑人hd| 一本到2019线观看| 国产短视频精品区| 男男校园园bl文全肉高h寝室| 亚洲AV久久无码高潮喷水| xxx88中国| 久久永久影院免费| 小黄鸭YELLOWDUCK7596| qvod电影资源| 老师在讲桌下边h边讲课| 亚洲AV國產国产久青草| 纯肉腐文高H总受男男| 美女裸露胸部100%无遮挡| 亚洲人成在线播放无码| 高中生被C到爽哭视频免费| 蜜桃无码AV视频在线观看| 亚洲一区高清| 国产偷啪自怕网| 四虎国产一区| 啊…嗯啊好深男男高h文总受|