sakura.io EVB

Dependencies:   mbed

Committer:
alaif
Date:
Mon Feb 26 13:00:31 2018 +0000
Revision:
0:1059d9433248
Initial

Who changed what in which revision?

UserRevisionLine numberNew 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 }