Fórum témák

» Több friss téma
Cikkek » Kijelzők multiplex vezérlése (Dynamic Drive)
Kijelzők multiplex vezérlése (Dynamic Drive)
Szerző: Topi, idő: Máj 10, 2007, Olvasva: 28027, Oldal olvasási idő: kb. 1 perc
Lapozás: OK   3 / 4
Próba képpen, hogy mégis láss egy egyszerű meghajtást kiszedtem a nagy kijelzős DCF órámból egy modult, és egy szem magába, minden felesleges dolog nélkül vezéreltem PIC-el. 18LF4520-as PIC-et használtam, mert kb 20-szor gyorsabb programozni (időben kevesebb ideig írja az ICD2).
Íme a kapcsolás melyet megépítettem:

(Kattints a képre a nagyobb változathoz)


  1. #include <18F4520.h>
  2. #fuses HS,NOWDT,NOPROTECT,NOLVP,NOBROWNOUT
  3. #use delay(clock=20000000)
  4.  
  5. int characters[17] = {
  6. /* 0 */  0b00111111,
  7. /* 1 */  0b00000110,
  8. /* 2 */  0b01011011,
  9. /* 3 */  0b01001111,
  10. /* 4 */  0b01100110,
  11. /* 5 */  0b01101101,
  12. /* 6 */  0b01111101,
  13. /* 7 */  0b00000111,
  14. /* 8 */  0b01111111,
  15. /* 9 */  0b01101111,
  16. };
  17.  
  18. int disp[2] = {7,0};    //kijelző aktuális adat tömkelege
  19. int act_disp = 0;               //kijelző aktuális pozíciója
  20.  
  21. //===========================================================================
  22. #int_TIMER2                              
  23. void TIMER2_isr() {                      
  24. //===========================================================================
  25. int data;
  26.         output_d(0xFF); //kikapcsoljuk előbb a kijelzőt
  27.  
  28.         data = characters[disp[act_disp]]; //kiszedjük a karakter adatot
  29.         data = 0xFF-data;               //invertáljuk
  30.         output_c(act_disp+1);   //kirakjuk az "oszlop" címet
  31.         output_d(data);                 //kirakjuk az adatot
  32.  
  33.         act_disp++;                             //következő digit
  34.         if(act_disp>1) act_disp = 0;    //ha utsó digit
  35. }
  36.  
  37. //===========================================================================
  38. void init() {
  39. //===========================================================================
  40.   setup_timer_2(T2_DIV_BY_16,120,16);   //6ms körül
  41.   enable_interrupts( INT_TIMER2 );
  42.  
  43.   enable_interrupts( GLOBAL );
  44.  
  45.   output_d(0xFF);       //kikapcs mindent
  46.   output_c(0x00);
  47. }
  48.  
  49. //===========================================================================
  50. void main() {
  51. //===========================================================================
  52. int i;
  53.   init();
  54.   for(;;) {
  55.         disable_interrupts(INT_TIMER2); //nehogy frissítls közben írjuk a tömböt
  56.  
  57.         //látható felfelé számlálás
  58.         i++;
  59.         if(i>99) i = 0;
  60.         disp[0] = i/10;
  61.         disp[1] = i%10;
  62.  
  63.         enable_interrupts(INT_TIMER2);
  64.         delay_ms(100);
  65.   }
  66. }
A fenti kódot CCS-C ben írtam, megpróbáltam felkommentezni elég érthetően...
A lényeg, hogy a timer frissít. Ezt érdemes megtartani nagyobb projekteknél is, mivel lehet több utasítás idejű rutin is, ami hogyha a fő LOOP-ban fut, akkor megakaszthatja a frissítést.

Íme videók a működéséről.

A cikk még nem ért véget, lapozz!
Következő: »»   3 / 4
É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