サーボテスタ

Dependencies:   mbed

LPC1114FNを使ったサーボテスタです。ラジコン用サーボのニュートラル出しや調整に使うことができます。ラジコン用モータコントローラ(ESC)の調整に使うこともできます。

Committer:
takeuchi
Date:
Tue Mar 01 03:46:56 2016 +0000
Revision:
0:ab75773ee4f5
LPC????FN??????????????????????????????????????I2CLCD????????????

Who changed what in which revision?

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