VIメータのプログラムですI2C LCDとINA226を装備しています。

Dependencies:   mbed

Committer:
takeuchi
Date:
Mon May 09 08:38:27 2016 +0000
Revision:
0:27e9d6071e9b
VI?????????????I2C?INA????I2C?LCD?????????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
takeuchi 0:27e9d6071e9b 1 #include "I2cLCD.h"
takeuchi 0:27e9d6071e9b 2 #include "mbed.h"
takeuchi 0:27e9d6071e9b 3
takeuchi 0:27e9d6071e9b 4 #define I2CLCD_ADDR 0x7C
takeuchi 0:27e9d6071e9b 5
takeuchi 0:27e9d6071e9b 6 #define RS_CMD 0x00
takeuchi 0:27e9d6071e9b 7 #define RS_DATA 0x40
takeuchi 0:27e9d6071e9b 8
takeuchi 0:27e9d6071e9b 9 #define FUNC_SET1 0x38
takeuchi 0:27e9d6071e9b 10 #define FUNC_SET2 0x39
takeuchi 0:27e9d6071e9b 11 #define INT_OSC 0x14
takeuchi 0:27e9d6071e9b 12
takeuchi 0:27e9d6071e9b 13 #define CNTR_DEF 0x20
takeuchi 0:27e9d6071e9b 14
takeuchi 0:27e9d6071e9b 15 unsigned char icon_data[]=
takeuchi 0:27e9d6071e9b 16 {
takeuchi 0:27e9d6071e9b 17 0x00, 0x10,
takeuchi 0:27e9d6071e9b 18 0x02, 0x10,
takeuchi 0:27e9d6071e9b 19 0x04, 0x10,
takeuchi 0:27e9d6071e9b 20 0x06, 0x10,
takeuchi 0:27e9d6071e9b 21
takeuchi 0:27e9d6071e9b 22 0x07, 0x10,
takeuchi 0:27e9d6071e9b 23 0x07, 0x08,
takeuchi 0:27e9d6071e9b 24 0x09, 0x10,
takeuchi 0:27e9d6071e9b 25 0x0B, 0x10,
takeuchi 0:27e9d6071e9b 26
takeuchi 0:27e9d6071e9b 27 0x0D, 0x08,
takeuchi 0:27e9d6071e9b 28 0x0D, 0x04,
takeuchi 0:27e9d6071e9b 29 0x0D, 0x02,
takeuchi 0:27e9d6071e9b 30 0x0D, 0x10,
takeuchi 0:27e9d6071e9b 31
takeuchi 0:27e9d6071e9b 32 0x0F, 0x10,
takeuchi 0:27e9d6071e9b 33 };
takeuchi 0:27e9d6071e9b 34
takeuchi 0:27e9d6071e9b 35 I2cLCD::I2cLCD(PinName sda, PinName scl, PinName rp) : _rs( rp ) , _i2c( sda , scl ){
takeuchi 0:27e9d6071e9b 36
takeuchi 0:27e9d6071e9b 37 contrast = CNTR_DEF;
takeuchi 0:27e9d6071e9b 38 icon = 0;
takeuchi 0:27e9d6071e9b 39
takeuchi 0:27e9d6071e9b 40 wait(0.015);
takeuchi 0:27e9d6071e9b 41 // reset LOW->HIGH
takeuchi 0:27e9d6071e9b 42 _rs = 0;
takeuchi 0:27e9d6071e9b 43 wait(0.01);
takeuchi 0:27e9d6071e9b 44 _rs = 1;
takeuchi 0:27e9d6071e9b 45 wait(0.05);
takeuchi 0:27e9d6071e9b 46
takeuchi 0:27e9d6071e9b 47 writeCommand(FUNC_SET1);
takeuchi 0:27e9d6071e9b 48 writeCommand(FUNC_SET2);
takeuchi 0:27e9d6071e9b 49 writeCommand(INT_OSC);
takeuchi 0:27e9d6071e9b 50
takeuchi 0:27e9d6071e9b 51 writeCommand(0x70 | (contrast & 0xF));
takeuchi 0:27e9d6071e9b 52 writeCommand(0x5C | ((contrast >> 4) & 0x3));
takeuchi 0:27e9d6071e9b 53
takeuchi 0:27e9d6071e9b 54 writeCommand(0x6C);
takeuchi 0:27e9d6071e9b 55 wait(0.3);
takeuchi 0:27e9d6071e9b 56
takeuchi 0:27e9d6071e9b 57 writeCommand(0x38); // function set
takeuchi 0:27e9d6071e9b 58 writeCommand(0x0C); // Display On
takeuchi 0:27e9d6071e9b 59
takeuchi 0:27e9d6071e9b 60 cls(); // Clear Display
takeuchi 0:27e9d6071e9b 61
takeuchi 0:27e9d6071e9b 62 }
takeuchi 0:27e9d6071e9b 63
takeuchi 0:27e9d6071e9b 64
takeuchi 0:27e9d6071e9b 65
takeuchi 0:27e9d6071e9b 66 void I2cLCD::character(int column, int row, int c) {
takeuchi 0:27e9d6071e9b 67 int a = address(column, row);
takeuchi 0:27e9d6071e9b 68 writeCommand(a);
takeuchi 0:27e9d6071e9b 69 writeData(c);
takeuchi 0:27e9d6071e9b 70 }
takeuchi 0:27e9d6071e9b 71
takeuchi 0:27e9d6071e9b 72 void I2cLCD::cls() {
takeuchi 0:27e9d6071e9b 73 writeCommand(0x01); // cls, and set cursor to 0
takeuchi 0:27e9d6071e9b 74 wait(0.00164f); // This command takes 1.64 ms
takeuchi 0:27e9d6071e9b 75 locate(0, 0);
takeuchi 0:27e9d6071e9b 76 }
takeuchi 0:27e9d6071e9b 77
takeuchi 0:27e9d6071e9b 78 void I2cLCD::locate(int column, int row) {
takeuchi 0:27e9d6071e9b 79 _column = column;
takeuchi 0:27e9d6071e9b 80 _row = row;
takeuchi 0:27e9d6071e9b 81 }
takeuchi 0:27e9d6071e9b 82
takeuchi 0:27e9d6071e9b 83 int I2cLCD::_putc(int value) {
takeuchi 0:27e9d6071e9b 84 if (value == '\n') {
takeuchi 0:27e9d6071e9b 85 _column = 0;
takeuchi 0:27e9d6071e9b 86 _row++;
takeuchi 0:27e9d6071e9b 87 if (_row >= rows()) {
takeuchi 0:27e9d6071e9b 88 _row = 0;
takeuchi 0:27e9d6071e9b 89 }
takeuchi 0:27e9d6071e9b 90 } else {
takeuchi 0:27e9d6071e9b 91 character(_column, _row, value);
takeuchi 0:27e9d6071e9b 92 _column++;
takeuchi 0:27e9d6071e9b 93 if (_column >= columns()) {
takeuchi 0:27e9d6071e9b 94 _column = 0;
takeuchi 0:27e9d6071e9b 95 _row++;
takeuchi 0:27e9d6071e9b 96 if (_row >= rows()) {
takeuchi 0:27e9d6071e9b 97 _row = 0;
takeuchi 0:27e9d6071e9b 98 }
takeuchi 0:27e9d6071e9b 99 }
takeuchi 0:27e9d6071e9b 100 }
takeuchi 0:27e9d6071e9b 101 return value;
takeuchi 0:27e9d6071e9b 102 }
takeuchi 0:27e9d6071e9b 103
takeuchi 0:27e9d6071e9b 104 int I2cLCD::_getc() {
takeuchi 0:27e9d6071e9b 105 return -1;
takeuchi 0:27e9d6071e9b 106 }
takeuchi 0:27e9d6071e9b 107
takeuchi 0:27e9d6071e9b 108 void I2cLCD::writeCommand( int cmd )
takeuchi 0:27e9d6071e9b 109 {
takeuchi 0:27e9d6071e9b 110 char cmds[2];
takeuchi 0:27e9d6071e9b 111
takeuchi 0:27e9d6071e9b 112 cmds[0] = RS_CMD;
takeuchi 0:27e9d6071e9b 113 cmds[1] = cmd;
takeuchi 0:27e9d6071e9b 114
takeuchi 0:27e9d6071e9b 115 _i2c.write(I2CLCD_ADDR, cmds, 2);
takeuchi 0:27e9d6071e9b 116 }
takeuchi 0:27e9d6071e9b 117
takeuchi 0:27e9d6071e9b 118 void I2cLCD::writeData( int data )
takeuchi 0:27e9d6071e9b 119 {
takeuchi 0:27e9d6071e9b 120 char cmd[2];
takeuchi 0:27e9d6071e9b 121
takeuchi 0:27e9d6071e9b 122 cmd[0] = RS_DATA;
takeuchi 0:27e9d6071e9b 123 cmd[1] = data;
takeuchi 0:27e9d6071e9b 124
takeuchi 0:27e9d6071e9b 125 _i2c.write(I2CLCD_ADDR, cmd, 2);
takeuchi 0:27e9d6071e9b 126 }
takeuchi 0:27e9d6071e9b 127
takeuchi 0:27e9d6071e9b 128 int I2cLCD::address(int column, int row) {
takeuchi 0:27e9d6071e9b 129
takeuchi 0:27e9d6071e9b 130 return 0x80 + (row * 0x40) + column;
takeuchi 0:27e9d6071e9b 131 }
takeuchi 0:27e9d6071e9b 132
takeuchi 0:27e9d6071e9b 133 int I2cLCD::columns() {
takeuchi 0:27e9d6071e9b 134 return 16;
takeuchi 0:27e9d6071e9b 135 }
takeuchi 0:27e9d6071e9b 136
takeuchi 0:27e9d6071e9b 137 int I2cLCD::rows() {
takeuchi 0:27e9d6071e9b 138 return 2;
takeuchi 0:27e9d6071e9b 139 }
takeuchi 0:27e9d6071e9b 140
takeuchi 0:27e9d6071e9b 141 void I2cLCD::seticon(IconType type)
takeuchi 0:27e9d6071e9b 142 {
takeuchi 0:27e9d6071e9b 143 icon |= type;
takeuchi 0:27e9d6071e9b 144 puticon( icon );
takeuchi 0:27e9d6071e9b 145 }
takeuchi 0:27e9d6071e9b 146
takeuchi 0:27e9d6071e9b 147 void I2cLCD::clearicon(IconType type)
takeuchi 0:27e9d6071e9b 148 {
takeuchi 0:27e9d6071e9b 149 icon &= ~type;
takeuchi 0:27e9d6071e9b 150 puticon( icon );
takeuchi 0:27e9d6071e9b 151 }
takeuchi 0:27e9d6071e9b 152
takeuchi 0:27e9d6071e9b 153
takeuchi 0:27e9d6071e9b 154 void I2cLCD::puticon(int flg)
takeuchi 0:27e9d6071e9b 155 {
takeuchi 0:27e9d6071e9b 156 static unsigned char icon_buff[16];
takeuchi 0:27e9d6071e9b 157 unsigned char i;
takeuchi 0:27e9d6071e9b 158
takeuchi 0:27e9d6071e9b 159 for(i=0;i<sizeof(icon_data)/2;i++)
takeuchi 0:27e9d6071e9b 160 {
takeuchi 0:27e9d6071e9b 161 if(flg & (0x1000>>i))
takeuchi 0:27e9d6071e9b 162 {
takeuchi 0:27e9d6071e9b 163 icon_buff[icon_data[i*2]] |= icon_data[i*2+1];
takeuchi 0:27e9d6071e9b 164 }
takeuchi 0:27e9d6071e9b 165 else
takeuchi 0:27e9d6071e9b 166 {
takeuchi 0:27e9d6071e9b 167 icon_buff[icon_data[i*2]] &= ~icon_data[i*2+1];
takeuchi 0:27e9d6071e9b 168 }
takeuchi 0:27e9d6071e9b 169 }
takeuchi 0:27e9d6071e9b 170
takeuchi 0:27e9d6071e9b 171 for(i=0;i<16;i++){
takeuchi 0:27e9d6071e9b 172 writeCommand(0x39);
takeuchi 0:27e9d6071e9b 173 writeCommand(0x40+i);
takeuchi 0:27e9d6071e9b 174 writeData(icon_buff[i]);
takeuchi 0:27e9d6071e9b 175 }
takeuchi 0:27e9d6071e9b 176 }