Rev Author Line No. Line
193 miho 1 // LCD Terminal pro menic pro solarni vozitko
2 // (c)miho 2005
3  
4 // Pouziva PIC16F84 (mozno i jakykoli jiny, nepouzivaji se zadne specialni funkce).
5 // Na vstupnim vyvodu RS_IN ocekava seriovou komunikaci rychlosti RS_BOUD. Pri detekci
6 // start bitu pomoci preruseni dojde k programovemu prijmu znaku a jeho zarazeni do
7 // fronty FIFO. Po navratu z preruseni dochazi k vypisu na pripojeny dvouradkovy
8 // LCD displej. Program zpracovava ridici kody dle knihovny LCD.C. Pri delsich vypisech
9 // musi vysilajici strana ponechat (obcas) nejaky cas na zpracovani (napriklad 20ms).
10  
11 #include <16F84.h> // define standardnich konstant procesoru
12 #use delay(clock=4000000) // standardni krystal
13 #fuses HS, NOWDT, NOPUT, NOPROTECT
14  
15  
16 // Parmetry komuniace
17 //
18 #define INV // definuje polaritu
19 #define RS_BOUD 9600 // komunikacni rychlost
20 #define RS_IN PIN_B0 // musi to byt vstup extrniho preruseni
21  
22  
23 // Pripojeni LCD displeje
24 //
25 #define LCD_RS PIN_A0 // rizeni registru LCD displeje
26 #define LCD_E PIN_A1 // enable LCD displeje
27 #define LCD_DATA_LSB PIN_B4 // pripojeni LSB bitu datoveho portu LCD displeje (celkem 4 bity vzestupne za sebou)
28  
29 #include "LCD.C"
30  
31  
32 // Vstup seriovky
33 //
34 #ifdef INV
35 #use RS232 (BAUD=RS_BOUD, RCV=RS_IN, PARITY=N, INVERT)
36 #else
37 #use RS232 (BAUD=RS_BOUD, RCV=RS_IN, PARITY=N)
38 #endif
39  
40  
41 // Buffer FIFO
42 //
43 #define MAX 40 // delka bufferu
44  
45 char c[MAX]; // bufer FIFO
46 unsigned int ci; // ukazatel na bunku kam se bude ukladat novy znak
47 unsigned int co; // ukazatel na bunku odkud se bude cist znak
48  
49 // Preruseni - ukladani dat ze seriovky do bufferu
50 //
51 #int_ext // preruseni od zacatku znaku (start bit)
52 void Interupt()
53 {
54 c[ci]=getc(); // nacti znak (asynchronni cteni programem)
55  
56 if (ci<(MAX-1)) ci++; else ci=0; // posun ukazovatko do FIFO
57  
58 #ifdef INV
59 while(input(PIN_B0)); // pockej na konec posledniho bitu
60 #else
61 while(~input(PIN_B0)); // pockej na konec posledniho bitu
62 #endif
63 }
64  
65  
66 // Hlavni smycka
67 //
68 void main()
69 {
70 char ch; // pomocna promenna pro 1 znak
71  
72 // Inicializace portu
73 output_a(0); // vsechny porty vystupni
74 output_b(0); // a nulove krome
75 output_float(RS_IN); // portu pro RS232 (a preruseni)
76  
77 // Inicializace LCD
78 lcd_init(); // inicializace LCD
79 printf(lcd_putc,"LCD Terminal 1.0"); // standardni vypis
80 #ifdef INV
81 printf(lcd_putc,"\nInverted"); // oznameni o inverzni variante
82 #else
83 printf(lcd_putc,"\nStandard"); // oznameni o inverzni variante
84 #endif
85 delay_ms(300); // cas na precteni
86 printf(lcd_putc,"\f"); // smazani displeje
87  
88 // Inicializace FIFO ukazatelu
89 ci=0;
90 co=0;
91  
92 // Inicializace preruseni
93 #ifdef INV // dle polarity kominkace polarita preruseni
94 ext_int_edge(L_TO_H);
95 #else
96 ext_int_edge(H_TO_L);
97 #endif
98 enable_interrupts(int_ext); // povoleni preruseni od INT0
99 enable_interrupts(global); // povoleni globalniho preruseni
100  
101 // Hlavni smycka
102 while (1)
103 {
104  
105 // Test na neprazdny buffer
106 while (ci==co);
107  
108 // Zobrazeni znaku
109 lcd_putc(c[co]);
110  
111 // Posunuti ukazovatka
112 if (co<(MAX-1)) co++; else co=0;
113 }
114 }