Fórum témák

» Több friss téma
Cikkek » Charlieplexing - Avagy 12 kapcsoló 4 vezetéken
Charlieplexing - Avagy 12 kapcsoló 4 vezetéken
Szerző: Electro, idő: Jún 15, 2010, Olvasva: 22558, Oldal olvasási idő: kb. 2 perc
Lapozás: OK   4 / 6

A gombmátrix leteszteléséhez egy ATMEL ATmega88-20PU típusú AVR mikrovezérlőt és egy 2x7-szegmenses LED-kijelzőt használtam.

Az ATmega88-20PU egy 28 lábú jószág, és tudásához képest olcsó.

Íme! Ő az...

Mielőtt megnéznénk a tasztatúrát működés közben, nézzük meg a mikrovezérlőben futó programot.

A 7-szegmenses kijelző az AVR B portjára van kötve. Mivel a 7-szegmenses kijelzőkön van egy pont is, így teljesen ki tudjuk használni a mikrovezérlő portját, mivel a B portnak 8 kivezetése / portlába van (0-tól 7-ig). Az én 2x7-szegmenses kijelzőm nincs gyárilag multiplexelve, így ezt bedugós panelon vezetékekkel kellett megoldjam. Aki még nem multiplexelt, az könnyen elsajátíthatja a módszert Topi cikke alapján.

Íme a kód:

  1. #include <avr/io.h>
  2. #include <util/delay.h>
  3.  
  4. unsigned char characters[10] = {  // Egy 10 elemű tömbben felvesszük az egyes számok bináris formáit, és itt nem a reális bináris formára gondolok, hanem az AVR lábainak bekötéséből adódó bináris számsorra.
  5. //PB portok           76543210 - ezek a B port lábainak sorszámai
  6.     /* 0 */  0b01000000,
  7.     /* 1 */  0b01111001,
  8.     /* 2 */  0b00100100,
  9.     /* 3 */  0b00110000,
  10.     /* 4 */  0b00011001,
  11.     /* 5 */  0b00010010,
  12.     /* 6 */  0b00000010,
  13.     /* 7 */  0b01011000,
  14.     /* 8 */  0b00000000,
  15.     /* 9 */  0b00010000,
  16.     };
  17.  
  18.  
  19. unsigned char beolvas(void) {  // Ez a beolvasófüggvény fog
  20.                        // gondoskodni a tasztatúra kezeléséről.
  21.         DDRB = 0b00000010;   // Itt végezzük el a portváltásokat
  22.         PORTB = 0b00011100;
  23.         _delay_us(100);     // Megvárjuk, míg a portváltások aktualizálódnak
  24.         if ((PINB & (1<<PINB2)) == 0) {   // Elvégezzük az ellenőrzéseket
  25.             return 1;
  26.         }
  27.         if ((PINB & (1<<PINB3)) == 0) {
  28.             return 2;
  29.         }
  30.         if ((PINB & (1<<PINB4)) == 0) {
  31.             return 3;
  32.         }
  33.         DDRB = 0b00000000;   // Visszaállítunk minden portot
  34.         _delay_us(100);     // Ismét várakozunk
  35.  
  36.         DDRB = 0b00000100;   // Innentől ugyanaz a logika, csak más lábakon
  37.         PORTB = 0b00011010;
  38.         _delay_us(100);
  39.         if ((PINB & (1<<PINB1)) == 0) {
  40.             return 4;
  41.         }
  42.         if ((PINB & (1<<PINB3)) == 0) {
  43.             return 5;
  44.         }
  45.         if ((PINB & (1<<PINB4)) == 0) {
  46.             return 6;
  47.         }
  48.         DDRB = 0b00000000;
  49.         _delay_us(100);
  50.  
  51.         DDRB = 0b00001000;
  52.         PORTB = 0b00010110;
  53.         _delay_us(100);
  54.         if ((PINB & (1<<PINB1)) == 0) {
  55.             return 7;
  56.         }
  57.         if ((PINB & (1<<PINB2)) == 0) {
  58.             return 8;
  59.         }
  60.         if ((PINB & (1<<PINB4)) == 0) {
  61.             return 9;
  62.         }
  63.         DDRB = 0b00000000;
  64.         _delay_us(100);
  65.  
  66.         DDRB = 0b00010000;
  67.         PORTB = 0b00001110;
  68.         _delay_us(100);
  69.         if ((PINB & (1<<PINB1)) == 0) {
  70.             return 10;
  71.         }
  72.         if ((PINB & (1<<PINB2)) == 0) {
  73.             return 11;
  74.         }
  75.         if ((PINB & (1<<PINB3)) == 0) {
  76.             return 12;
  77.         }
  78.         DDRB = 0b00000000;
  79.         _delay_us(100);
  80.  
  81.     return 0;
  82. }
  83.  
  84.  
  85. void kiiras(unsigned char mit) {  // A kiírás függvényt a főprogramban paraméterezve fogjuk meghívni, és a paraméter a beolvas függvény
  86.  
  87.     unsigned char mit10es = mit/10;  // A beolvas függvény visszatérési értékét simán elosztjuk 10-zel...
  88.     unsigned char mit1es = mit%10; // ...majd ismét elosztjuk, de itt maradékos osztást csinálunk.
  89.  
  90.     DDRC = 0b00000011;  // Beállítjuk a portok állapotát
  91.     DDRD = 0b01111111;
  92.  
  93.     PORTC = 0b00000010;  // Itt kapcsolunk közöst a 10-es helyiértéken lévő szegmensnek...
  94.     PORTD = characters[mit10es];  // ...és kiírjuk az osztás eredményét ide.
  95.     _delay_ms(5);  // Várunk... :S
  96.      
  97.     PORTC = 0b00000001;  // Itt kapcsolunk közöst az 1-es helyiértéken lévő szegmensnek...
  98.     PORTD = characters[mit1es];  // ...majd a maradékos osztás eredményét íratjuk ki ide.
  99.     _delay_ms(5);  // Hadd ne mondjam...
  100. }
  101.  
  102.  
  103. int main(void) {
  104.  
  105.     MCUCR = MCUCR & (!(1<<PUD));
  106.    
  107.     while (1) {  // Egy végtelen ciklus felel a program folyamatos futásáért.
  108.    
  109.         kiiras(beolvas());  // Íme a fentebb említett paraméterezéses módszer.
  110.    
  111.     }    
  112.  
  113. }


A cikk még nem ért véget, lapozz!
Következő: »»   4 / 6
Értékeléshez bejelentkezés szükséges!
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem