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 |
} |