Statistics
| Branch: | Revision:

ddr4s / fw / wiringPi / examples / lcd.c @ 32:cadb9025f1e0

History | View | Annotate | Download (6.07 KB)

1
/*
2
 * lcd.c:
3
 *        Text-based LCD driver.
4
 *        This is designed to drive the parallel interface LCD drivers
5
 *        based in the Hitachi HD44780U controller and compatables.
6
 *
7
 *        This test program assumes the following:
8
 *
9
 *        8-bit displays:
10
 *                GPIO 0-7 is connected to display data pins 0-7.
11
 *                GPIO 11 is the RS pin.
12
 *                GPIO 10 is the Strobe/E pin.
13
 *
14
 *        For 4-bit interface:
15
 *                GPIO 4-7 is connected to display data pins 4-7.
16
 *                GPIO 11 is the RS pin.
17
 *                GPIO 10 is the Strobe/E pin.
18
 *
19
 * Copyright (c) 2012-2013 Gordon Henderson.
20
 ***********************************************************************
21
 * This file is part of wiringPi:
22
 *        https://projects.drogon.net/raspberry-pi/wiringpi/
23
 *
24
 *    wiringPi is free software: you can redistribute it and/or modify
25
 *    it under the terms of the GNU Lesser General Public License as published by
26
 *    the Free Software Foundation, either version 3 of the License, or
27
 *    (at your option) any later version.
28
 *
29
 *    wiringPi is distributed in the hope that it will be useful,
30
 *    but WITHOUT ANY WARRANTY; without even the implied warranty of
31
 *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
32
 *    GNU Lesser General Public License for more details.
33
 *
34
 *    You should have received a copy of the GNU Lesser General Public License
35
 *    along with wiringPi.  If not, see <http://www.gnu.org/licenses/>.
36
 ***********************************************************************
37
 */
38

    
39
#include <stdio.h>
40
#include <stdlib.h>
41
#include <stdint.h>
42

    
43
#include <unistd.h>
44
#include <string.h>
45
#include <time.h>
46

    
47
#include <wiringPi.h>
48
#include <lcd.h>
49

    
50
#ifndef        TRUE
51
#  define        TRUE        (1==1)
52
#  define        FALSE        (1==2)
53
#endif
54

    
55
static unsigned char newChar [8] = 
56
{
57
  0b11111,
58
  0b10001,
59
  0b10001,
60
  0b10101,
61
  0b11111,
62
  0b10001,
63
  0b10001,
64
  0b11111,
65
} ;
66

    
67

    
68
// Global lcd handle:
69

    
70
static int lcdHandle ;
71

    
72
/*
73
 * usage:
74
 *********************************************************************************
75
 */
76

    
77
int usage (const char *progName)
78
{
79
  fprintf (stderr, "Usage: %s bits cols rows\n", progName) ;
80
  return EXIT_FAILURE ;
81
}
82

    
83

    
84
/*
85
 * scrollMessage:
86
 *********************************************************************************
87
 */
88

    
89
static const char *message =
90
  "                    "
91
  "Wiring Pi by Gordon Henderson. HTTP://WIRINGPI.COM/"
92
  "                    " ;
93

    
94
void scrollMessage (int line, int width)
95
{
96
  char buf [32] ;
97
  static int position = 0 ;
98
  static int timer = 0 ;
99

    
100
  if (millis () < timer)
101
    return ;
102

    
103
  timer = millis () + 200 ;
104

    
105
  strncpy (buf, &message [position], width) ;
106
  buf [width] = 0 ;
107
  lcdPosition (lcdHandle, 0, line) ;
108
  lcdPuts     (lcdHandle, buf) ;
109

    
110
  if (++position == (strlen (message) - width))
111
    position = 0 ;
112
}
113

    
114

    
115
/*
116
 * pingPong:
117
 *        Bounce a character - only on 4-line displays
118
 *********************************************************************************
119
 */
120

    
121
static void pingPong (int lcd, int cols)
122
{
123
  static int position = 0 ;
124
  static int dir      = 0 ;
125

    
126
  if (dir == 0)                // Setup
127
  {
128
    dir = 1 ;
129
    lcdPosition (lcdHandle, 0, 3) ;
130
    lcdPutchar  (lcdHandle, '*') ;
131
    return ;
132
  }
133

    
134
  lcdPosition (lcdHandle, position, 3) ;
135
  lcdPutchar (lcdHandle, ' ') ;
136
  position += dir ;
137

    
138
  if (position == cols)
139
  {
140
    dir = -1 ;
141
    --position ;
142
  }
143
  
144
  if (position < 0)
145
  {
146
    dir = 1 ;
147
    ++position ;
148
  }
149

    
150
  lcdPosition (lcdHandle, position, 3) ;
151
  lcdPutchar  (lcdHandle, '#') ;
152
}
153

    
154

    
155
/*
156
 * waitForEnter:
157
 *********************************************************************************
158
 */
159

    
160
static void waitForEnter (void)
161
{
162
  printf ("Press ENTER to continue: ") ;
163
  (void)fgetc (stdin) ;
164
}
165

    
166

    
167
/*
168
 * The works
169
 *********************************************************************************
170
 */
171

    
172
int main (int argc, char *argv[])
173
{
174
  int i ;
175
  int lcd ;
176
  int bits, rows, cols ;
177

    
178
  struct tm *t ;
179
  time_t tim ;
180

    
181
  char buf [32] ;
182

    
183
  if (argc != 4)
184
    return usage (argv [0]) ;
185

    
186
  printf ("Raspberry Pi LCD test\n") ;
187
  printf ("=====================\n") ;
188

    
189
  bits = atoi (argv [1]) ;
190
  cols = atoi (argv [2]) ;
191
  rows = atoi (argv [3]) ;
192

    
193
  if (!((rows == 1) || (rows == 2) || (rows == 4)))
194
  {
195
    fprintf (stderr, "%s: rows must be 1, 2 or 4\n", argv [0]) ;
196
    return EXIT_FAILURE ;
197
  }
198

    
199
  if (!((cols == 16) || (cols == 20)))
200
  {
201
    fprintf (stderr, "%s: cols must be 16 or 20\n", argv [0]) ;
202
    return EXIT_FAILURE ;
203
  }
204

    
205
  wiringPiSetup () ;
206

    
207
  if (bits == 4)
208
    lcdHandle = lcdInit (rows, cols, 4, 11,10, 4,5,6,7,0,0,0,0) ;
209
  else
210
    lcdHandle = lcdInit (rows, cols, 8, 11,10, 0,1,2,3,4,5,6,7) ;
211

    
212
  if (lcdHandle < 0)
213
  {
214
    fprintf (stderr, "%s: lcdInit failed\n", argv [0]) ;
215
    return -1 ;
216
  }
217

    
218
  lcdPosition (lcdHandle, 0, 0) ; lcdPuts (lcdHandle, "Gordon Henderson") ;
219
  lcdPosition (lcdHandle, 0, 1) ; lcdPuts (lcdHandle, "  wiringpi.com  ") ;
220

    
221
  waitForEnter () ;
222

    
223
  if (rows > 1)
224
  {
225
    lcdPosition (lcdHandle, 0, 1) ; lcdPuts (lcdHandle, "  wiringpi.com  ") ;
226

    
227
    if (rows == 4)
228
    {
229
      lcdPosition (lcdHandle, 0, 2) ;
230
      for (i = 0 ; i < ((cols - 1) / 2) ; ++i)
231
        lcdPuts (lcdHandle, "=-") ;
232
      lcdPuts (lcdHandle, "=3") ;
233

    
234
      lcdPosition (lcdHandle, 0, 3) ;
235
      for (i = 0 ; i < ((cols - 1) / 2) ; ++i)
236
        lcdPuts (lcdHandle, "-=") ;
237
      lcdPuts (lcdHandle, "-4") ;
238
    }
239
  }
240

    
241
  waitForEnter () ;
242

    
243
  lcdCharDef  (lcdHandle, 2, newChar) ;
244

    
245
  lcdClear    (lcdHandle) ;
246
  lcdPosition (lcdHandle, 0, 0) ;
247
  lcdPuts     (lcdHandle, "User Char: ") ;
248
  lcdPutchar  (lcdHandle, 2) ;
249

    
250
  lcdCursor      (lcdHandle, TRUE) ;
251
  lcdCursorBlink (lcdHandle, TRUE) ;
252

    
253
  waitForEnter () ;
254

    
255
  lcdCursor      (lcdHandle, FALSE) ;
256
  lcdCursorBlink (lcdHandle, FALSE) ;
257
  lcdClear       (lcdHandle) ;
258

    
259
  for (;;)
260
  {
261
    scrollMessage (0, cols) ;
262
    
263
    if (rows == 1)
264
      continue ;
265

    
266
    tim = time (NULL) ;
267
    t = localtime (&tim) ;
268

    
269
    sprintf (buf, "%02d:%02d:%02d", t->tm_hour, t->tm_min, t->tm_sec) ;
270

    
271
    lcdPosition (lcdHandle, (cols - 8) / 2, 1) ;
272
    lcdPuts     (lcdHandle, buf) ;
273

    
274
    if (rows == 2)
275
      continue ;
276

    
277
    sprintf (buf, "%02d/%02d/%04d", t->tm_mday, t->tm_mon + 1, t->tm_year+1900) ;
278

    
279
    lcdPosition (lcdHandle, (cols - 10) / 2, 2) ;
280
    lcdPuts     (lcdHandle, buf) ;
281

    
282
    pingPong (lcd, cols) ;
283
  }
284

    
285
  return 0 ;
286
}