Fuminori ALAI
/
SakuraIoEVB_test
sakura.io EVB
main.cpp@0:1059d9433248, 2018-02-26 (annotated)
- Committer:
- alaif
- Date:
- Mon Feb 26 13:00:31 2018 +0000
- Revision:
- 0:1059d9433248
Initial
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
alaif | 0:1059d9433248 | 1 | #include "mbed.h" |
alaif | 0:1059d9433248 | 2 | |
alaif | 0:1059d9433248 | 3 | DigitalIn sw1(PC_14); |
alaif | 0:1059d9433248 | 4 | DigitalIn sw2(PH_0); |
alaif | 0:1059d9433248 | 5 | DigitalIn sw3(PC_0); |
alaif | 0:1059d9433248 | 6 | DigitalIn sw4(PC_1); |
alaif | 0:1059d9433248 | 7 | DigitalIn sw5(PC_2); |
alaif | 0:1059d9433248 | 8 | DigitalIn sw6(PC_3); |
alaif | 0:1059d9433248 | 9 | |
alaif | 0:1059d9433248 | 10 | DigitalOut led1(PC_13); |
alaif | 0:1059d9433248 | 11 | DigitalOut led2(PC_15); |
alaif | 0:1059d9433248 | 12 | DigitalOut led3(PH_1); |
alaif | 0:1059d9433248 | 13 | DigitalOut led4(PC_4); |
alaif | 0:1059d9433248 | 14 | DigitalOut lcd_bl(PC_5); |
alaif | 0:1059d9433248 | 15 | |
alaif | 0:1059d9433248 | 16 | DigitalOut gps_en(PA_11); |
alaif | 0:1059d9433248 | 17 | |
alaif | 0:1059d9433248 | 18 | Serial ser_daplink(PB_6, PB_7); |
alaif | 0:1059d9433248 | 19 | Serial ser_external(PA_2, PA_3); |
alaif | 0:1059d9433248 | 20 | Serial ser_gps(PC_6, PC_7); |
alaif | 0:1059d9433248 | 21 | |
alaif | 0:1059d9433248 | 22 | I2C i2c_lcd(PB_9, PB_8); |
alaif | 0:1059d9433248 | 23 | |
alaif | 0:1059d9433248 | 24 | static void lcd_init(); |
alaif | 0:1059d9433248 | 25 | static int lcd_puts(uint8_t *str, uint8_t start_index); |
alaif | 0:1059d9433248 | 26 | void lcd_clear(); |
alaif | 0:1059d9433248 | 27 | |
alaif | 0:1059d9433248 | 28 | int main() { |
alaif | 0:1059d9433248 | 29 | uint8_t mode = 0xff; |
alaif | 0:1059d9433248 | 30 | |
alaif | 0:1059d9433248 | 31 | ser_daplink.baud(9600); |
alaif | 0:1059d9433248 | 32 | ser_external.baud(9600); |
alaif | 0:1059d9433248 | 33 | ser_gps.baud(9600); |
alaif | 0:1059d9433248 | 34 | |
alaif | 0:1059d9433248 | 35 | gps_en = 1; |
alaif | 0:1059d9433248 | 36 | |
alaif | 0:1059d9433248 | 37 | lcd_init(); |
alaif | 0:1059d9433248 | 38 | lcd_puts((uint8_t*)"Serial", 0); |
alaif | 0:1059d9433248 | 39 | |
alaif | 0:1059d9433248 | 40 | while(1) { |
alaif | 0:1059d9433248 | 41 | led1 = sw1; |
alaif | 0:1059d9433248 | 42 | led2 = sw2; |
alaif | 0:1059d9433248 | 43 | led3 = sw3; |
alaif | 0:1059d9433248 | 44 | led4 = sw4; |
alaif | 0:1059d9433248 | 45 | |
alaif | 0:1059d9433248 | 46 | int val = sw5 + (sw6 << 1); |
alaif | 0:1059d9433248 | 47 | |
alaif | 0:1059d9433248 | 48 | if (val != mode) { |
alaif | 0:1059d9433248 | 49 | char mode_str[17]; |
alaif | 0:1059d9433248 | 50 | sprintf(mode_str, "Mode: %d", val); |
alaif | 0:1059d9433248 | 51 | lcd_puts((uint8_t *)mode_str, 16); |
alaif | 0:1059d9433248 | 52 | mode = val; |
alaif | 0:1059d9433248 | 53 | } |
alaif | 0:1059d9433248 | 54 | |
alaif | 0:1059d9433248 | 55 | switch (val) { |
alaif | 0:1059d9433248 | 56 | case 0: |
alaif | 0:1059d9433248 | 57 | lcd_bl = 0; |
alaif | 0:1059d9433248 | 58 | break; |
alaif | 0:1059d9433248 | 59 | case 1: |
alaif | 0:1059d9433248 | 60 | // DAPLink loopback |
alaif | 0:1059d9433248 | 61 | if (ser_daplink.readable()) { |
alaif | 0:1059d9433248 | 62 | ser_daplink.putc(ser_daplink.getc()); |
alaif | 0:1059d9433248 | 63 | } |
alaif | 0:1059d9433248 | 64 | lcd_bl = 1; |
alaif | 0:1059d9433248 | 65 | case 2: |
alaif | 0:1059d9433248 | 66 | // DAPLink - Extended relay |
alaif | 0:1059d9433248 | 67 | if (ser_daplink.readable()) { |
alaif | 0:1059d9433248 | 68 | ser_external.putc(ser_daplink.getc()); |
alaif | 0:1059d9433248 | 69 | } |
alaif | 0:1059d9433248 | 70 | if (ser_external.readable()) { |
alaif | 0:1059d9433248 | 71 | ser_daplink.putc(ser_external.getc()); |
alaif | 0:1059d9433248 | 72 | } |
alaif | 0:1059d9433248 | 73 | lcd_bl = 1; |
alaif | 0:1059d9433248 | 74 | break; |
alaif | 0:1059d9433248 | 75 | case 3: |
alaif | 0:1059d9433248 | 76 | // DAPLink - GPS module relay |
alaif | 0:1059d9433248 | 77 | if (ser_daplink.readable()) { |
alaif | 0:1059d9433248 | 78 | ser_gps.putc(ser_daplink.getc()); |
alaif | 0:1059d9433248 | 79 | } |
alaif | 0:1059d9433248 | 80 | if (ser_gps.readable()) { |
alaif | 0:1059d9433248 | 81 | ser_daplink.putc(ser_gps.getc()); |
alaif | 0:1059d9433248 | 82 | } |
alaif | 0:1059d9433248 | 83 | lcd_bl = 1; |
alaif | 0:1059d9433248 | 84 | break; |
alaif | 0:1059d9433248 | 85 | default: |
alaif | 0:1059d9433248 | 86 | break; |
alaif | 0:1059d9433248 | 87 | } |
alaif | 0:1059d9433248 | 88 | } |
alaif | 0:1059d9433248 | 89 | } |
alaif | 0:1059d9433248 | 90 | |
alaif | 0:1059d9433248 | 91 | //#define LCD_ADR (0x3e) |
alaif | 0:1059d9433248 | 92 | #define LCD_ADR (0x7c) |
alaif | 0:1059d9433248 | 93 | static int lcd_write_cmd(uint8_t cmd) |
alaif | 0:1059d9433248 | 94 | { |
alaif | 0:1059d9433248 | 95 | uint8_t dat[2]; |
alaif | 0:1059d9433248 | 96 | dat[0] = 0x00; |
alaif | 0:1059d9433248 | 97 | dat[1] = cmd; |
alaif | 0:1059d9433248 | 98 | return i2c_lcd.write(LCD_ADR, (char*)dat, 2, false); |
alaif | 0:1059d9433248 | 99 | } |
alaif | 0:1059d9433248 | 100 | |
alaif | 0:1059d9433248 | 101 | static int lcd_write_char(uint8_t chr) |
alaif | 0:1059d9433248 | 102 | { |
alaif | 0:1059d9433248 | 103 | uint8_t dat[2]; |
alaif | 0:1059d9433248 | 104 | dat[0] = 0x40; |
alaif | 0:1059d9433248 | 105 | dat[1] = chr; |
alaif | 0:1059d9433248 | 106 | return i2c_lcd.write(LCD_ADR, (char*)dat, 2, false); |
alaif | 0:1059d9433248 | 107 | } |
alaif | 0:1059d9433248 | 108 | |
alaif | 0:1059d9433248 | 109 | static bool lcd_loc(uint8_t col, uint8_t row) |
alaif | 0:1059d9433248 | 110 | { |
alaif | 0:1059d9433248 | 111 | uint8_t addr = 0x80; |
alaif | 0:1059d9433248 | 112 | if ((col < 16) && (row < 2)) { |
alaif | 0:1059d9433248 | 113 | addr |= col; |
alaif | 0:1059d9433248 | 114 | if (row == 1) { |
alaif | 0:1059d9433248 | 115 | addr |= 0x40; |
alaif | 0:1059d9433248 | 116 | } |
alaif | 0:1059d9433248 | 117 | lcd_write_cmd(addr); //DDRAMのアドレスを設定 |
alaif | 0:1059d9433248 | 118 | return true; |
alaif | 0:1059d9433248 | 119 | } |
alaif | 0:1059d9433248 | 120 | |
alaif | 0:1059d9433248 | 121 | return false; |
alaif | 0:1059d9433248 | 122 | } |
alaif | 0:1059d9433248 | 123 | |
alaif | 0:1059d9433248 | 124 | void lcd_clear(void) |
alaif | 0:1059d9433248 | 125 | { |
alaif | 0:1059d9433248 | 126 | lcd_write_cmd(0x01); |
alaif | 0:1059d9433248 | 127 | wait_us(10000); |
alaif | 0:1059d9433248 | 128 | } |
alaif | 0:1059d9433248 | 129 | |
alaif | 0:1059d9433248 | 130 | static void lcd_init() |
alaif | 0:1059d9433248 | 131 | { |
alaif | 0:1059d9433248 | 132 | //LCD initialize |
alaif | 0:1059d9433248 | 133 | wait_us(50000); |
alaif | 0:1059d9433248 | 134 | lcd_write_cmd(0x38); |
alaif | 0:1059d9433248 | 135 | wait_us(30); |
alaif | 0:1059d9433248 | 136 | lcd_write_cmd(0x02); |
alaif | 0:1059d9433248 | 137 | wait_us(30); |
alaif | 0:1059d9433248 | 138 | lcd_write_cmd(0x39); |
alaif | 0:1059d9433248 | 139 | wait_us(30); |
alaif | 0:1059d9433248 | 140 | lcd_write_cmd(0x14); |
alaif | 0:1059d9433248 | 141 | wait_us(30); |
alaif | 0:1059d9433248 | 142 | lcd_write_cmd(0x7f); |
alaif | 0:1059d9433248 | 143 | wait_us(30); |
alaif | 0:1059d9433248 | 144 | lcd_write_cmd(0x56); |
alaif | 0:1059d9433248 | 145 | wait_us(30); |
alaif | 0:1059d9433248 | 146 | lcd_write_cmd(0x6a); |
alaif | 0:1059d9433248 | 147 | |
alaif | 0:1059d9433248 | 148 | wait_us(200000); |
alaif | 0:1059d9433248 | 149 | |
alaif | 0:1059d9433248 | 150 | lcd_write_cmd(0x0c); |
alaif | 0:1059d9433248 | 151 | wait_us(30); |
alaif | 0:1059d9433248 | 152 | lcd_write_cmd(0x01); |
alaif | 0:1059d9433248 | 153 | wait_us(30); |
alaif | 0:1059d9433248 | 154 | lcd_write_cmd(0x04); |
alaif | 0:1059d9433248 | 155 | wait_us(30); |
alaif | 0:1059d9433248 | 156 | } |
alaif | 0:1059d9433248 | 157 | |
alaif | 0:1059d9433248 | 158 | static int lcd_puts(uint8_t *str, uint8_t start_index) |
alaif | 0:1059d9433248 | 159 | { |
alaif | 0:1059d9433248 | 160 | int i; |
alaif | 0:1059d9433248 | 161 | uint8_t addr = 0x80; |
alaif | 0:1059d9433248 | 162 | |
alaif | 0:1059d9433248 | 163 | if (start_index >= 32) { |
alaif | 0:1059d9433248 | 164 | return -1; |
alaif | 0:1059d9433248 | 165 | } |
alaif | 0:1059d9433248 | 166 | |
alaif | 0:1059d9433248 | 167 | //表示開始アドレス |
alaif | 0:1059d9433248 | 168 | if (start_index < 16) { |
alaif | 0:1059d9433248 | 169 | //1行目 |
alaif | 0:1059d9433248 | 170 | addr |= start_index; |
alaif | 0:1059d9433248 | 171 | } else { |
alaif | 0:1059d9433248 | 172 | //2行目 |
alaif | 0:1059d9433248 | 173 | addr |= (0x40 | (start_index - 16)); |
alaif | 0:1059d9433248 | 174 | } |
alaif | 0:1059d9433248 | 175 | lcd_write_cmd(addr); |
alaif | 0:1059d9433248 | 176 | wait_us(30); |
alaif | 0:1059d9433248 | 177 | |
alaif | 0:1059d9433248 | 178 | for (i = 0; i < 32; i++) { |
alaif | 0:1059d9433248 | 179 | if (str[i] == '\0') { |
alaif | 0:1059d9433248 | 180 | break; |
alaif | 0:1059d9433248 | 181 | } |
alaif | 0:1059d9433248 | 182 | |
alaif | 0:1059d9433248 | 183 | if ((i + start_index) == 16) { |
alaif | 0:1059d9433248 | 184 | lcd_write_cmd(0xc0); //アドレスを2行目先頭に |
alaif | 0:1059d9433248 | 185 | wait_us(30); |
alaif | 0:1059d9433248 | 186 | } else if ((i + start_index) == 32) { |
alaif | 0:1059d9433248 | 187 | lcd_write_cmd(0x80); //アドレスを1行目先頭に |
alaif | 0:1059d9433248 | 188 | wait_us(30); |
alaif | 0:1059d9433248 | 189 | } |
alaif | 0:1059d9433248 | 190 | lcd_write_char(str[i]); |
alaif | 0:1059d9433248 | 191 | wait_us(30); |
alaif | 0:1059d9433248 | 192 | } |
alaif | 0:1059d9433248 | 193 | |
alaif | 0:1059d9433248 | 194 | return i; |
alaif | 0:1059d9433248 | 195 | } |