Test of LCD code

Dependencies:   mbed

Committer:
garyr
Date:
Fri May 30 12:24:56 2014 +0000
Revision:
0:a4d44dfd2f03
LCD test code

Who changed what in which revision?

UserRevisionLine numberNew contents of line
garyr 0:a4d44dfd2f03 1 #include "mbed.h"
garyr 0:a4d44dfd2f03 2 #include "lcd_i2c.h"
garyr 0:a4d44dfd2f03 3 /*
garyr 0:a4d44dfd2f03 4 LCD (Optrex DCM16230, DCM20261, etc.) via I2C using a PCF8574
garyr 0:a4d44dfd2f03 5
garyr 0:a4d44dfd2f03 6 Frequency (clks/sec) Frequency
garyr 0:a4d44dfd2f03 7 Transfer rate = ------------------------------------------------ = ---------------- (characters/sec)
garyr 0:a4d44dfd2f03 8 9 clks/write * 3 writes/nibble * 2 nibbles/character 54
garyr 0:a4d44dfd2f03 9 */
garyr 0:a4d44dfd2f03 10 I2C i2c(p9, p10); // (sda, scl)
garyr 0:a4d44dfd2f03 11 Serial pc2(USBTX, USBRX); // tx, rx
garyr 0:a4d44dfd2f03 12
garyr 0:a4d44dfd2f03 13 // PCF8574 output bits Px
garyr 0:a4d44dfd2f03 14 #define RS BIT1
garyr 0:a4d44dfd2f03 15 #define RW BIT2
garyr 0:a4d44dfd2f03 16 #define E BIT3
garyr 0:a4d44dfd2f03 17 #define DB4 BIT4
garyr 0:a4d44dfd2f03 18 #define DB5 BIT5
garyr 0:a4d44dfd2f03 19 #define DB6 BIT6
garyr 0:a4d44dfd2f03 20 #define DB7 BIT7
garyr 0:a4d44dfd2f03 21
garyr 0:a4d44dfd2f03 22 char update[NUPDATE];
garyr 0:a4d44dfd2f03 23 char cw, address;
garyr 0:a4d44dfd2f03 24
garyr 0:a4d44dfd2f03 25 int updateDisplay(char *str, int nchars)
garyr 0:a4d44dfd2f03 26 {
garyr 0:a4d44dfd2f03 27 char w, ch, *p;
garyr 0:a4d44dfd2f03 28 int n, k, rc;
garyr 0:a4d44dfd2f03 29
garyr 0:a4d44dfd2f03 30 if (nchars > 20)
garyr 0:a4d44dfd2f03 31 return 1;
garyr 0:a4d44dfd2f03 32 n = 0;
garyr 0:a4d44dfd2f03 33 p = update;
garyr 0:a4d44dfd2f03 34 for (k = 0; k < nchars; k++)
garyr 0:a4d44dfd2f03 35 {
garyr 0:a4d44dfd2f03 36 // write most significant nibble
garyr 0:a4d44dfd2f03 37 ch = *str++;
garyr 0:a4d44dfd2f03 38 w = (ch & 0xf0) | cw;
garyr 0:a4d44dfd2f03 39 *p++ = w;
garyr 0:a4d44dfd2f03 40 *p++ = w | E;
garyr 0:a4d44dfd2f03 41 *p++ = w;
garyr 0:a4d44dfd2f03 42
garyr 0:a4d44dfd2f03 43 // write least significant nibble
garyr 0:a4d44dfd2f03 44 w = (ch << 4) | cw;
garyr 0:a4d44dfd2f03 45 *p++ = w;
garyr 0:a4d44dfd2f03 46 *p++ = w | E;
garyr 0:a4d44dfd2f03 47 *p++ = w;
garyr 0:a4d44dfd2f03 48 n += 6;
garyr 0:a4d44dfd2f03 49 }
garyr 0:a4d44dfd2f03 50 rc = i2c.write(address, update, n); // rc == 0 ==> ACK
garyr 0:a4d44dfd2f03 51 return rc;
garyr 0:a4d44dfd2f03 52 }
garyr 0:a4d44dfd2f03 53
garyr 0:a4d44dfd2f03 54 int write4Bits(char data)
garyr 0:a4d44dfd2f03 55 {
garyr 0:a4d44dfd2f03 56 char w;
garyr 0:a4d44dfd2f03 57 int rc;
garyr 0:a4d44dfd2f03 58
garyr 0:a4d44dfd2f03 59 w = (data & 0xf0) | cw; // grab the left nibble
garyr 0:a4d44dfd2f03 60 update[0] = w;
garyr 0:a4d44dfd2f03 61 update[1] = w | E;
garyr 0:a4d44dfd2f03 62 update[2] = w & ~ E;
garyr 0:a4d44dfd2f03 63 rc = i2c.write(address, update, 3);
garyr 0:a4d44dfd2f03 64 return rc;
garyr 0:a4d44dfd2f03 65 }
garyr 0:a4d44dfd2f03 66
garyr 0:a4d44dfd2f03 67 int initLcd(int i2cAddress, int frequency)
garyr 0:a4d44dfd2f03 68 {
garyr 0:a4d44dfd2f03 69 typedef struct {
garyr 0:a4d44dfd2f03 70 char cmd;
garyr 0:a4d44dfd2f03 71 char numNibbles;
garyr 0:a4d44dfd2f03 72 char delayMs;
garyr 0:a4d44dfd2f03 73 //char testBF;
garyr 0:a4d44dfd2f03 74 } INIT;
garyr 0:a4d44dfd2f03 75 static const INIT initData[] = {
garyr 0:a4d44dfd2f03 76 {3, 1, 5},
garyr 0:a4d44dfd2f03 77 {3, 1, 1},
garyr 0:a4d44dfd2f03 78 {3, 1, 1},
garyr 0:a4d44dfd2f03 79 {2, 1, 1}, // Function set: 4-bit interface
garyr 0:a4d44dfd2f03 80 {0x28, 2, 2}, // Function set: 2 lines, 5x7
garyr 0:a4d44dfd2f03 81 {0x08, 2, 2}, // Display off
garyr 0:a4d44dfd2f03 82 {0x01, 2, 16}, // Clear display
garyr 0:a4d44dfd2f03 83 {0x06, 2, 2}, // Entry mode set: No increment, shift cursor
garyr 0:a4d44dfd2f03 84 {0x0e, 2, 2}}; // Display on: cursor on, blink off
garyr 0:a4d44dfd2f03 85 #define NINITD (sizeof(initData)/sizeof(initData[0]))
garyr 0:a4d44dfd2f03 86 INIT *p;
garyr 0:a4d44dfd2f03 87 int k, rc;
garyr 0:a4d44dfd2f03 88 // Initialization must start at least 16 ms after power up.
garyr 0:a4d44dfd2f03 89 i2c.frequency(frequency);
garyr 0:a4d44dfd2f03 90 address = i2cAddress;
garyr 0:a4d44dfd2f03 91 cw = 0;
garyr 0:a4d44dfd2f03 92 p = (INIT *)initData;
garyr 0:a4d44dfd2f03 93 for (k = 0; k < NINITD; k++)
garyr 0:a4d44dfd2f03 94 {
garyr 0:a4d44dfd2f03 95 //p = (INIT *)&initData[k];
garyr 0:a4d44dfd2f03 96 if (p->numNibbles == 1)
garyr 0:a4d44dfd2f03 97 rc = write4Bits(p->cmd << 4);
garyr 0:a4d44dfd2f03 98 else
garyr 0:a4d44dfd2f03 99 {
garyr 0:a4d44dfd2f03 100 rc = write4Bits(p->cmd); // output the most significant nibble
garyr 0:a4d44dfd2f03 101 wait_us(10); // this will need to be adjusted when printf stmts are removed
garyr 0:a4d44dfd2f03 102 rc |= write4Bits(p->cmd << 4); // output the least significant nibble
garyr 0:a4d44dfd2f03 103 }
garyr 0:a4d44dfd2f03 104 if (rc)
garyr 0:a4d44dfd2f03 105 break;
garyr 0:a4d44dfd2f03 106 wait_ms(p->delayMs);
garyr 0:a4d44dfd2f03 107 p++;
garyr 0:a4d44dfd2f03 108 }
garyr 0:a4d44dfd2f03 109 return rc;
garyr 0:a4d44dfd2f03 110 }
garyr 0:a4d44dfd2f03 111
garyr 0:a4d44dfd2f03 112 int lcdWriteMsg(char *msg)
garyr 0:a4d44dfd2f03 113 { // msg must be a null-terminated string
garyr 0:a4d44dfd2f03 114 char rc;
garyr 0:a4d44dfd2f03 115 cw |= RS; // data
garyr 0:a4d44dfd2f03 116 cw &= ~RW; // write
garyr 0:a4d44dfd2f03 117 rc = updateDisplay(msg, strlen(msg));
garyr 0:a4d44dfd2f03 118 return rc;
garyr 0:a4d44dfd2f03 119 }
garyr 0:a4d44dfd2f03 120
garyr 0:a4d44dfd2f03 121 int lcdWriteCmd(char cmd, int delayMs)
garyr 0:a4d44dfd2f03 122 {
garyr 0:a4d44dfd2f03 123 int rc;
garyr 0:a4d44dfd2f03 124 cw &= ~RS; // command
garyr 0:a4d44dfd2f03 125 rc = write4Bits(cmd);
garyr 0:a4d44dfd2f03 126 wait_us(10);
garyr 0:a4d44dfd2f03 127 rc |= write4Bits(cmd << 4);
garyr 0:a4d44dfd2f03 128 if (delayMs)
garyr 0:a4d44dfd2f03 129 wait_ms(delayMs);
garyr 0:a4d44dfd2f03 130 return rc;
garyr 0:a4d44dfd2f03 131 }
garyr 0:a4d44dfd2f03 132
garyr 0:a4d44dfd2f03 133 int lcdPositionCursor(char row, char col)
garyr 0:a4d44dfd2f03 134 {
garyr 0:a4d44dfd2f03 135 // Code may not be correct for displays larger than 20 x 2
garyr 0:a4d44dfd2f03 136 int x, rc;
garyr 0:a4d44dfd2f03 137 x = 0x80 | ((row & 1)<<6) | (col & 0xf);
garyr 0:a4d44dfd2f03 138 rc = lcdWriteCmd(x, 1);
garyr 0:a4d44dfd2f03 139 return rc;
garyr 0:a4d44dfd2f03 140 }
garyr 0:a4d44dfd2f03 141
garyr 0:a4d44dfd2f03 142 int lcdClearDisplay(void)
garyr 0:a4d44dfd2f03 143 {
garyr 0:a4d44dfd2f03 144 return lcdWriteCmd(1, 16);
garyr 0:a4d44dfd2f03 145 }
garyr 0:a4d44dfd2f03 146
garyr 0:a4d44dfd2f03 147
garyr 0:a4d44dfd2f03 148