tested on STM32 Nucleo L152RE
Dependencies: aqm1248a_lcd mbed GT20L16J1Y_font
STM32 Nucleo L152RE/mbed と Freescale FRDM-KL05Z で秋月 AQM1248A グラフィック LCD をドライブ。AQM1248A 用 LCD ライブラリは http://mbed.org/users/dreschpe/code/C12832_lcd/ をベースに変更しました。mbed LPC1768 でも動く筈です(未確認)。
ピン配置はライブラリの aqm1248a_lcd.cpp 内で指定しており、Nucleo L152RE では次のようにしています。LPC1768 mbed ではオリジナルのままです。
Nucleo | LPC1768 | name |
---|---|---|
D11 | p5 | SPI MOSI |
D13 | p7 | SPI Clock |
D10 | p11 | SPI chip select |
D9 | p6 | reset |
D8 | p8 | A0 |
条件コンパイルの TARGET_NUCLEO_L152RE の部分に追加すれば、ほとんどそのままで他の Nucleo ボードなどで動くと思います。
- 2014.04.27 mbed ライブラリを更新でテキスト描画が随分と高速化されました。Freescale FRDM-KL05Z でも動作確認しました。同じ配線で動きます。
main.cpp@3:93270b9f6a01, 2015-06-02 (annotated)
- Committer:
- masato
- Date:
- Tue Jun 02 12:25:13 2015 +0000
- Revision:
- 3:93270b9f6a01
- Parent:
- 2:862f6ab24cfc
working
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
masato | 0:69bb996225c1 | 1 | #include "mbed.h" |
masato | 0:69bb996225c1 | 2 | #include "aqm1248a_lcd.h" |
masato | 3:93270b9f6a01 | 3 | #include "GT20L16J1Y_font.h" |
masato | 3:93270b9f6a01 | 4 | #include "utf8_table.h" |
masato | 3:93270b9f6a01 | 5 | |
masato | 3:93270b9f6a01 | 6 | #include <stdlib.h> |
masato | 0:69bb996225c1 | 7 | |
masato | 0:69bb996225c1 | 8 | aqm1248a_lcd lcd; |
masato | 0:69bb996225c1 | 9 | |
masato | 0:69bb996225c1 | 10 | const static |
masato | 0:69bb996225c1 | 11 | char mbedlogo128x48[768] |
masato | 0:69bb996225c1 | 12 | = { |
masato | 0:69bb996225c1 | 13 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
masato | 0:69bb996225c1 | 14 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
masato | 0:69bb996225c1 | 15 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
masato | 0:69bb996225c1 | 16 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
masato | 0:69bb996225c1 | 17 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
masato | 0:69bb996225c1 | 18 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
masato | 0:69bb996225c1 | 19 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
masato | 0:69bb996225c1 | 20 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
masato | 0:69bb996225c1 | 21 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
masato | 0:69bb996225c1 | 22 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
masato | 0:69bb996225c1 | 23 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
masato | 0:69bb996225c1 | 24 | 0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x00, |
masato | 0:69bb996225c1 | 25 | 0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x00, |
masato | 0:69bb996225c1 | 26 | 0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x00, |
masato | 0:69bb996225c1 | 27 | 0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x00, |
masato | 0:69bb996225c1 | 28 | 0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x00, |
masato | 0:69bb996225c1 | 29 | 0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x00, |
masato | 0:69bb996225c1 | 30 | 0x00,0x00,0x03,0xc7,0x83,0xe0,0x3c,0x7c,0x00,0x7e,0x00,0x3e,0x3c,0x00,0x00,0x00, |
masato | 0:69bb996225c1 | 31 | 0x00,0x00,0x03,0xdf,0xef,0xf8,0x3d,0xfe,0x01,0xff,0x80,0x7f,0xbc,0x00,0x00,0x00, |
masato | 0:69bb996225c1 | 32 | 0x00,0x00,0x03,0xff,0xff,0xf8,0x3f,0xff,0x03,0xff,0xc0,0xff,0xfc,0x00,0x00,0x00, |
masato | 0:69bb996225c1 | 33 | 0x00,0x00,0x03,0xf1,0xfc,0x7c,0x3f,0x0f,0x87,0xc3,0xe1,0xf0,0xfc,0x00,0x00,0x00, |
masato | 0:69bb996225c1 | 34 | 0x00,0x00,0x03,0xe0,0xf8,0x3c,0x3e,0x07,0x87,0x81,0xe1,0xe0,0x7c,0x00,0x00,0x00, |
masato | 0:69bb996225c1 | 35 | 0x00,0x00,0x03,0xc0,0xf0,0x3c,0x3c,0x03,0xcf,0x00,0xe3,0xc0,0x3c,0x00,0x00,0x00, |
masato | 0:69bb996225c1 | 36 | 0x00,0x00,0x03,0xc0,0xf0,0x3c,0x3c,0x03,0xcf,0x00,0xf3,0xc0,0x3c,0x00,0x00,0x00, |
masato | 0:69bb996225c1 | 37 | 0x00,0x00,0x03,0xc0,0xf0,0x3c,0x3c,0x03,0xcf,0xff,0xf3,0xc0,0x3c,0x00,0x00,0x00, |
masato | 0:69bb996225c1 | 38 | 0x00,0x00,0x03,0xc0,0xf0,0x3c,0x3c,0x03,0xcf,0xff,0xf3,0xc0,0x3c,0x00,0x00,0x00, |
masato | 0:69bb996225c1 | 39 | 0x00,0x00,0x03,0xc0,0xf0,0x3c,0x3c,0x03,0xcf,0xff,0xf3,0xc0,0x3c,0x00,0x00,0x00, |
masato | 0:69bb996225c1 | 40 | 0x00,0x00,0x03,0xc0,0xf0,0x3c,0x3c,0x03,0xcf,0x00,0x03,0xc0,0x3c,0x00,0x00,0x00, |
masato | 0:69bb996225c1 | 41 | 0x00,0x00,0x03,0xc0,0xf0,0x3c,0x3e,0x03,0xcf,0x00,0x03,0xc0,0x7c,0x00,0x00,0x00, |
masato | 0:69bb996225c1 | 42 | 0x00,0x00,0x03,0xc0,0xf0,0x3c,0x3e,0x07,0x87,0x80,0x01,0xe0,0x7c,0x00,0x00,0x00, |
masato | 0:69bb996225c1 | 43 | 0x00,0x00,0x03,0xc0,0xf0,0x3c,0x3f,0x0f,0x87,0xc1,0xc1,0xf0,0xfc,0x00,0x00,0x00, |
masato | 0:69bb996225c1 | 44 | 0x00,0x00,0x03,0xc0,0xf0,0x3c,0x3f,0xff,0x03,0xff,0xf0,0xff,0xfc,0x00,0x00,0x00, |
masato | 0:69bb996225c1 | 45 | 0x00,0x00,0x03,0xc0,0xf0,0x3c,0x3d,0xfe,0x01,0xff,0xe0,0x7f,0xbc,0x00,0x00,0x00, |
masato | 0:69bb996225c1 | 46 | 0x00,0x00,0x03,0xc0,0xf0,0x3c,0x3c,0xfc,0x00,0x7f,0x00,0x3f,0x3c,0x00,0x00,0x00, |
masato | 0:69bb996225c1 | 47 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
masato | 0:69bb996225c1 | 48 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
masato | 0:69bb996225c1 | 49 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
masato | 0:69bb996225c1 | 50 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
masato | 0:69bb996225c1 | 51 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
masato | 0:69bb996225c1 | 52 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
masato | 0:69bb996225c1 | 53 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
masato | 0:69bb996225c1 | 54 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
masato | 0:69bb996225c1 | 55 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
masato | 0:69bb996225c1 | 56 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
masato | 0:69bb996225c1 | 57 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
masato | 0:69bb996225c1 | 58 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
masato | 0:69bb996225c1 | 59 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
masato | 0:69bb996225c1 | 60 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 |
masato | 0:69bb996225c1 | 61 | }; |
masato | 0:69bb996225c1 | 62 | |
masato | 0:69bb996225c1 | 63 | |
masato | 0:69bb996225c1 | 64 | const static struct Bitmap logo = { |
masato | 0:69bb996225c1 | 65 | 128, |
masato | 0:69bb996225c1 | 66 | 48, |
masato | 0:69bb996225c1 | 67 | 16, |
masato | 0:69bb996225c1 | 68 | (char*)mbedlogo128x48, |
masato | 0:69bb996225c1 | 69 | }; |
masato | 0:69bb996225c1 | 70 | |
masato | 2:862f6ab24cfc | 71 | const char target[] = |
masato | 0:69bb996225c1 | 72 | #if defined(TARGET_NUCLEO_L152RE) |
masato | 2:862f6ab24cfc | 73 | "STM32 Nucleo L152RE" |
masato | 2:862f6ab24cfc | 74 | #elif defined(TARGET_KL05Z) |
masato | 2:862f6ab24cfc | 75 | "Freescale FRDM-KL05Z" |
masato | 2:862f6ab24cfc | 76 | #else |
masato | 2:862f6ab24cfc | 77 | "????" |
masato | 0:69bb996225c1 | 78 | #endif |
masato | 2:862f6ab24cfc | 79 | ; |
masato | 2:862f6ab24cfc | 80 | |
masato | 3:93270b9f6a01 | 81 | #if defined(TARGET_NUCLEO_L152RE) |
masato | 3:93270b9f6a01 | 82 | GT20L16J1Y_FONT font(D4, D5, D3, D2); |
masato | 3:93270b9f6a01 | 83 | #else |
masato | 3:93270b9f6a01 | 84 | GT20L16J1Y_FONT font(p11, p12, p13, p10); |
masato | 3:93270b9f6a01 | 85 | #endif |
masato | 3:93270b9f6a01 | 86 | |
masato | 3:93270b9f6a01 | 87 | #define numOfCharBuffer 40 |
masato | 3:93270b9f6a01 | 88 | uint16_t kBuf[numOfCharBuffer]; |
masato | 3:93270b9f6a01 | 89 | |
masato | 3:93270b9f6a01 | 90 | void draw_string(int offset_x, int offset_y, int width) |
masato | 3:93270b9f6a01 | 91 | { |
masato | 3:93270b9f6a01 | 92 | int color; |
masato | 3:93270b9f6a01 | 93 | for(int x=0; x<width*2; x++) |
masato | 3:93270b9f6a01 | 94 | { |
masato | 3:93270b9f6a01 | 95 | for(int y=0; y<8; y++) |
masato | 3:93270b9f6a01 | 96 | { |
masato | 3:93270b9f6a01 | 97 | if (font.bitmap[x] & (1<<y)) |
masato | 3:93270b9f6a01 | 98 | color = 1; |
masato | 3:93270b9f6a01 | 99 | else |
masato | 3:93270b9f6a01 | 100 | color = 0; |
masato | 3:93270b9f6a01 | 101 | lcd.pixel(x%width + offset_x, y+(8*(x/width)) + offset_y, color); |
masato | 3:93270b9f6a01 | 102 | } |
masato | 3:93270b9f6a01 | 103 | } |
masato | 3:93270b9f6a01 | 104 | lcd.copy_to_lcd(); |
masato | 3:93270b9f6a01 | 105 | } |
masato | 3:93270b9f6a01 | 106 | |
masato | 3:93270b9f6a01 | 107 | int int_compar(const uint16_t *a, const uint16_t *b) |
masato | 3:93270b9f6a01 | 108 | { |
masato | 3:93270b9f6a01 | 109 | if (*a < *b) |
masato | 3:93270b9f6a01 | 110 | return (-1); |
masato | 3:93270b9f6a01 | 111 | else if (*a > *b) |
masato | 3:93270b9f6a01 | 112 | return (1); |
masato | 3:93270b9f6a01 | 113 | else |
masato | 3:93270b9f6a01 | 114 | return (0); |
masato | 3:93270b9f6a01 | 115 | } |
masato | 3:93270b9f6a01 | 116 | |
masato | 3:93270b9f6a01 | 117 | int conv_utf8(char* utfBuffer, uint16_t* kutenBuffer) |
masato | 3:93270b9f6a01 | 118 | { |
masato | 3:93270b9f6a01 | 119 | int ret; |
masato | 3:93270b9f6a01 | 120 | uint16_t key, *index, *pBuf; |
masato | 3:93270b9f6a01 | 121 | char *uBuf; |
masato | 3:93270b9f6a01 | 122 | |
masato | 3:93270b9f6a01 | 123 | uBuf = utfBuffer; |
masato | 3:93270b9f6a01 | 124 | pBuf = kutenBuffer; |
masato | 3:93270b9f6a01 | 125 | ret = 0; |
masato | 3:93270b9f6a01 | 126 | |
masato | 3:93270b9f6a01 | 127 | while (uBuf[0] != 0) { |
masato | 3:93270b9f6a01 | 128 | if (uBuf[0] >= 0x20 && uBuf[0] < 0x80) { |
masato | 3:93270b9f6a01 | 129 | // in case of ASCII |
masato | 3:93270b9f6a01 | 130 | *pBuf++ = (uint16_t)uBuf[0]; |
masato | 3:93270b9f6a01 | 131 | uBuf += 1; |
masato | 3:93270b9f6a01 | 132 | ret++; |
masato | 3:93270b9f6a01 | 133 | continue; |
masato | 3:93270b9f6a01 | 134 | } |
masato | 3:93270b9f6a01 | 135 | else if ( (uBuf[0]&0xF0) != 0xE0) { |
masato | 3:93270b9f6a01 | 136 | uBuf += 1; |
masato | 3:93270b9f6a01 | 137 | continue; |
masato | 3:93270b9f6a01 | 138 | } |
masato | 3:93270b9f6a01 | 139 | // extract valid bits of UTF-8 |
masato | 3:93270b9f6a01 | 140 | key = ((uBuf[0] & 0x000F) << 12) | ((uBuf[1] & 0x003F) << 6) | (uBuf[2] & 0x003F); |
masato | 3:93270b9f6a01 | 141 | |
masato | 3:93270b9f6a01 | 142 | // search UTF-8 code from utf8_key[] table to get index of Kuten table |
masato | 3:93270b9f6a01 | 143 | index = (uint16_t *)bsearch(&key, utf8_key, (sizeof(utf8_key) / sizeof(utf8_key[0])), sizeof(uint16_t), (int (*)(const void *, const void *))int_compar); |
masato | 3:93270b9f6a01 | 144 | if (index != 0) { |
masato | 3:93270b9f6a01 | 145 | // get Kuten code |
masato | 3:93270b9f6a01 | 146 | *pBuf = utf8_value[index - utf8_key]; |
masato | 3:93270b9f6a01 | 147 | } |
masato | 3:93270b9f6a01 | 148 | |
masato | 3:93270b9f6a01 | 149 | uBuf += 3; |
masato | 3:93270b9f6a01 | 150 | pBuf++; |
masato | 3:93270b9f6a01 | 151 | ret++; |
masato | 3:93270b9f6a01 | 152 | } |
masato | 3:93270b9f6a01 | 153 | *pBuf = 0; |
masato | 3:93270b9f6a01 | 154 | |
masato | 3:93270b9f6a01 | 155 | return ret; |
masato | 3:93270b9f6a01 | 156 | } |
masato | 3:93270b9f6a01 | 157 | |
masato | 3:93270b9f6a01 | 158 | void draw_utf8(int offset_x, int offset_y, char *buf_u) |
masato | 3:93270b9f6a01 | 159 | { |
masato | 3:93270b9f6a01 | 160 | int len = conv_utf8(buf_u, kBuf); |
masato | 3:93270b9f6a01 | 161 | int xpos = 0; |
masato | 3:93270b9f6a01 | 162 | |
masato | 3:93270b9f6a01 | 163 | for(int i = 0; i < len; i++) { |
masato | 3:93270b9f6a01 | 164 | int width = font.read_kuten(kBuf[i]); |
masato | 3:93270b9f6a01 | 165 | draw_string(xpos + offset_x, offset_y, width); |
masato | 3:93270b9f6a01 | 166 | xpos += width; |
masato | 3:93270b9f6a01 | 167 | } |
masato | 3:93270b9f6a01 | 168 | } |
masato | 3:93270b9f6a01 | 169 | |
masato | 3:93270b9f6a01 | 170 | |
masato | 2:862f6ab24cfc | 171 | int main() { |
masato | 3:93270b9f6a01 | 172 | unsigned short kbuf[16] = {0x93fa, 0x967b, 0x8cea, 0x955c, 0x8ea6}; |
masato | 3:93270b9f6a01 | 173 | |
masato | 2:862f6ab24cfc | 174 | printf("%s\r\n", target); |
masato | 0:69bb996225c1 | 175 | lcd.setmode(NORMAL); |
masato | 0:69bb996225c1 | 176 | // lcd.set_font((unsigned char*) Arial_9); |
masato | 0:69bb996225c1 | 177 | lcd.set_contrast(25); |
masato | 0:69bb996225c1 | 178 | while (1) { |
masato | 0:69bb996225c1 | 179 | lcd.cls(); |
masato | 0:69bb996225c1 | 180 | lcd.locate(0,0); |
masato | 3:93270b9f6a01 | 181 | lcd.printf("\r\n %s!\r\n This is AQM1248A demo.", target); |
masato | 3:93270b9f6a01 | 182 | |
masato | 3:93270b9f6a01 | 183 | wait(1); |
masato | 3:93270b9f6a01 | 184 | lcd.cls(); |
masato | 3:93270b9f6a01 | 185 | draw_utf8(0, 0, "進捗どうですか??"); |
masato | 3:93270b9f6a01 | 186 | draw_utf8(0, 16, "mbedで日本語表示"); |
masato | 3:93270b9f6a01 | 187 | wait(5); |
masato | 3:93270b9f6a01 | 188 | // continue; |
masato | 0:69bb996225c1 | 189 | |
masato | 3:93270b9f6a01 | 190 | // wait(1); |
masato | 3:93270b9f6a01 | 191 | lcd.cls(); |
masato | 0:69bb996225c1 | 192 | lcd.line(0, 0, lcd.width()-1, 0, 1); |
masato | 0:69bb996225c1 | 193 | lcd.line(0, 0, lcd.width()-1, lcd.height()-1, 1); |
masato | 0:69bb996225c1 | 194 | lcd.line(0, 0, 0, lcd.height()-1, 1); |
masato | 0:69bb996225c1 | 195 | wait(1); |
masato | 0:69bb996225c1 | 196 | lcd.circle(12, 32, 10, 1); |
masato | 0:69bb996225c1 | 197 | lcd.fillcircle(24, 32, 10, 1); |
masato | 0:69bb996225c1 | 198 | lcd.rect(36, 32, 48, 44, 1); |
masato | 0:69bb996225c1 | 199 | lcd.fillrect(60, 32, 72, 44, 1); |
masato | 0:69bb996225c1 | 200 | wait(1); |
masato | 0:69bb996225c1 | 201 | lcd.print_bm(logo, 0, 0); |
masato | 0:69bb996225c1 | 202 | // lcd.copy_to_lcd(); |
masato | 2:862f6ab24cfc | 203 | lcd.printf("\r\n\r\n %s", target); |
masato | 2:862f6ab24cfc | 204 | |
masato | 0:69bb996225c1 | 205 | wait(12); |
masato | 0:69bb996225c1 | 206 | } |
masato | 0:69bb996225c1 | 207 | } |