- Varför vi behöver 4x4-knappsats:
- Så här fungerar 4x4 Matrix Keypad:
- Material som krävs:
- Kretsschema:
- Programmeringsförklaring:
Knappsatser används ofta för inmatningsenheter som används i olika elektronik- och inbäddade projekt. De används för att ta inmatningar i form av siffror och alfabet och mata in dem i systemet för vidare bearbetning. I denna handledning ska vi gränssnitt en 4x4 matris tangentbord med PIC16F877A.
Innan vi går in i detaljlogiken och lär oss hur man använder knappsatsen behöver vi få saker.
Varför vi behöver 4x4-knappsats:
Vanligtvis använder vi en enda I / O-stift på en mikrokontroller för att läsa den digitala signalen, som en switchingång. I några applikationer där 9, 12, 16 nycklar behövs för inmatningsändamål, om vi lägger till varje nyckel i en mikrokontrollport kommer vi att sluta använda 16 I / O-portar. Dessa 16 I / O-portar är inte bara för att läsa I / O-signaler, men de kan också användas som perifera anslutningar, som ADC-stöd, I2C, SPI-anslutningar stöds också av dessa I / O-stift. Eftersom dessa stift är anslutna till omkopplarna / tangenterna kan vi inte använda dem utan bara som I / O-portar. Detta är ingen mening alls. Så, hur kan man minska antalet stift? Svaret är att använda en hex-knappsats eller matris-knappsats; vi kan minska antalet stift, som associerar 4x4 matrisnycklar. Den använder 8 stift varav 4 anslutna i rader och 4 anslutna i kolumner, vilket sparar 8 stift på mikrokontrollern.
Så här fungerar 4x4 Matrix Keypad:
I den övre bilden visas en matrisstangentmodul till vänster. Till höger visas den interna anslutningen samt portanslutning. Om vi ser porten finns det 8 stift, de första 4 från vänster till höger är X1, X2, X3 och X4 är raderna, och de sista 4 från vänster till höger är Y1, Y2, Y3, Y4 är fyra kolumner. Om vi gör 4 rader eller X-sidan som utdata och gör dem logiska låga eller 0, och gör de 4 kolumnerna som inmatning och läser tangenterna kommer vi att läsa omkopplaren när korrespondent Y får 0.
Samma sak kommer att hända i nxn- matris där n är siffran. Det kan vara 3x3, 6x6 etc.
Tänk nu bara att 1 är nedtryckt. Sedan ligger 1 vid X1-rad och Y1-kolumn. Om X1 är 0 blir Y1 0. På samma sätt kan vi känna av varje tangent i X1-raden genom att känna av kolumn Y1, Y2, Y3 och Y4. Den här saken händer för varje omkopplare och vi kommer att läsa omkopplarnas position i matrisen.
Varje gröna cirklar är omkopplaren och de är båda anslutna på samma sätt.
I den här guiden kommer vi att gränssnitt tangentbordet med följande specifikationer-
- Vi kommer att använda intern pull up
- Vi kommer att lägga till nyckelavvisningsalternativ
Men när man inte trycker på omkopplarna måste vi göra Y1, Y2, Y3 och Y4 lika höga eller 1. Annars kan vi inte upptäcka logiska förändringar när man trycker på omkopplaren. Men vi kunde inte göra det med koder eller program på grund av att dessa stift används som ingång, inte som utgång. Så vi kommer att använda ett internt operationsregister i mikrokontrollern och hantera dessa stift som svagt pull up-aktiverat läge. Genom att använda detta kommer det att finnas ett logiskt högaktiveringsläge när det är i standardläge.
Dessutom, när vi trycker på tangenten finns det spikar eller ljud genereras med switchkontakter, och på grund av detta händer flera switchar vilket inte förväntas. Så, vi kommer först att upptäcka omkopplartrycket, vänta några millisekunder, kontrollera igen om omkopplaren fortfarande är intryckt eller inte och om omkopplaren fortfarande är intryckt kommer vi att acceptera omkopplaren äntligen annars inte. Detta kallas som avstängning av omkopplarna.
Vi kommer att implementera allt detta i vår kod och göra anslutningen på breadboard.
Kontrollera också hur man gränssnitt 4x4 knappsats med andra mikrokontroller:
- Knappsatsgränssnitt med Arduino Uno
- 4x4 matris tangentbord gränssnitt med 8051 mikrokontroller
- 4x4-knappsatsgränssnitt med ATmega32 Microcontroller
- Raspberry Pi Digital kodlås på brödbräda
Material som krävs:
- Bakbord
- Pic-kit 3 och utvecklingsmiljö på din dator, dvs MPLABX
- Ledningar och kontakter
- Karaktär LCD 16x2
- 20Mhz kristall
- 2 st 33pF keramiskt skivlock.
- 4,7 k motstånd
- 10k förinställning (variabelt motstånd)
- Matrittangentbord 4x4
- En 5 V-adapter
Kretsschema:
Vi ansluter kristallerna och motståndet i tillhörande stift. Dessutom kommer vi att ansluta LCD-skärmen i 4-bitars läge över PORTD. Vi anslöt hex-tangentbordet eller matris-tangentbordet över porten RB4.
Om du är ny på PIC, börja med Komma igång med PIC Microcontroller: Introduktion till PIC och MPLABX
Programmeringsförklaring:
Komplett kod för gränssnitt mellan Matrix Keypad och PIC Microcontroller ges i slutet. Koden är lätt och självförklarande. Tangentbiblioteket är det enda som ska förstås i koden. Här har vi använt keypad.h och lcd.h Library för att koppla ihop tangentbordet och 16x2 LCD. Så får se vad som händer inuti det.
Inuti tangentbordet.h kommer vi att se att vi har använt xc.h- rubrik som är standardregisterbiblioteket, kristallfrekvensen definieras för användning för fördröjning som används i kepad.c- filen. Vi definierade knappsatsportarna vid PORTRB- registret och definierade individuella stift som rad (X) och kolumner (Y).
Vi använde också två funktioner, en för initiering av tangentbordet, som kommer att omdirigera porten som utgång och inmatning, och en omkopplare tryck på scan som kommer att återställa omkopplarens tryckstatus när du ringer.
#omfatta
På knappsatsen.c ser vi att funktionen nedan kommer att återföra tangenttryckningen när knappsatsskannerfunktionen inte returnerar 'n'.
char switch_press_scan (void) // Hämta nyckel från användaren { char key = 'n'; // Antag att ingen tangent trycks ned medan (tangent == 'n') // Vänta tills en tangent trycks ned tangent = knappsatsskanner (); // Skanna nycklarna igen och igen returtangenten; // när du trycker på tangenten, returnera dess värde }
Nedan visas knappsatsens läsfunktion. I varje steg kommer vi att göra raden X1, X2, X3 och X4 som 0 och läsa Y1, Y2, Y3 och Y4 status. Fördröjningen används för avvisningseffekten, när omkopplaren fortfarande är intryckt returnerar vi värdet som är associerat med det. När ingen omkopplare trycks in kommer vi att returnera 'n'.
char keypad_scanner (ogiltigt) { X_1 = 0; X_2 = 1; X_3 = 1; X_4 = 1; om (Y_1 == 0) {__fördröjning_ms (100); medan (Y_1 == 0); returnera '1'; } om (Y_2 == 0) {__fördröjning_ms (100); medan (Y_2 == 0); returnera '2'; } om (Y_3 == 0) {__fördröja_ms (100); medan (Y_3 == 0); returnera '3'; } om (Y_4 == 0) {__fördröjning_ms (100); medan (Y_4 == 0); returnera 'A'; } X_1 = 1; X_2 = 0; X_3 = 1; X_4 = 1; om (Y_1 == 0) {__fördröjning_ms (100); medan (Y_1 == 0); returnera '4'; } om (Y_2 == 0) {__fördröjning_ms (100); medan (Y_2 == 0); returnera '5'; } om (Y_3 == 0) {__fördröja_ms (100); medan (Y_3 == 0); returnera '6'; } om (Y_4 == 0) {__fördröj_ms (100); medan (Y_4 == 0); returnera 'B'; } X_1 = 1; X_2 = 1; X_3 = 0; X_4 = 1; om (Y_1 == 0) {__fördröjning_ms (100); medan (Y_1 == 0); returnera '7'; } om (Y_2 == 0) {__fördröjning_ms (100); medan (Y_2 == 0); returnera '8'; } om (Y_3 == 0) {__fördröja_ms (100); medan (Y_3 == 0); returnera '9'; } om (Y_4 == 0) {__fördröj_ms (100); medan (Y_4 == 0); returnera 'C'; } X_1 = 1; X_2 = 1; X_3 = 1; X_4 = 0; om (Y_1 == 0) {__fördröjning_ms (100); medan (Y_1 == 0); lämna tillbaka '*'; } om (Y_2 == 0) {__fördröjning_ms (100); medan (Y_2 == 0); returnera '0'; } om (Y_3 == 0) {__fördröja_ms (100); medan (Y_3 == 0); lämna tillbaka '#'; } om (Y_4 == 0) {__fördröj_ms (100); medan (Y_4 == 0); returnera 'D'; } returnera 'n'; }
Vi kommer också att ställa in det svaga uppdraget på de sista fyra bitarna, och också ställa in riktningen på portarna som de senaste 4 ingångarna och de första 4 som utgångar. Den OPTION_REG & = 0x7F; används för att ställa in det svaga uppdragsläget på de sista stiften.
ogiltigt InitKeypad (ogiltigt) { Keypad_PORT = 0x00; // Ställ in tangentbordsportens nollvärden noll Keypad_PORT_Direction = 0xF0; // Ingång för de fyra sista stiften, först 4 stift utgång OPTION_REG & = 0x7F; }
I huvud-PIC-programmet (ges nedan) ställde vi först in konfigurationsbitarna och inkluderade några bibliotek som behövdes. Sedan i ogiltiga system_initfunktioner initialiserar vi knappsatsen och LCD-skärmen. Och slutligen i i huvudfunktion vi läst knappsatsen genom att anropa switch_press_scan () funktion och returnera värdet till lcd.
Ladda ner hela koden med rubrikfiler härifrån och kolla demonstrationsvideon nedan.