Compatible with ATM0177B3A
秋月電子で販売されている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構成
- 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);
ili9163lcd.cpp@9:58f6248ef377, 2021-01-05 (annotated)
- 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?
User | Revision | Line number | New 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 | } |