キャタピラ用

Committer:
e00nagog
Date:
Sat Nov 02 04:56:24 2013 +0000
Revision:
0:1f8005f33f67
???????????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
e00nagog 0:1f8005f33f67 1 // For I2C ST7032i LCD 8*2
e00nagog 0:1f8005f33f67 2
e00nagog 0:1f8005f33f67 3 #include "LCD.h"
e00nagog 0:1f8005f33f67 4 #include "mbed.h"
e00nagog 0:1f8005f33f67 5
e00nagog 0:1f8005f33f67 6 #define I2C_ADDR 0x7C
e00nagog 0:1f8005f33f67 7
e00nagog 0:1f8005f33f67 8 #define COLUMNS 8
e00nagog 0:1f8005f33f67 9 #define ROWS 2
e00nagog 0:1f8005f33f67 10
e00nagog 0:1f8005f33f67 11 #define COMMAND 0x00
e00nagog 0:1f8005f33f67 12 #define DATA 0x40
e00nagog 0:1f8005f33f67 13
e00nagog 0:1f8005f33f67 14 // Clear Display
e00nagog 0:1f8005f33f67 15 #define CLEAR_DISPLAY 0x01
e00nagog 0:1f8005f33f67 16
e00nagog 0:1f8005f33f67 17 // Return Home
e00nagog 0:1f8005f33f67 18 #define RETURN_HOME 0x02
e00nagog 0:1f8005f33f67 19
e00nagog 0:1f8005f33f67 20 // Display ON/OFF
e00nagog 0:1f8005f33f67 21 #define DISPLAY_ON_OFF_CONTROL 0x08
e00nagog 0:1f8005f33f67 22 #define DISPLAY_ON 1 << 2
e00nagog 0:1f8005f33f67 23 #define CURSOR_ON 1 << 1
e00nagog 0:1f8005f33f67 24 #define CURSOR_POSITION_ON 1 << 0
e00nagog 0:1f8005f33f67 25
e00nagog 0:1f8005f33f67 26 // Function set
e00nagog 0:1f8005f33f67 27 #define FUNCTION_SET 0x20
e00nagog 0:1f8005f33f67 28 #define DL 1 << 4 // 8 bit interface
e00nagog 0:1f8005f33f67 29 #define N 1 << 3 // 2 lines
e00nagog 0:1f8005f33f67 30 #define DH 1 << 2 // double height
e00nagog 0:1f8005f33f67 31 #define IS 1 << 0 // instruction table select
e00nagog 0:1f8005f33f67 32
e00nagog 0:1f8005f33f67 33 // Instruction Table 0 (IS = 0)
e00nagog 0:1f8005f33f67 34 #define CURSOR_OR_DISPLAY_SHIFT = 0x10;
e00nagog 0:1f8005f33f67 35 #define SC 1 << 3 // select screen (DISPLAY)
e00nagog 0:1f8005f33f67 36 #define RL 1 << 2 // moving to the right
e00nagog 0:1f8005f33f67 37
e00nagog 0:1f8005f33f67 38 // Instruction Table 1 (when IS = 1)
e00nagog 0:1f8005f33f67 39 #define INTERNAL_OSC_FREQUENCY 0x10
e00nagog 0:1f8005f33f67 40 #define BS 1 << 3 // 1/4 bias
e00nagog 0:1f8005f33f67 41 #define FR_MASK 7 // adjust internal OSC freq
e00nagog 0:1f8005f33f67 42 #define SET_ICON_ADDRESS 0x40
e00nagog 0:1f8005f33f67 43 #define AC_MASK 7 // set ICON addr in address counter
e00nagog 0:1f8005f33f67 44 #define POWER_ICON_CONTRAST_CONTROL 0x50
e00nagog 0:1f8005f33f67 45 #define ION 1 << 3 // Icon On
e00nagog 0:1f8005f33f67 46 #define BON 1 << 2 // Booster On
e00nagog 0:1f8005f33f67 47 #define CONTRAST_MASK1 3 // contrast (higher bits)
e00nagog 0:1f8005f33f67 48 #define FOLLOWER_CONTROL 0x60
e00nagog 0:1f8005f33f67 49 #define FON 1 << 3 // Follower On
e00nagog 0:1f8005f33f67 50 #define RAB_MASK 7 // Rab
e00nagog 0:1f8005f33f67 51 #define CONTRAST_SET 0x70
e00nagog 0:1f8005f33f67 52 #define CONTRAST_MASK0 0x0F // contrast (lower bits)
e00nagog 0:1f8005f33f67 53
e00nagog 0:1f8005f33f67 54 // Set DDRAM Address
e00nagog 0:1f8005f33f67 55 #define SET_DDRAM_ADDRESS 0x80
e00nagog 0:1f8005f33f67 56
e00nagog 0:1f8005f33f67 57 Serial pc(USBTX, USBRX);
e00nagog 0:1f8005f33f67 58 LCD::LCD(PinName sdaPin, PinName sclPin, PinName resetPin, PinName backlightPin, int contrast, bool cursor, bool blink)
e00nagog 0:1f8005f33f67 59 : _reset(resetPin), backlight(backlightPin), i2c(sdaPin, sclPin), contrast(contrast), cursor(cursor), blink(blink) {
e00nagog 0:1f8005f33f67 60 resetEnabled = resetPin != NC;
e00nagog 0:1f8005f33f67 61 backlightEnabled = backlightPin != NC;
e00nagog 0:1f8005f33f67 62 reset();
e00nagog 0:1f8005f33f67 63 }
e00nagog 0:1f8005f33f67 64
e00nagog 0:1f8005f33f67 65 void LCD::reset() {
e00nagog 0:1f8005f33f67 66 wait(0.015);
e00nagog 0:1f8005f33f67 67 if (resetEnabled)
e00nagog 0:1f8005f33f67 68 _reset = 0;
e00nagog 0:1f8005f33f67 69 wait(0.01);
e00nagog 0:1f8005f33f67 70 if (resetEnabled)
e00nagog 0:1f8005f33f67 71 _reset = 1;
e00nagog 0:1f8005f33f67 72 wait(0.05);
e00nagog 0:1f8005f33f67 73
e00nagog 0:1f8005f33f67 74 writeCommand(FUNCTION_SET | DL | N | (IS & 0));
e00nagog 0:1f8005f33f67 75 writeCommand(FUNCTION_SET | DL | N | (IS & 1));
e00nagog 0:1f8005f33f67 76 writeCommand(INTERNAL_OSC_FREQUENCY | BS | (FR_MASK & 0));
e00nagog 0:1f8005f33f67 77 writeCommand(CONTRAST_SET | (CONTRAST_MASK0 & contrast));
e00nagog 0:1f8005f33f67 78 writeCommand(POWER_ICON_CONTRAST_CONTROL | ION | BON | (CONTRAST_MASK1 & contrast >> 4));
e00nagog 0:1f8005f33f67 79 //writeCommand(FOLLOWER_CONTROL | FON | (RAB_MASK & 2));
e00nagog 0:1f8005f33f67 80 writeCommand(FOLLOWER_CONTROL | FON | (RAB_MASK & 4));
e00nagog 0:1f8005f33f67 81 wait(0.3);
e00nagog 0:1f8005f33f67 82
e00nagog 0:1f8005f33f67 83 writeCommand(DISPLAY_ON_OFF_CONTROL | DISPLAY_ON | (cursor ? CURSOR_ON : 0) | (blink ? CURSOR_POSITION_ON : 0));
e00nagog 0:1f8005f33f67 84 wait(0.002);
e00nagog 0:1f8005f33f67 85 cls();
e00nagog 0:1f8005f33f67 86 }
e00nagog 0:1f8005f33f67 87
e00nagog 0:1f8005f33f67 88 void LCD::display(int column, int row, int c) {
e00nagog 0:1f8005f33f67 89 writeCommand(column + 0x40 * row + 0x80);
e00nagog 0:1f8005f33f67 90 writeData(c);
e00nagog 0:1f8005f33f67 91 if (row == 1) row2[column] = c;
e00nagog 0:1f8005f33f67 92 }
e00nagog 0:1f8005f33f67 93
e00nagog 0:1f8005f33f67 94 void LCD::cls() {
e00nagog 0:1f8005f33f67 95 for (int i = 0; i < 16; i++) {
e00nagog 0:1f8005f33f67 96 writeCommand(FUNCTION_SET | DL | N | (IS & 1));
e00nagog 0:1f8005f33f67 97 writeCommand(SET_ICON_ADDRESS | i);
e00nagog 0:1f8005f33f67 98 //writeCommand(0x39);
e00nagog 0:1f8005f33f67 99 //writeCommand(0x40 + i);
e00nagog 0:1f8005f33f67 100 writeData(0);
e00nagog 0:1f8005f33f67 101 }
e00nagog 0:1f8005f33f67 102
e00nagog 0:1f8005f33f67 103 writeCommand(CLEAR_DISPLAY);
e00nagog 0:1f8005f33f67 104 wait(0.00164f);
e00nagog 0:1f8005f33f67 105 locate(0, 0);
e00nagog 0:1f8005f33f67 106 }
e00nagog 0:1f8005f33f67 107
e00nagog 0:1f8005f33f67 108 void LCD::locate(int column, int row) {
e00nagog 0:1f8005f33f67 109 this->column = column;
e00nagog 0:1f8005f33f67 110 this->row = row;
e00nagog 0:1f8005f33f67 111 }
e00nagog 0:1f8005f33f67 112
e00nagog 0:1f8005f33f67 113 int LCD::_putc(int value) {
e00nagog 0:1f8005f33f67 114 if (row >= ROWS) {
e00nagog 0:1f8005f33f67 115 scrollDown();
e00nagog 0:1f8005f33f67 116 row = 1;
e00nagog 0:1f8005f33f67 117 }
e00nagog 0:1f8005f33f67 118 if (value == '\n')
e00nagog 0:1f8005f33f67 119 column = COLUMNS;
e00nagog 0:1f8005f33f67 120 else
e00nagog 0:1f8005f33f67 121 display(column, row, value);
e00nagog 0:1f8005f33f67 122
e00nagog 0:1f8005f33f67 123 if (++column >= COLUMNS) {
e00nagog 0:1f8005f33f67 124 column = 0;
e00nagog 0:1f8005f33f67 125 row++;
e00nagog 0:1f8005f33f67 126 }
e00nagog 0:1f8005f33f67 127
e00nagog 0:1f8005f33f67 128 return value;
e00nagog 0:1f8005f33f67 129 }
e00nagog 0:1f8005f33f67 130
e00nagog 0:1f8005f33f67 131 int LCD::_getc() {
e00nagog 0:1f8005f33f67 132 return -1;
e00nagog 0:1f8005f33f67 133 }
e00nagog 0:1f8005f33f67 134
e00nagog 0:1f8005f33f67 135 void LCD::scrollDown() {
e00nagog 0:1f8005f33f67 136 writeCommand(SET_DDRAM_ADDRESS | 0x00);
e00nagog 0:1f8005f33f67 137 writeData(row2, sizeof(row2));
e00nagog 0:1f8005f33f67 138 memset(row2, ' ', sizeof(row2));
e00nagog 0:1f8005f33f67 139 writeCommand(SET_DDRAM_ADDRESS | 0x40);
e00nagog 0:1f8005f33f67 140 writeData(row2, sizeof(row2));
e00nagog 0:1f8005f33f67 141 }
e00nagog 0:1f8005f33f67 142
e00nagog 0:1f8005f33f67 143 void LCD::writeCommand(int command) {
e00nagog 0:1f8005f33f67 144 char buf[] = {COMMAND, command};
e00nagog 0:1f8005f33f67 145 i2c.write(I2C_ADDR, buf, sizeof(buf));
e00nagog 0:1f8005f33f67 146 }
e00nagog 0:1f8005f33f67 147
e00nagog 0:1f8005f33f67 148 void LCD::writeData(int data) {
e00nagog 0:1f8005f33f67 149 char buf[] = {DATA, data};
e00nagog 0:1f8005f33f67 150 i2c.write(I2C_ADDR, buf, sizeof(buf));
e00nagog 0:1f8005f33f67 151 }
e00nagog 0:1f8005f33f67 152
e00nagog 0:1f8005f33f67 153 void LCD::writeData(char data[], int length) {
e00nagog 0:1f8005f33f67 154 char buf[length + 1];
e00nagog 0:1f8005f33f67 155 buf[0] = DATA;
e00nagog 0:1f8005f33f67 156 memcpy(&buf[1], data, length);
e00nagog 0:1f8005f33f67 157 i2c.write(I2C_ADDR, buf, sizeof(buf));
e00nagog 0:1f8005f33f67 158 }
e00nagog 0:1f8005f33f67 159
e00nagog 0:1f8005f33f67 160 void LCD::showIcon(Icon icon) {
e00nagog 0:1f8005f33f67 161 switch (icon) {
e00nagog 0:1f8005f33f67 162 case ALL:
e00nagog 0:1f8005f33f67 163 for (int i = 0; i < 16; i++) {
e00nagog 0:1f8005f33f67 164 writeCommand(FUNCTION_SET | DL | N | (IS & 1));
e00nagog 0:1f8005f33f67 165 writeCommand(SET_ICON_ADDRESS | i);
e00nagog 0:1f8005f33f67 166 writeData(0x1F);
e00nagog 0:1f8005f33f67 167 }
e00nagog 0:1f8005f33f67 168 break;
e00nagog 0:1f8005f33f67 169 default:
e00nagog 0:1f8005f33f67 170 writeCommand(FUNCTION_SET | DL | N | (IS & 1));
e00nagog 0:1f8005f33f67 171 writeCommand(SET_ICON_ADDRESS | (icon >> 8));
e00nagog 0:1f8005f33f67 172 writeData(icon & 0xFF);
e00nagog 0:1f8005f33f67 173 }
e00nagog 0:1f8005f33f67 174 }
e00nagog 0:1f8005f33f67 175
e00nagog 0:1f8005f33f67 176 void LCD::hideIcon(Icon icon) {
e00nagog 0:1f8005f33f67 177 switch (icon) {
e00nagog 0:1f8005f33f67 178 case ALL:
e00nagog 0:1f8005f33f67 179 for (int i = 0; i < 16; i++) {
e00nagog 0:1f8005f33f67 180 writeCommand(FUNCTION_SET | DL | N | (IS & 1));
e00nagog 0:1f8005f33f67 181 writeCommand(SET_ICON_ADDRESS | i);
e00nagog 0:1f8005f33f67 182 writeData(0);
e00nagog 0:1f8005f33f67 183 }
e00nagog 0:1f8005f33f67 184 break;
e00nagog 0:1f8005f33f67 185 default:
e00nagog 0:1f8005f33f67 186 writeCommand(FUNCTION_SET | DL | N | (IS & 1));
e00nagog 0:1f8005f33f67 187 writeCommand(SET_ICON_ADDRESS | (icon >> 8));
e00nagog 0:1f8005f33f67 188 writeData(0);
e00nagog 0:1f8005f33f67 189 }
e00nagog 0:1f8005f33f67 190 }
e00nagog 0:1f8005f33f67 191
e00nagog 0:1f8005f33f67 192 void LCD::setBacklight(bool on) {
e00nagog 0:1f8005f33f67 193 if (backlightEnabled)
e00nagog 0:1f8005f33f67 194 backlight = on;
e00nagog 0:1f8005f33f67 195 }