Fuminori ALAI
/
SakuraIoEVB_test
sakura.io EVB
main.cpp
- Committer:
- alaif
- Date:
- 2018-02-26
- Revision:
- 0:1059d9433248
File content as of revision 0:1059d9433248:
#include "mbed.h" DigitalIn sw1(PC_14); DigitalIn sw2(PH_0); DigitalIn sw3(PC_0); DigitalIn sw4(PC_1); DigitalIn sw5(PC_2); DigitalIn sw6(PC_3); DigitalOut led1(PC_13); DigitalOut led2(PC_15); DigitalOut led3(PH_1); DigitalOut led4(PC_4); DigitalOut lcd_bl(PC_5); DigitalOut gps_en(PA_11); Serial ser_daplink(PB_6, PB_7); Serial ser_external(PA_2, PA_3); Serial ser_gps(PC_6, PC_7); I2C i2c_lcd(PB_9, PB_8); static void lcd_init(); static int lcd_puts(uint8_t *str, uint8_t start_index); void lcd_clear(); int main() { uint8_t mode = 0xff; ser_daplink.baud(9600); ser_external.baud(9600); ser_gps.baud(9600); gps_en = 1; lcd_init(); lcd_puts((uint8_t*)"Serial", 0); while(1) { led1 = sw1; led2 = sw2; led3 = sw3; led4 = sw4; int val = sw5 + (sw6 << 1); if (val != mode) { char mode_str[17]; sprintf(mode_str, "Mode: %d", val); lcd_puts((uint8_t *)mode_str, 16); mode = val; } switch (val) { case 0: lcd_bl = 0; break; case 1: // DAPLink loopback if (ser_daplink.readable()) { ser_daplink.putc(ser_daplink.getc()); } lcd_bl = 1; case 2: // DAPLink - Extended relay if (ser_daplink.readable()) { ser_external.putc(ser_daplink.getc()); } if (ser_external.readable()) { ser_daplink.putc(ser_external.getc()); } lcd_bl = 1; break; case 3: // DAPLink - GPS module relay if (ser_daplink.readable()) { ser_gps.putc(ser_daplink.getc()); } if (ser_gps.readable()) { ser_daplink.putc(ser_gps.getc()); } lcd_bl = 1; break; default: break; } } } //#define LCD_ADR (0x3e) #define LCD_ADR (0x7c) static int lcd_write_cmd(uint8_t cmd) { uint8_t dat[2]; dat[0] = 0x00; dat[1] = cmd; return i2c_lcd.write(LCD_ADR, (char*)dat, 2, false); } static int lcd_write_char(uint8_t chr) { uint8_t dat[2]; dat[0] = 0x40; dat[1] = chr; return i2c_lcd.write(LCD_ADR, (char*)dat, 2, false); } static bool lcd_loc(uint8_t col, uint8_t row) { uint8_t addr = 0x80; if ((col < 16) && (row < 2)) { addr |= col; if (row == 1) { addr |= 0x40; } lcd_write_cmd(addr); //DDRAMのアドレスを設定 return true; } return false; } void lcd_clear(void) { lcd_write_cmd(0x01); wait_us(10000); } static void lcd_init() { //LCD initialize wait_us(50000); lcd_write_cmd(0x38); wait_us(30); lcd_write_cmd(0x02); wait_us(30); lcd_write_cmd(0x39); wait_us(30); lcd_write_cmd(0x14); wait_us(30); lcd_write_cmd(0x7f); wait_us(30); lcd_write_cmd(0x56); wait_us(30); lcd_write_cmd(0x6a); wait_us(200000); lcd_write_cmd(0x0c); wait_us(30); lcd_write_cmd(0x01); wait_us(30); lcd_write_cmd(0x04); wait_us(30); } static int lcd_puts(uint8_t *str, uint8_t start_index) { int i; uint8_t addr = 0x80; if (start_index >= 32) { return -1; } //表示開始アドレス if (start_index < 16) { //1行目 addr |= start_index; } else { //2行目 addr |= (0x40 | (start_index - 16)); } lcd_write_cmd(addr); wait_us(30); for (i = 0; i < 32; i++) { if (str[i] == '\0') { break; } if ((i + start_index) == 16) { lcd_write_cmd(0xc0); //アドレスを2行目先頭に wait_us(30); } else if ((i + start_index) == 32) { lcd_write_cmd(0x80); //アドレスを1行目先頭に wait_us(30); } lcd_write_char(str[i]); wait_us(30); } return i; }