Compatible with ATM0177B3A

Dependencies:   mbed

秋月電子で販売されているATM0177B3AをNucleo F303K8で動かしました。https://akizukidenshi.com/catalog/g/gK-14032/

フォーク元は以下になります。ピン番号の変更とライブラリの更新のみでも一応動きます。https://os.mbed.com/users/morita/code/DL144128_LCD/file/c0be4e018a09/ili9163lcd.h/

変更点

  • SPIクロックの極性を変更→データシートでは立下りでデータ出力です。

void lcdWriteCommand(uint8_t address)
{
    uint8_t i;

    CS_ = 0;
    A0_ = 0;
    for(i=0;i<8;i++){
        if(address & 128)SDA_= 1; else SDA_ = 0;
        SCK_ = 0;//変更箇所
        address <<= 1;
        SCK_ = 1;//変更箇所
    }
    wait_us(1);
    CS_ = 1;
}
  • RGBの並びを変更→データシートではMSBファーストでRGBの並びです。

inline uint16_t decodeRgbValue(uint8_t r, uint8_t g, uint8_t b)
{
    return (r << 11) | (g << 6) | (b);
}   
  • 画面サイズをdefine

//128x160
#define COL_MAX   0x7f
#define PAGE_MAX  0x9f
  • 画面表示方向のdefine定義名を変更 →LCD_ORIENTATION0 がエラーのため

#define LCD_ORIENTATION0  0//変更前
#define ROT_TOP           0b00000000//変更後

機能追加

  • グラデーション

void grade(void);
  • カラーバー

void colorbar(void);
  • バースト機能→ 1byte転送毎にwait_us(1)が呼び出され、速度低下していました。 wait_us(1)を削除した関数を2つ作成しました。

void lcdWriteData_burst(uint16_t *burst_data,uint16_t length);
void lcdWriteData_sameburst(uint16_t data,uint16_t length);

他省略

  • ガンマカーブ設定のコメントアウト →初期設定で問題なし
  • 画面サイズ設定のコメントアウト →HWで設定済、ballとbatはVRAMを部分的に書き換えているため、毎度caset、rasetの設定が必要です。

HW構成

https://os.mbed.com/media/uploads/gitakichi/img_20210101_231750_2.jpg

  • VFのTYPが3.3Vと精度が疑わしく、電流制限抵抗の設計が難しい→バックライトの実測

負荷抵抗:10Ω、電源電圧:3.276V時 VR=0.335V、従ってVF=2.941V、IF=33.5mA

負荷抵抗:100Ω時 VR=0.621V、従ってVF=2.655V、IF=26.55mA →若干暗いけど問題ないので採用

  • ピン配置

DigitalOut SCK_(A4);
DigitalOut SDA_(A6);
DigitalOut A0_(A2);
DigitalOut RESET_(A1);//10kプルアップ
DigitalOut CS_(A3);
Committer:
gitakichi
Date:
Tue Jan 05 07:10:40 2021 +0000
Revision:
9:58f6248ef377
Parent:
7:eaaf60683ca4
SMPTE colorbar modoki and 16bit charactor

Who changed what in which revision?

UserRevisionLine numberNew contents of line
morita 0:c0be4e018a09 1 /**
morita 0:c0be4e018a09 2 * @file ili9163lcd.c
gitakichi 2:4d5b94a92f19 3 * @brief ILI9163 128x160 LCD Driver
morita 0:c0be4e018a09 4 *
morita 0:c0be4e018a09 5 * This code has been ported from the ili9163lcd library for mbed
morita 0:c0be4e018a09 6 * made by Jun Morita.
morita 0:c0be4e018a09 7 * Source form <http://files.noccylabs.info/lib430/liblcd/ili9163lcd_8c.html>
morita 0:c0be4e018a09 8 *
morita 0:c0be4e018a09 9 * This code has been ported from the ili9163lcd library for avr made
morita 0:c0be4e018a09 10 * by Simon Inns, to run on a msp430.
morita 0:c0be4e018a09 11 *
morita 0:c0be4e018a09 12 * This program is free software: you can redistribute it and/or modify
morita 0:c0be4e018a09 13 * it under the terms of the GNU General Public License as published by
morita 0:c0be4e018a09 14 * the Free Software Foundation, either version 3 of the License, or
morita 0:c0be4e018a09 15 * (at your option) any later version.
morita 0:c0be4e018a09 16 *
morita 0:c0be4e018a09 17 * This program is distributed in the hope that it will be useful,
morita 0:c0be4e018a09 18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
morita 0:c0be4e018a09 19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
morita 0:c0be4e018a09 20 * GNU General Public License for more details.
morita 0:c0be4e018a09 21 *
morita 0:c0be4e018a09 22 * You should have received a copy of the GNU General Public License
morita 0:c0be4e018a09 23 * along with this program. If not, see <http://www.gnu.org/licenses/>.
morita 0:c0be4e018a09 24 *
gitakichi 2:4d5b94a92f19 25 * @author Gitakichi
morita 0:c0be4e018a09 26 * @author Jun Morita (iccraft)
morita 0:c0be4e018a09 27 * @author Simon Inns <simon.inns@gmail.com>
morita 0:c0be4e018a09 28 * @author Christopher Vagnetoft (NoccyLabs)
morita 0:c0be4e018a09 29 * @copyright (C) 2012 Simon Inns
morita 0:c0be4e018a09 30 * @copyright parts (C) 2012 NoccyLabs
morita 0:c0be4e018a09 31 */
morita 0:c0be4e018a09 32
morita 0:c0be4e018a09 33 #include "mbed.h"
morita 0:c0be4e018a09 34 #include "font5x8.h"
morita 0:c0be4e018a09 35 #include "ili9163lcd.h"
morita 0:c0be4e018a09 36
morita 0:c0be4e018a09 37 // Connection of mbed pins.
gitakichi 1:cd2949e87b17 38 DigitalOut SCK_(A4);
gitakichi 1:cd2949e87b17 39 DigitalOut SDA_(A6);
gitakichi 1:cd2949e87b17 40 DigitalOut A0_(A2);
gitakichi 1:cd2949e87b17 41 DigitalOut RESET_(A1);
gitakichi 1:cd2949e87b17 42 DigitalOut CS_(A3);
morita 0:c0be4e018a09 43
morita 0:c0be4e018a09 44 // Low-level LCD driving functions --------------------------------------------------------------------------
morita 0:c0be4e018a09 45
morita 0:c0be4e018a09 46 // Reset the LCD hardware
morita 0:c0be4e018a09 47 void lcdReset(void)
morita 0:c0be4e018a09 48 {
morita 0:c0be4e018a09 49 // Reset pin is active low (0 = reset, 1 = ready)
morita 0:c0be4e018a09 50 RESET_ = 0;
morita 0:c0be4e018a09 51 wait_ms(50);
morita 0:c0be4e018a09 52
morita 0:c0be4e018a09 53 RESET_ = 1;
morita 0:c0be4e018a09 54 wait_ms(120);
morita 0:c0be4e018a09 55 }
morita 0:c0be4e018a09 56
morita 0:c0be4e018a09 57 void lcdWriteCommand(uint8_t address)
morita 0:c0be4e018a09 58 {
morita 0:c0be4e018a09 59 uint8_t i;
morita 0:c0be4e018a09 60
morita 0:c0be4e018a09 61 CS_ = 0;
morita 0:c0be4e018a09 62 A0_ = 0;
morita 0:c0be4e018a09 63 for(i=0;i<8;i++){
morita 0:c0be4e018a09 64 if(address & 128)SDA_= 1; else SDA_ = 0;
gitakichi 3:9caa79f40909 65 SCK_ = 0;//TBD
morita 0:c0be4e018a09 66 address <<= 1;
gitakichi 3:9caa79f40909 67 SCK_ = 1;//TBD
morita 0:c0be4e018a09 68 }
morita 0:c0be4e018a09 69 wait_us(1);
morita 0:c0be4e018a09 70 CS_ = 1;
morita 0:c0be4e018a09 71 }
morita 0:c0be4e018a09 72
morita 0:c0be4e018a09 73 void lcdWriteParameter(uint8_t parameter)
morita 0:c0be4e018a09 74 {
morita 0:c0be4e018a09 75 uint8_t i;
morita 0:c0be4e018a09 76
morita 0:c0be4e018a09 77 CS_ = 0;
morita 0:c0be4e018a09 78 A0_ = 1;
morita 0:c0be4e018a09 79 for(i=0;i<8;i++){
morita 0:c0be4e018a09 80 if(parameter & 128)SDA_= 1; else SDA_ = 0;
gitakichi 3:9caa79f40909 81 SCK_ = 0;//TBD
morita 0:c0be4e018a09 82 parameter <<= 1;
gitakichi 3:9caa79f40909 83 SCK_ = 1;//TBD
morita 0:c0be4e018a09 84 }
morita 0:c0be4e018a09 85 wait_us(1);
morita 0:c0be4e018a09 86 CS_ = 1;
morita 0:c0be4e018a09 87 }
morita 0:c0be4e018a09 88
morita 0:c0be4e018a09 89 void lcdWriteData(uint8_t dataByte1, uint8_t dataByte2)
morita 0:c0be4e018a09 90 {
morita 0:c0be4e018a09 91 uint8_t i;
morita 0:c0be4e018a09 92
morita 0:c0be4e018a09 93 CS_ = 0;
morita 0:c0be4e018a09 94 A0_ = 1;
morita 0:c0be4e018a09 95 for(i=0;i<8;i++){
morita 0:c0be4e018a09 96 if(dataByte1 & 128)SDA_= 1; else SDA_ = 0;
gitakichi 3:9caa79f40909 97 SCK_ = 0;//TBD
morita 0:c0be4e018a09 98 dataByte1 <<= 1;
gitakichi 3:9caa79f40909 99 SCK_ = 1;//TBD
morita 0:c0be4e018a09 100 }
morita 0:c0be4e018a09 101 wait_us(1);
morita 0:c0be4e018a09 102 for(i=0;i<8;i++){
morita 0:c0be4e018a09 103 if(dataByte2 & 128)SDA_= 1; else SDA_ = 0;
gitakichi 3:9caa79f40909 104 SCK_ = 0;//TBD
morita 0:c0be4e018a09 105 dataByte2 <<= 1;
gitakichi 3:9caa79f40909 106 SCK_ = 1;//TBD
morita 0:c0be4e018a09 107 }
morita 0:c0be4e018a09 108 wait_us(1);
morita 0:c0be4e018a09 109 CS_ = 1;
morita 0:c0be4e018a09 110 }
morita 0:c0be4e018a09 111
gitakichi 6:7abe5999dc1c 112 void lcdWriteData_burst(uint16_t *burst_data,uint16_t length)
gitakichi 6:7abe5999dc1c 113 {
gitakichi 6:7abe5999dc1c 114 uint8_t dataByte1,dataByte2;
gitakichi 6:7abe5999dc1c 115 uint8_t i;
gitakichi 6:7abe5999dc1c 116 uint16_t pixel;
gitakichi 6:7abe5999dc1c 117
gitakichi 6:7abe5999dc1c 118 CS_ = 0;
gitakichi 6:7abe5999dc1c 119 A0_ = 1;
gitakichi 6:7abe5999dc1c 120 for(pixel = 0;pixel < length;pixel++){
gitakichi 6:7abe5999dc1c 121 dataByte1 = *burst_data >> 8;
gitakichi 6:7abe5999dc1c 122 dataByte2 = *burst_data;
gitakichi 6:7abe5999dc1c 123 burst_data++;
gitakichi 6:7abe5999dc1c 124
gitakichi 6:7abe5999dc1c 125 for(i=0;i<8;i++){
gitakichi 6:7abe5999dc1c 126 if(dataByte1 & 128)SDA_= 1; else SDA_ = 0;
gitakichi 6:7abe5999dc1c 127 SCK_ = 0;//TBD
gitakichi 6:7abe5999dc1c 128 dataByte1 <<= 1;
gitakichi 6:7abe5999dc1c 129 SCK_ = 1;//TBD
gitakichi 6:7abe5999dc1c 130 }
gitakichi 6:7abe5999dc1c 131 for(i=0;i<8;i++){
gitakichi 6:7abe5999dc1c 132 if(dataByte2 & 128)SDA_= 1; else SDA_ = 0;
gitakichi 6:7abe5999dc1c 133 SCK_ = 0;//TBD
gitakichi 6:7abe5999dc1c 134 dataByte2 <<= 1;
gitakichi 6:7abe5999dc1c 135 SCK_ = 1;//TBD
gitakichi 6:7abe5999dc1c 136 }
gitakichi 6:7abe5999dc1c 137 }
gitakichi 6:7abe5999dc1c 138 wait_us(1);
gitakichi 6:7abe5999dc1c 139 CS_ = 1;
gitakichi 6:7abe5999dc1c 140 }
gitakichi 6:7abe5999dc1c 141
gitakichi 7:eaaf60683ca4 142 void lcdWriteData_monoburst(bool *burst_data,uint16_t length)
gitakichi 7:eaaf60683ca4 143 {
gitakichi 7:eaaf60683ca4 144 uint8_t dataByte1,dataByte2;
gitakichi 7:eaaf60683ca4 145 uint8_t i;
gitakichi 7:eaaf60683ca4 146 uint16_t pixel;
gitakichi 7:eaaf60683ca4 147 uint16_t colour;
gitakichi 7:eaaf60683ca4 148
gitakichi 7:eaaf60683ca4 149 CS_ = 0;
gitakichi 7:eaaf60683ca4 150 A0_ = 1;
gitakichi 7:eaaf60683ca4 151 for(pixel = 0;pixel < length;pixel++){
gitakichi 7:eaaf60683ca4 152 if(*burst_data)colour=decodeRgbValue(31, 0, 0);
gitakichi 7:eaaf60683ca4 153 else colour=decodeRgbValue(0, 0, 0);
gitakichi 7:eaaf60683ca4 154 dataByte1 = colour >> 8;
gitakichi 7:eaaf60683ca4 155 dataByte2 = colour;
gitakichi 7:eaaf60683ca4 156 burst_data++;
gitakichi 7:eaaf60683ca4 157
gitakichi 7:eaaf60683ca4 158 for(i=0;i<8;i++){
gitakichi 7:eaaf60683ca4 159 if(dataByte1 & 128)SDA_= 1; else SDA_ = 0;
gitakichi 7:eaaf60683ca4 160 SCK_ = 0;//TBD
gitakichi 7:eaaf60683ca4 161 dataByte1 <<= 1;
gitakichi 7:eaaf60683ca4 162 SCK_ = 1;//TBD
gitakichi 7:eaaf60683ca4 163 }
gitakichi 7:eaaf60683ca4 164 for(i=0;i<8;i++){
gitakichi 7:eaaf60683ca4 165 if(dataByte2 & 128)SDA_= 1; else SDA_ = 0;
gitakichi 7:eaaf60683ca4 166 SCK_ = 0;//TBD
gitakichi 7:eaaf60683ca4 167 dataByte2 <<= 1;
gitakichi 7:eaaf60683ca4 168 SCK_ = 1;//TBD
gitakichi 7:eaaf60683ca4 169 }
gitakichi 7:eaaf60683ca4 170 }
gitakichi 7:eaaf60683ca4 171 wait_us(1);
gitakichi 7:eaaf60683ca4 172 CS_ = 1;
gitakichi 7:eaaf60683ca4 173 }
gitakichi 7:eaaf60683ca4 174
gitakichi 6:7abe5999dc1c 175 void lcdWriteData_sameburst(uint16_t data,uint16_t length)
gitakichi 6:7abe5999dc1c 176 {
gitakichi 6:7abe5999dc1c 177 uint8_t dataByte1,dataByte2;
gitakichi 6:7abe5999dc1c 178 uint8_t i;
gitakichi 6:7abe5999dc1c 179 uint16_t pixel;
gitakichi 6:7abe5999dc1c 180
gitakichi 6:7abe5999dc1c 181 CS_ = 0;
gitakichi 6:7abe5999dc1c 182 A0_ = 1;
gitakichi 6:7abe5999dc1c 183 for(pixel = 0;pixel < length;pixel++){
gitakichi 6:7abe5999dc1c 184 dataByte1 = data >> 8;
gitakichi 6:7abe5999dc1c 185 dataByte2 = data;
gitakichi 6:7abe5999dc1c 186
gitakichi 6:7abe5999dc1c 187 for(i=0;i<8;i++){
gitakichi 6:7abe5999dc1c 188 if(dataByte1 & 128)SDA_= 1; else SDA_ = 0;
gitakichi 6:7abe5999dc1c 189 SCK_ = 0;//TBD
gitakichi 6:7abe5999dc1c 190 dataByte1 <<= 1;
gitakichi 6:7abe5999dc1c 191 SCK_ = 1;//TBD
gitakichi 6:7abe5999dc1c 192 }
gitakichi 6:7abe5999dc1c 193 for(i=0;i<8;i++){
gitakichi 6:7abe5999dc1c 194 if(dataByte2 & 128)SDA_= 1; else SDA_ = 0;
gitakichi 6:7abe5999dc1c 195 SCK_ = 0;//TBD
gitakichi 6:7abe5999dc1c 196 dataByte2 <<= 1;
gitakichi 6:7abe5999dc1c 197 SCK_ = 1;//TBD
gitakichi 6:7abe5999dc1c 198 }
gitakichi 6:7abe5999dc1c 199 }
gitakichi 6:7abe5999dc1c 200 wait_us(1);
gitakichi 6:7abe5999dc1c 201 CS_ = 1;
gitakichi 6:7abe5999dc1c 202 }
gitakichi 6:7abe5999dc1c 203
morita 0:c0be4e018a09 204 // Initialise the display with the require screen orientation
morita 0:c0be4e018a09 205 void lcdInitialise(uint8_t orientation)
morita 0:c0be4e018a09 206 {
morita 0:c0be4e018a09 207 CS_ = 1;
morita 0:c0be4e018a09 208 SCK_ = 0;
morita 0:c0be4e018a09 209 RESET_ = 1;
morita 0:c0be4e018a09 210
morita 0:c0be4e018a09 211 // Hardware reset the LCD
morita 0:c0be4e018a09 212 lcdReset();
morita 0:c0be4e018a09 213
morita 0:c0be4e018a09 214 lcdWriteCommand(EXIT_SLEEP_MODE);
morita 0:c0be4e018a09 215 wait_ms(5); // Wait for the screen to wake up
morita 0:c0be4e018a09 216
morita 0:c0be4e018a09 217 lcdWriteCommand(SET_PIXEL_FORMAT);
morita 0:c0be4e018a09 218 lcdWriteParameter(0x05); // 16 bits per pixel
gitakichi 2:4d5b94a92f19 219 /*
morita 0:c0be4e018a09 220 lcdWriteCommand(SET_GAMMA_CURVE);
morita 0:c0be4e018a09 221 lcdWriteParameter(0x04); // Select gamma curve 3
morita 0:c0be4e018a09 222
morita 0:c0be4e018a09 223 lcdWriteCommand(GAM_R_SEL);
morita 0:c0be4e018a09 224 lcdWriteParameter(0x01); // Gamma adjustment enabled
morita 0:c0be4e018a09 225
gitakichi 2:4d5b94a92f19 226
morita 0:c0be4e018a09 227 lcdWriteCommand(POSITIVE_GAMMA_CORRECT);
morita 0:c0be4e018a09 228 lcdWriteParameter(0x3f); // 1st Parameter
morita 0:c0be4e018a09 229 lcdWriteParameter(0x25); // 2nd Parameter
morita 0:c0be4e018a09 230 lcdWriteParameter(0x1c); // 3rd Parameter
morita 0:c0be4e018a09 231 lcdWriteParameter(0x1e); // 4th Parameter
morita 0:c0be4e018a09 232 lcdWriteParameter(0x20); // 5th Parameter
morita 0:c0be4e018a09 233 lcdWriteParameter(0x12); // 6th Parameter
morita 0:c0be4e018a09 234 lcdWriteParameter(0x2a); // 7th Parameter
morita 0:c0be4e018a09 235 lcdWriteParameter(0x90); // 8th Parameter
morita 0:c0be4e018a09 236 lcdWriteParameter(0x24); // 9th Parameter
morita 0:c0be4e018a09 237 lcdWriteParameter(0x11); // 10th Parameter
morita 0:c0be4e018a09 238 lcdWriteParameter(0x00); // 11th Parameter
morita 0:c0be4e018a09 239 lcdWriteParameter(0x00); // 12th Parameter
morita 0:c0be4e018a09 240 lcdWriteParameter(0x00); // 13th Parameter
morita 0:c0be4e018a09 241 lcdWriteParameter(0x00); // 14th Parameter
morita 0:c0be4e018a09 242 lcdWriteParameter(0x00); // 15th Parameter
morita 0:c0be4e018a09 243
morita 0:c0be4e018a09 244 lcdWriteCommand(NEGATIVE_GAMMA_CORRECT);
morita 0:c0be4e018a09 245 lcdWriteParameter(0x20); // 1st Parameter
morita 0:c0be4e018a09 246 lcdWriteParameter(0x20); // 2nd Parameter
morita 0:c0be4e018a09 247 lcdWriteParameter(0x20); // 3rd Parameter
morita 0:c0be4e018a09 248 lcdWriteParameter(0x20); // 4th Parameter
morita 0:c0be4e018a09 249 lcdWriteParameter(0x05); // 5th Parameter
morita 0:c0be4e018a09 250 lcdWriteParameter(0x00); // 6th Parameter
morita 0:c0be4e018a09 251 lcdWriteParameter(0x15); // 7th Parameter
morita 0:c0be4e018a09 252 lcdWriteParameter(0xa7); // 8th Parameter
morita 0:c0be4e018a09 253 lcdWriteParameter(0x3d); // 9th Parameter
morita 0:c0be4e018a09 254 lcdWriteParameter(0x18); // 10th Parameter
morita 0:c0be4e018a09 255 lcdWriteParameter(0x25); // 11th Parameter
morita 0:c0be4e018a09 256 lcdWriteParameter(0x2a); // 12th Parameter
morita 0:c0be4e018a09 257 lcdWriteParameter(0x2b); // 13th Parameter
morita 0:c0be4e018a09 258 lcdWriteParameter(0x2b); // 14th Parameter
morita 0:c0be4e018a09 259 lcdWriteParameter(0x3a); // 15th Parameter
gitakichi 2:4d5b94a92f19 260 */
morita 0:c0be4e018a09 261
morita 0:c0be4e018a09 262 lcdWriteCommand(FRAME_RATE_CONTROL1);
morita 0:c0be4e018a09 263 lcdWriteParameter(0x08); // DIVA = 8
morita 0:c0be4e018a09 264 lcdWriteParameter(0x08); // VPA = 8
morita 0:c0be4e018a09 265
morita 0:c0be4e018a09 266 lcdWriteCommand(DISPLAY_INVERSION);
morita 0:c0be4e018a09 267 lcdWriteParameter(0x07); // NLA = 1, NLB = 1, NLC = 1 (all on Frame Inversion)
morita 0:c0be4e018a09 268
morita 0:c0be4e018a09 269 lcdWriteCommand(POWER_CONTROL1);
morita 0:c0be4e018a09 270 lcdWriteParameter(0x0a); // VRH = 10: GVDD = 4.30
morita 0:c0be4e018a09 271 lcdWriteParameter(0x02); // VC = 2: VCI1 = 2.65
morita 0:c0be4e018a09 272
morita 0:c0be4e018a09 273 lcdWriteCommand(POWER_CONTROL2);
morita 0:c0be4e018a09 274 lcdWriteParameter(0x02); // BT = 2: AVDD = 2xVCI1, VCL = -1xVCI1, VGH = 5xVCI1, VGL = -2xVCI1
morita 0:c0be4e018a09 275
morita 0:c0be4e018a09 276 lcdWriteCommand(VCOM_CONTROL1);
morita 0:c0be4e018a09 277 lcdWriteParameter(0x50); // VMH = 80: VCOMH voltage = 4.5
morita 0:c0be4e018a09 278 lcdWriteParameter(0x5b); // VML = 91: VCOML voltage = -0.225
morita 0:c0be4e018a09 279
morita 0:c0be4e018a09 280 lcdWriteCommand(VCOM_OFFSET_CONTROL);
morita 0:c0be4e018a09 281 lcdWriteParameter(0x40); // nVM = 0, VMF = 64: VCOMH output = VMH, VCOML output = VML
morita 0:c0be4e018a09 282
gitakichi 2:4d5b94a92f19 283 //lcdWriteCommand(SET_COLUMN_ADDRESS);
gitakichi 2:4d5b94a92f19 284 //lcdWriteParameter(0x00); // XSH
gitakichi 2:4d5b94a92f19 285 //lcdWriteParameter(0x00); // XSL
gitakichi 2:4d5b94a92f19 286 //lcdWriteParameter(0x00); // XEH
gitakichi 2:4d5b94a92f19 287 //lcdWriteParameter(0x7f); // XEL (128 pixels x)
morita 0:c0be4e018a09 288
gitakichi 2:4d5b94a92f19 289 //lcdWriteCommand(SET_PAGE_ADDRESS);
gitakichi 2:4d5b94a92f19 290 //lcdWriteParameter(0x00);
gitakichi 2:4d5b94a92f19 291 //lcdWriteParameter(0x00);
gitakichi 2:4d5b94a92f19 292 //lcdWriteParameter(0x00);
gitakichi 2:4d5b94a92f19 293 //lcdWriteParameter(0x7f); // 128 pixels y
gitakichi 2:4d5b94a92f19 294 //lcdWriteParameter(PAGE_MAX); // 160 pixels y
morita 0:c0be4e018a09 295
morita 0:c0be4e018a09 296 // Select display orientation
morita 0:c0be4e018a09 297 lcdWriteCommand(SET_ADDRESS_MODE);
morita 0:c0be4e018a09 298 lcdWriteParameter(orientation);
morita 0:c0be4e018a09 299
morita 0:c0be4e018a09 300 // Set the display to on
morita 0:c0be4e018a09 301 lcdWriteCommand(SET_DISPLAY_ON);
morita 0:c0be4e018a09 302 lcdWriteCommand(WRITE_MEMORY_START);
morita 0:c0be4e018a09 303 }
morita 0:c0be4e018a09 304
morita 0:c0be4e018a09 305 // LCD graphics functions -----------------------------------------------------------------------------------
morita 0:c0be4e018a09 306
morita 0:c0be4e018a09 307 void lcdClearDisplay(uint16_t colour)
morita 0:c0be4e018a09 308 {
morita 0:c0be4e018a09 309 // Set the column address to 0-127
morita 0:c0be4e018a09 310 lcdWriteCommand(SET_COLUMN_ADDRESS);
morita 0:c0be4e018a09 311 lcdWriteParameter(0x00);
morita 0:c0be4e018a09 312 lcdWriteParameter(0x00);
morita 0:c0be4e018a09 313 lcdWriteParameter(0x00);
gitakichi 2:4d5b94a92f19 314 lcdWriteParameter(COL_MAX);
morita 0:c0be4e018a09 315
morita 0:c0be4e018a09 316 // Set the page address to 0-127
morita 0:c0be4e018a09 317 lcdWriteCommand(SET_PAGE_ADDRESS);
morita 0:c0be4e018a09 318 lcdWriteParameter(0x00);
morita 0:c0be4e018a09 319 lcdWriteParameter(0x00);
morita 0:c0be4e018a09 320 lcdWriteParameter(0x00);
gitakichi 2:4d5b94a92f19 321 //lcdWriteParameter(0x7f);
gitakichi 2:4d5b94a92f19 322 lcdWriteParameter(PAGE_MAX);
morita 0:c0be4e018a09 323
morita 0:c0be4e018a09 324 // Plot the pixels
morita 0:c0be4e018a09 325 lcdWriteCommand(WRITE_MEMORY_START);
gitakichi 2:4d5b94a92f19 326 //for(pixel = 0; pixel < 16385; pixel++) lcdWriteData(colour >> 8, colour);
gitakichi 5:570ba49da81c 327 //for(pixel = 0; pixel < 20480; pixel++) lcdWriteData(colour >> 8, colour);
gitakichi 6:7abe5999dc1c 328 lcdWriteData_sameburst(colour,20480);
morita 0:c0be4e018a09 329 }
morita 0:c0be4e018a09 330
gitakichi 3:9caa79f40909 331 void grade(void)
gitakichi 3:9caa79f40909 332 {
gitakichi 3:9caa79f40909 333 uint16_t line_buf[128];
gitakichi 6:7abe5999dc1c 334 uint8_t pixel;
gitakichi 3:9caa79f40909 335
gitakichi 3:9caa79f40909 336 // Set the column address to 0-127
gitakichi 3:9caa79f40909 337 lcdWriteCommand(SET_COLUMN_ADDRESS);
gitakichi 3:9caa79f40909 338 lcdWriteParameter(0x00);
gitakichi 3:9caa79f40909 339 lcdWriteParameter(0x00);
gitakichi 3:9caa79f40909 340 lcdWriteParameter(0x00);
gitakichi 3:9caa79f40909 341 lcdWriteParameter(COL_MAX);
gitakichi 3:9caa79f40909 342
gitakichi 3:9caa79f40909 343 // Set the page address to 0-127
gitakichi 3:9caa79f40909 344 lcdWriteCommand(SET_PAGE_ADDRESS);
gitakichi 3:9caa79f40909 345 lcdWriteParameter(0x00);
gitakichi 3:9caa79f40909 346 lcdWriteParameter(0x00);
gitakichi 3:9caa79f40909 347 lcdWriteParameter(0x00);
gitakichi 3:9caa79f40909 348 //lcdWriteParameter(0x7f);
gitakichi 3:9caa79f40909 349 lcdWriteParameter(PAGE_MAX);
gitakichi 3:9caa79f40909 350
gitakichi 3:9caa79f40909 351 for(pixel = 0; pixel < 128; pixel++){
gitakichi 5:570ba49da81c 352 if(pixel < 32) line_buf[pixel] = decodeRgbValue((pixel&0b11111)>>1, 0, 0);
gitakichi 5:570ba49da81c 353 else if(pixel < 64) line_buf[pixel] = decodeRgbValue(0, (pixel&0b11111)>>1, 0);
gitakichi 5:570ba49da81c 354 else if(pixel < 96) line_buf[pixel] = decodeRgbValue(0, 0, (pixel&0b11111)>>1);
gitakichi 5:570ba49da81c 355 else line_buf[pixel] = decodeRgbValue(0, 0, 0);
gitakichi 3:9caa79f40909 356 }
gitakichi 3:9caa79f40909 357 // Plot the pixels
gitakichi 3:9caa79f40909 358 lcdWriteCommand(WRITE_MEMORY_START);
gitakichi 6:7abe5999dc1c 359 for(uint16_t page = 0;page < 160;page++){
gitakichi 6:7abe5999dc1c 360 lcdWriteData_burst(line_buf,128);
gitakichi 3:9caa79f40909 361 }
gitakichi 3:9caa79f40909 362 }
gitakichi 3:9caa79f40909 363
gitakichi 3:9caa79f40909 364 void colorbar(void)
gitakichi 3:9caa79f40909 365 {
gitakichi 9:58f6248ef377 366 uint16_t colour_a,colour_b;
gitakichi 3:9caa79f40909 367
gitakichi 3:9caa79f40909 368 // Set the column address to 0-127
gitakichi 3:9caa79f40909 369 lcdWriteCommand(SET_COLUMN_ADDRESS);
gitakichi 3:9caa79f40909 370 lcdWriteParameter(0x00);
gitakichi 3:9caa79f40909 371 lcdWriteParameter(0x00);
gitakichi 3:9caa79f40909 372 lcdWriteParameter(0x00);
gitakichi 3:9caa79f40909 373 lcdWriteParameter(COL_MAX);
gitakichi 3:9caa79f40909 374
gitakichi 3:9caa79f40909 375 // Set the page address to 0-127
gitakichi 3:9caa79f40909 376 lcdWriteCommand(SET_PAGE_ADDRESS);
gitakichi 3:9caa79f40909 377 lcdWriteParameter(0x00);
gitakichi 3:9caa79f40909 378 lcdWriteParameter(0x00);
gitakichi 3:9caa79f40909 379 lcdWriteParameter(0x00);
gitakichi 3:9caa79f40909 380 //lcdWriteParameter(0x7f);
gitakichi 3:9caa79f40909 381 lcdWriteParameter(PAGE_MAX);
gitakichi 3:9caa79f40909 382
gitakichi 3:9caa79f40909 383 // Plot the pixels
gitakichi 3:9caa79f40909 384 lcdWriteCommand(WRITE_MEMORY_START);
gitakichi 3:9caa79f40909 385 for(uint16_t page = 0;page < 160;page++){
gitakichi 9:58f6248ef377 386 if(page < 28){
gitakichi 9:58f6248ef377 387 colour_a = COLORBAR_W;//W
gitakichi 9:58f6248ef377 388 colour_b = COLORBAR_B;//B
gitakichi 9:58f6248ef377 389 }
gitakichi 9:58f6248ef377 390 else if(page < 50){
gitakichi 9:58f6248ef377 391 colour_a = COLORBAR_Y;//Y
gitakichi 9:58f6248ef377 392 colour_b = COLORBAR_BK;//BK
gitakichi 9:58f6248ef377 393 }
gitakichi 9:58f6248ef377 394 else if(page < 72){
gitakichi 9:58f6248ef377 395 colour_a = COLORBAR_CY;//CY
gitakichi 9:58f6248ef377 396 colour_b = COLORBAR_MG;//MG
gitakichi 9:58f6248ef377 397 }
gitakichi 9:58f6248ef377 398 else if(page < 94){
gitakichi 9:58f6248ef377 399 colour_a = COLORBAR_G;//G
gitakichi 9:58f6248ef377 400 colour_b = COLORBAR_BK;//BK
gitakichi 9:58f6248ef377 401 }
gitakichi 9:58f6248ef377 402 else if(page < 116){
gitakichi 9:58f6248ef377 403 colour_a = COLORBAR_MG;//MG
gitakichi 9:58f6248ef377 404 colour_b = COLORBAR_CY;//CY
gitakichi 9:58f6248ef377 405 }
gitakichi 9:58f6248ef377 406 else if(page < 138){
gitakichi 9:58f6248ef377 407 colour_a = COLORBAR_R;//R
gitakichi 9:58f6248ef377 408 colour_b = COLORBAR_BK;//BK
gitakichi 9:58f6248ef377 409 }
gitakichi 9:58f6248ef377 410 else{
gitakichi 9:58f6248ef377 411 colour_a = COLORBAR_B;//B
gitakichi 9:58f6248ef377 412 colour_b = COLORBAR_W;//W
gitakichi 9:58f6248ef377 413 }
gitakichi 3:9caa79f40909 414
gitakichi 9:58f6248ef377 415 lcdWriteData_sameburst(colour_b,48);
gitakichi 9:58f6248ef377 416 lcdWriteData_sameburst(colour_a,80);
gitakichi 3:9caa79f40909 417 }
gitakichi 3:9caa79f40909 418 }
gitakichi 3:9caa79f40909 419
morita 0:c0be4e018a09 420 void lcdPlot(uint8_t x, uint8_t y, uint16_t colour)
morita 0:c0be4e018a09 421 {
morita 0:c0be4e018a09 422 // Horizontal Address Start Position
morita 0:c0be4e018a09 423 lcdWriteCommand(SET_COLUMN_ADDRESS);
morita 0:c0be4e018a09 424 lcdWriteParameter(0x00);
morita 0:c0be4e018a09 425 lcdWriteParameter(x);
morita 0:c0be4e018a09 426 lcdWriteParameter(0x00);
gitakichi 2:4d5b94a92f19 427 lcdWriteParameter(COL_MAX);
morita 0:c0be4e018a09 428
morita 0:c0be4e018a09 429 // Vertical Address end Position
morita 0:c0be4e018a09 430 lcdWriteCommand(SET_PAGE_ADDRESS);
morita 0:c0be4e018a09 431 lcdWriteParameter(0x00);
morita 0:c0be4e018a09 432 lcdWriteParameter(y);
morita 0:c0be4e018a09 433 lcdWriteParameter(0x00);
gitakichi 2:4d5b94a92f19 434 lcdWriteParameter(PAGE_MAX);
morita 0:c0be4e018a09 435
morita 0:c0be4e018a09 436 // Plot the point
morita 0:c0be4e018a09 437 lcdWriteCommand(WRITE_MEMORY_START);
morita 0:c0be4e018a09 438 lcdWriteData(colour >> 8, colour);
morita 0:c0be4e018a09 439 }
morita 0:c0be4e018a09 440
morita 0:c0be4e018a09 441 // Draw a line from x0, y0 to x1, y1
morita 0:c0be4e018a09 442 // Note: This is a version of Bresenham's line drawing algorithm
morita 0:c0be4e018a09 443 // It only draws lines from left to right!
morita 0:c0be4e018a09 444 void lcdLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t colour)
morita 0:c0be4e018a09 445 {
morita 0:c0be4e018a09 446 int16_t dy = y1 - y0;
morita 0:c0be4e018a09 447 int16_t dx = x1 - x0;
morita 0:c0be4e018a09 448 int16_t stepx, stepy;
morita 0:c0be4e018a09 449
morita 0:c0be4e018a09 450 if (dy < 0)
morita 0:c0be4e018a09 451 {
morita 0:c0be4e018a09 452 dy = -dy; stepy = -1;
morita 0:c0be4e018a09 453 }
morita 0:c0be4e018a09 454 else stepy = 1;
morita 0:c0be4e018a09 455
morita 0:c0be4e018a09 456 if (dx < 0)
morita 0:c0be4e018a09 457 {
morita 0:c0be4e018a09 458 dx = -dx; stepx = -1;
morita 0:c0be4e018a09 459 }
morita 0:c0be4e018a09 460 else stepx = 1;
morita 0:c0be4e018a09 461
morita 0:c0be4e018a09 462 dy <<= 1; // dy is now 2*dy
morita 0:c0be4e018a09 463 dx <<= 1; // dx is now 2*dx
morita 0:c0be4e018a09 464
morita 0:c0be4e018a09 465 lcdPlot(x0, y0, colour);
morita 0:c0be4e018a09 466
morita 0:c0be4e018a09 467 if (dx > dy) {
morita 0:c0be4e018a09 468 int fraction = dy - (dx >> 1); // same as 2*dy - dx
morita 0:c0be4e018a09 469 while (x0 != x1)
morita 0:c0be4e018a09 470 {
morita 0:c0be4e018a09 471 if (fraction >= 0)
morita 0:c0be4e018a09 472 {
morita 0:c0be4e018a09 473 y0 += stepy;
morita 0:c0be4e018a09 474 fraction -= dx; // same as fraction -= 2*dx
morita 0:c0be4e018a09 475 }
morita 0:c0be4e018a09 476
morita 0:c0be4e018a09 477 x0 += stepx;
morita 0:c0be4e018a09 478 fraction += dy; // same as fraction -= 2*dy
morita 0:c0be4e018a09 479 lcdPlot(x0, y0, colour);
morita 0:c0be4e018a09 480 }
morita 0:c0be4e018a09 481 }
morita 0:c0be4e018a09 482 else
morita 0:c0be4e018a09 483 {
morita 0:c0be4e018a09 484 int fraction = dx - (dy >> 1);
morita 0:c0be4e018a09 485 while (y0 != y1)
morita 0:c0be4e018a09 486 {
morita 0:c0be4e018a09 487 if (fraction >= 0)
morita 0:c0be4e018a09 488 {
morita 0:c0be4e018a09 489 x0 += stepx;
morita 0:c0be4e018a09 490 fraction -= dy;
morita 0:c0be4e018a09 491 }
morita 0:c0be4e018a09 492
morita 0:c0be4e018a09 493 y0 += stepy;
morita 0:c0be4e018a09 494 fraction += dx;
morita 0:c0be4e018a09 495 lcdPlot(x0, y0, colour);
morita 0:c0be4e018a09 496 }
morita 0:c0be4e018a09 497 }
morita 0:c0be4e018a09 498 }
morita 0:c0be4e018a09 499
morita 0:c0be4e018a09 500 // Draw a rectangle between x0, y0 and x1, y1
morita 0:c0be4e018a09 501 void lcdRectangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t colour)
morita 0:c0be4e018a09 502 {
morita 0:c0be4e018a09 503 lcdLine(x0, y0, x0, y1, colour);
morita 0:c0be4e018a09 504 lcdLine(x0, y1, x1, y1, colour);
morita 0:c0be4e018a09 505 lcdLine(x1, y0, x1, y1, colour);
morita 0:c0be4e018a09 506 lcdLine(x0, y0, x1, y0, colour);
morita 0:c0be4e018a09 507 }
morita 0:c0be4e018a09 508
morita 0:c0be4e018a09 509 // Draw a filled rectangle
morita 0:c0be4e018a09 510 // Note: y1 must be greater than y0 and x1 must be greater than x0
morita 0:c0be4e018a09 511 // for this to work
morita 0:c0be4e018a09 512 void lcdFilledRectangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t colour)
morita 0:c0be4e018a09 513 {
morita 0:c0be4e018a09 514 uint16_t pixels;
morita 0:c0be4e018a09 515
morita 0:c0be4e018a09 516 // To speed up plotting we define a x window with the width of the
morita 0:c0be4e018a09 517 // rectangle and then just output the required number of bytes to
morita 0:c0be4e018a09 518 // fill down to the end point
morita 0:c0be4e018a09 519
morita 0:c0be4e018a09 520 lcdWriteCommand(SET_COLUMN_ADDRESS); // Horizontal Address Start Position
morita 0:c0be4e018a09 521 lcdWriteParameter(0x00);
morita 0:c0be4e018a09 522 lcdWriteParameter(x0);
morita 0:c0be4e018a09 523 lcdWriteParameter(0x00);
morita 0:c0be4e018a09 524 lcdWriteParameter(x1);
morita 0:c0be4e018a09 525
morita 0:c0be4e018a09 526 lcdWriteCommand(SET_PAGE_ADDRESS); // Vertical Address end Position
morita 0:c0be4e018a09 527 lcdWriteParameter(0x00);
morita 0:c0be4e018a09 528 lcdWriteParameter(y0);
morita 0:c0be4e018a09 529 lcdWriteParameter(0x00);
gitakichi 2:4d5b94a92f19 530 lcdWriteParameter(PAGE_MAX);
morita 0:c0be4e018a09 531
morita 0:c0be4e018a09 532 lcdWriteCommand(WRITE_MEMORY_START);
morita 0:c0be4e018a09 533
morita 0:c0be4e018a09 534 for (pixels = 0; pixels < (((x1 - x0) + 1) * ((y1 - y0) + 1)); pixels++)
morita 0:c0be4e018a09 535 lcdWriteData(colour >> 8, colour);;
morita 0:c0be4e018a09 536 }
morita 0:c0be4e018a09 537
morita 0:c0be4e018a09 538 // Draw a circle
morita 0:c0be4e018a09 539 // Note: This is another version of Bresenham's line drawing algorithm.
morita 0:c0be4e018a09 540 // There's plenty of documentation on the web if you are curious
morita 0:c0be4e018a09 541 // how this works.
morita 0:c0be4e018a09 542 void lcdCircle(int16_t xCentre, int16_t yCentre, int16_t radius, uint16_t colour)
morita 0:c0be4e018a09 543 {
morita 0:c0be4e018a09 544 int16_t x = 0, y = radius;
morita 0:c0be4e018a09 545 int16_t d = 3 - (2 * radius);
morita 0:c0be4e018a09 546
morita 0:c0be4e018a09 547 while(x <= y)
morita 0:c0be4e018a09 548 {
morita 0:c0be4e018a09 549 lcdPlot(xCentre + x, yCentre + y, colour);
morita 0:c0be4e018a09 550 lcdPlot(xCentre + y, yCentre + x, colour);
morita 0:c0be4e018a09 551 lcdPlot(xCentre - x, yCentre + y, colour);
morita 0:c0be4e018a09 552 lcdPlot(xCentre + y, yCentre - x, colour);
morita 0:c0be4e018a09 553 lcdPlot(xCentre - x, yCentre - y, colour);
morita 0:c0be4e018a09 554 lcdPlot(xCentre - y, yCentre - x, colour);
morita 0:c0be4e018a09 555 lcdPlot(xCentre + x, yCentre - y, colour);
morita 0:c0be4e018a09 556 lcdPlot(xCentre - y, yCentre + x, colour);
morita 0:c0be4e018a09 557
morita 0:c0be4e018a09 558 if (d < 0) d += (4 * x) + 6;
morita 0:c0be4e018a09 559 else
morita 0:c0be4e018a09 560 {
morita 0:c0be4e018a09 561 d += (4 * (x - y)) + 10;
morita 0:c0be4e018a09 562 y -= 1;
morita 0:c0be4e018a09 563 }
morita 0:c0be4e018a09 564
morita 0:c0be4e018a09 565 x++;
morita 0:c0be4e018a09 566 }
morita 0:c0be4e018a09 567 }
morita 0:c0be4e018a09 568
morita 0:c0be4e018a09 569 // LCD text manipulation functions --------------------------------------------------------------------------
morita 0:c0be4e018a09 570
morita 0:c0be4e018a09 571 // Plot a character at the specified x, y co-ordinates (top left hand corner of character)
morita 0:c0be4e018a09 572 void lcdPutCh(unsigned char character, uint8_t x, uint8_t y, uint16_t fgColour, uint16_t bgColour)
morita 0:c0be4e018a09 573 {
morita 0:c0be4e018a09 574 uint8_t row, column;
morita 0:c0be4e018a09 575
morita 0:c0be4e018a09 576 // To speed up plotting we define a x window of 6 pixels and then
morita 0:c0be4e018a09 577 // write out one row at a time. This means the LCD will correctly
morita 0:c0be4e018a09 578 // update the memory pointer saving us a good few bytes
morita 0:c0be4e018a09 579
morita 0:c0be4e018a09 580 lcdWriteCommand(SET_COLUMN_ADDRESS); // Horizontal Address Start Position
morita 0:c0be4e018a09 581 lcdWriteParameter(0x00);
morita 0:c0be4e018a09 582 lcdWriteParameter(x);
morita 0:c0be4e018a09 583 lcdWriteParameter(0x00);
morita 0:c0be4e018a09 584 lcdWriteParameter(x+5);
morita 0:c0be4e018a09 585
morita 0:c0be4e018a09 586 lcdWriteCommand(SET_PAGE_ADDRESS); // Vertical Address end Position
morita 0:c0be4e018a09 587 lcdWriteParameter(0x00);
morita 0:c0be4e018a09 588 lcdWriteParameter(y);
morita 0:c0be4e018a09 589 lcdWriteParameter(0x00);
gitakichi 2:4d5b94a92f19 590 lcdWriteParameter(PAGE_MAX);
morita 0:c0be4e018a09 591
morita 0:c0be4e018a09 592 lcdWriteCommand(WRITE_MEMORY_START);
morita 0:c0be4e018a09 593
morita 0:c0be4e018a09 594 // Plot the font data
morita 0:c0be4e018a09 595 for (row = 0; row < 8; row++)
morita 0:c0be4e018a09 596 {
morita 0:c0be4e018a09 597 for (column = 0; column < 6; column++)
morita 0:c0be4e018a09 598 {
morita 0:c0be4e018a09 599 if ((font5x8[character][column]) & (1 << row))
morita 0:c0be4e018a09 600 lcdWriteData(fgColour >> 8, fgColour);
morita 0:c0be4e018a09 601 else lcdWriteData(bgColour >> 8, bgColour);
morita 0:c0be4e018a09 602 }
morita 0:c0be4e018a09 603 }
morita 0:c0be4e018a09 604 }
morita 0:c0be4e018a09 605
gitakichi 9:58f6248ef377 606 void lcdPutCh_16(uint16_t *font16x16_hex,uint8_t x, uint8_t y, uint16_t fgColour, uint16_t bgColour)
gitakichi 9:58f6248ef377 607 {
gitakichi 9:58f6248ef377 608 uint8_t row, column;
gitakichi 9:58f6248ef377 609 uint8_t size = 2;
gitakichi 9:58f6248ef377 610
gitakichi 9:58f6248ef377 611 //uint16_t font16x16_hex[]={
gitakichi 9:58f6248ef377 612 // 0x0000,0x7CF8,0x0488,0x0488,0x04F8,0x3C20,0x21FC,0x2124,
gitakichi 9:58f6248ef377 613 // 0x3D24,0x0524,0x05FC,0x0524,0x0422,0x043E,0x0BC1,0x3001
gitakichi 9:58f6248ef377 614 //};
gitakichi 9:58f6248ef377 615
gitakichi 9:58f6248ef377 616
gitakichi 9:58f6248ef377 617 lcdWriteCommand(SET_COLUMN_ADDRESS); // Horizontal Address Start Position
gitakichi 9:58f6248ef377 618 lcdWriteParameter(0x00);
gitakichi 9:58f6248ef377 619 lcdWriteParameter(x);
gitakichi 9:58f6248ef377 620 lcdWriteParameter(0x00);
gitakichi 9:58f6248ef377 621 lcdWriteParameter(x+(size*16)-1);
gitakichi 9:58f6248ef377 622
gitakichi 9:58f6248ef377 623 lcdWriteCommand(SET_PAGE_ADDRESS); // Vertical Address end Position
gitakichi 9:58f6248ef377 624 lcdWriteParameter(0x00);
gitakichi 9:58f6248ef377 625 lcdWriteParameter(y);
gitakichi 9:58f6248ef377 626 lcdWriteParameter(0x00);
gitakichi 9:58f6248ef377 627 lcdWriteParameter(PAGE_MAX);
gitakichi 9:58f6248ef377 628
gitakichi 9:58f6248ef377 629 lcdWriteCommand(WRITE_MEMORY_START);
gitakichi 9:58f6248ef377 630
gitakichi 9:58f6248ef377 631 // Plot the font data
gitakichi 9:58f6248ef377 632 for (row = 0; row < 16; row++)
gitakichi 9:58f6248ef377 633 {
gitakichi 9:58f6248ef377 634 for(int j=0;j<size;j++){
gitakichi 9:58f6248ef377 635 for (column = 0; column < 16; column++)
gitakichi 9:58f6248ef377 636 {
gitakichi 9:58f6248ef377 637 for(int i=0;i<size;i++){
gitakichi 9:58f6248ef377 638 if ((font16x16_hex[row]) & (0b1000000000000000 >> column))
gitakichi 9:58f6248ef377 639 lcdWriteData(fgColour >> 8, fgColour);
gitakichi 9:58f6248ef377 640 else lcdWriteData(bgColour >> 8, bgColour);
gitakichi 9:58f6248ef377 641 }
gitakichi 9:58f6248ef377 642 }
gitakichi 9:58f6248ef377 643 }
gitakichi 9:58f6248ef377 644 }
gitakichi 9:58f6248ef377 645 }
gitakichi 9:58f6248ef377 646
morita 0:c0be4e018a09 647 // Plot a string of characters to the LCD
morita 0:c0be4e018a09 648 void lcdPutS(const char *string, uint8_t x, uint8_t y, uint16_t fgColour, uint16_t bgColour)
morita 0:c0be4e018a09 649 {
morita 0:c0be4e018a09 650 uint8_t origin = x;
morita 0:c0be4e018a09 651
morita 0:c0be4e018a09 652 for (uint8_t characterNumber = 0; characterNumber < strlen(string); characterNumber++)
morita 0:c0be4e018a09 653 {
morita 0:c0be4e018a09 654 // Check if we are out of bounds and move to
morita 0:c0be4e018a09 655 // the next line if we are
morita 0:c0be4e018a09 656 if (x > 121)
morita 0:c0be4e018a09 657 {
morita 0:c0be4e018a09 658 x = origin;
morita 0:c0be4e018a09 659 y += 8;
morita 0:c0be4e018a09 660 }
morita 0:c0be4e018a09 661
morita 0:c0be4e018a09 662 // If we move past the bottom of the screen just exit
morita 0:c0be4e018a09 663 if (y > 120) break;
morita 0:c0be4e018a09 664
morita 0:c0be4e018a09 665 // Plot the current character
morita 0:c0be4e018a09 666 lcdPutCh(string[characterNumber], x, y, fgColour, bgColour);
morita 0:c0be4e018a09 667 x += 6;
morita 0:c0be4e018a09 668 }
morita 0:c0be4e018a09 669 }