Gordons Projects

--> Projects Top-Level GIT

Initial move to GIT for the gpioExamples
[gpioExamples] / lcd / lcd.c
1
2 /*
3  * ldc.c:
4  *      Simple test program to drive LCD device
5  *
6  *      Gordon Henderson, gordon@drogon.net
7  */
8
9 #include <wiringPi.h>
10
11 #include <stdio.h>
12 #include <stdlib.h>
13 #include <stdint.h>
14
15 // LCD pins
16
17 #define RS      8
18 #define STRB    9
19
20 // commands
21
22 #define LCD_CLEAR       0x01
23 #define LCD_HOME        0x02
24 #define LCD_ENTRY       0x04
25 #define LCD_ON_OFF      0x08
26 #define LCD_CDSHIFT     0x10
27 #define LCD_FUNC        0x20
28 #define LCD_CGRAM       0x40
29 #define LCD_DGRAM       0x80
30
31 #define LCD_ENTRY_SH    0x01
32 #define LCD_ENTRY_ID    0x02
33
34 #define LCD_ON_OFF_B    0x01
35 #define LCD_ON_OFF_C    0x02
36 #define LCD_ON_OFF_D    0x04
37
38 #define LCD_FUNC_F      0x04
39 #define LCD_FUNC_N      0x08
40 #define LCD_FUNC_DL     0x10
41
42 #define LCD_CDSHIFT_RL  0x04
43
44
45 void dataByte (uint8_t data)
46 {
47   uint8_t i ;
48
49   for (i = 0 ; i < 8 ; ++i)
50   {
51     digitalWrite (i, (data & 1)) ;
52     data >>= 1 ;
53   }
54 }
55
56 void putCommand (uint8_t command)
57 {
58   digitalWrite (RS,   0) ;
59   digitalWrite (STRB, 1) ;
60   dataByte     (command) ;
61   delay (1) ;
62   digitalWrite (STRB, 0) ;
63   delay (1) ;
64 }
65
66 void lcdPosition (int x, int y)
67 {
68   uint8_t l2 = LCD_DGRAM ;
69
70   if (y == 1)
71     l2 |= 0x40 ;
72
73   l2 += x ;
74   putCommand (l2) ;
75 }
76
77
78 void lcdPutchar (uint8_t data)
79 {
80   digitalWrite (RS,   1) ;
81   digitalWrite (STRB, 1) ;
82   dataByte     (data) ;
83   delay (1) ;
84   digitalWrite (STRB, 0) ;
85   delay (1) ;
86 }
87
88 void lcdPuts (char *string)
89 {
90   while (*string)
91     lcdPutchar (*string++) ;
92 }
93
94 void setup (void)
95 {
96   uint8_t i ;
97
98   if (wiringPiSetup () == -1)
99     exit (1) ;
100
101   for (i = 0 ; i < 8 ; ++i)
102   {
103     digitalWrite (i, 0) ;
104     pinMode      (i, OUTPUT) ;
105   }
106
107   digitalWrite (RS, 0) ;
108   pinMode      (RS, OUTPUT) ;
109
110   digitalWrite (STRB, 1) ;
111   pinMode      (STRB, OUTPUT) ;
112
113   delay (35) ; // mS
114   putCommand (LCD_FUNC | LCD_FUNC_DL | LCD_FUNC_N) ;
115   delay (5) ;
116   putCommand (LCD_FUNC | LCD_FUNC_DL | LCD_FUNC_N) ;
117   delay (5) ;
118   putCommand (LCD_FUNC | LCD_FUNC_DL | LCD_FUNC_N) ;
119   delay (5) ;
120
121   putCommand (LCD_ON_OFF | LCD_ON_OFF_D) ;
122   delay (2) ;
123   putCommand (LCD_ENTRY | LCD_ENTRY_ID) ;
124   delay (2) ;
125   putCommand (LCD_CDSHIFT | LCD_CDSHIFT_RL) ;
126   delay (2) ;
127   putCommand (LCD_CLEAR) ;
128   delay (5) ;
129 }
130
131 int main (void)
132 {
133   printf ("Raspberry Pi LCD test program\n") ;
134
135   setup () ;
136
137   lcdPosition (0, 0) ; lcdPuts ("http://projects.") ;
138   delay (5) ;
139   lcdPosition (0, 1) ; lcdPuts ("  drogon.net/") ;
140   delay (5) ;
141
142   return 0 ;
143 }