Adafruit ssd1331 OLED 96x64 SPI model
Fork of OledLib by
spioled96x64.cpp@0:94eac1a165ab, 2011-01-11 (annotated)
- Committer:
- TETSUYA
- Date:
- Tue Jan 11 07:29:40 2011 +0000
- Revision:
- 0:94eac1a165ab
- Child:
- 2:e331851128c1
OLED Control Lib ver1.00
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
TETSUYA | 0:94eac1a165ab | 1 | // ALO-095BWNN-J9 test program |
TETSUYA | 0:94eac1a165ab | 2 | // See also "http://www.aitendo.co.jp/product/2099" |
TETSUYA | 0:94eac1a165ab | 3 | |
TETSUYA | 0:94eac1a165ab | 4 | |
TETSUYA | 0:94eac1a165ab | 5 | #include "mbed.h" |
TETSUYA | 0:94eac1a165ab | 6 | #include "spioled96x64.h" |
TETSUYA | 0:94eac1a165ab | 7 | |
TETSUYA | 0:94eac1a165ab | 8 | //Serial pc(USBTX, USBRX); |
TETSUYA | 0:94eac1a165ab | 9 | #define countof(x) ( sizeof(x) / sizeof(x[0]) ) |
TETSUYA | 0:94eac1a165ab | 10 | |
TETSUYA | 0:94eac1a165ab | 11 | |
TETSUYA | 0:94eac1a165ab | 12 | // コンストラクタ |
TETSUYA | 0:94eac1a165ab | 13 | SPIOLED96x64::SPIOLED96x64(PinName cs_pin, PinName rst_pin, PinName a0_pin, PinName mosi_pin, PinName miso_pin, PinName sclk_pin) |
TETSUYA | 0:94eac1a165ab | 14 | : CS(cs_pin), RES(rst_pin), DC(a0_pin), spi(mosi_pin, miso_pin, sclk_pin) |
TETSUYA | 0:94eac1a165ab | 15 | { |
TETSUYA | 0:94eac1a165ab | 16 | Init(); |
TETSUYA | 0:94eac1a165ab | 17 | } |
TETSUYA | 0:94eac1a165ab | 18 | |
TETSUYA | 0:94eac1a165ab | 19 | // イニシャライザ |
TETSUYA | 0:94eac1a165ab | 20 | void SPIOLED96x64::Init(void) |
TETSUYA | 0:94eac1a165ab | 21 | { |
TETSUYA | 0:94eac1a165ab | 22 | |
TETSUYA | 0:94eac1a165ab | 23 | spi.format(8,3); //8bit frame and POL=1 /PHA=1(UpEdge Sampled) |
TETSUYA | 0:94eac1a165ab | 24 | spi.frequency(25000000); // modify later |
TETSUYA | 0:94eac1a165ab | 25 | |
TETSUYA | 0:94eac1a165ab | 26 | // reset |
TETSUYA | 0:94eac1a165ab | 27 | wait_ms(200); |
TETSUYA | 0:94eac1a165ab | 28 | RES = 0; //Reset active |
TETSUYA | 0:94eac1a165ab | 29 | wait_ms(200); |
TETSUYA | 0:94eac1a165ab | 30 | RES = 1; |
TETSUYA | 0:94eac1a165ab | 31 | |
TETSUYA | 0:94eac1a165ab | 32 | |
TETSUYA | 0:94eac1a165ab | 33 | // initialize sequence |
TETSUYA | 0:94eac1a165ab | 34 | RegWrite(0xae); //OLED display OFF |
TETSUYA | 0:94eac1a165ab | 35 | |
TETSUYA | 0:94eac1a165ab | 36 | //Row Address |
TETSUYA | 0:94eac1a165ab | 37 | RegWrite(0x75); /* Set Row Address */ |
TETSUYA | 0:94eac1a165ab | 38 | RegWrite(0x00); /* Start = 0 */ |
TETSUYA | 0:94eac1a165ab | 39 | RegWrite(0x3f); /* End = 63 */ |
TETSUYA | 0:94eac1a165ab | 40 | RegWrite(0x15); /* Set Column Address */ |
TETSUYA | 0:94eac1a165ab | 41 | RegWrite(0x00); /* Start = 0 */ |
TETSUYA | 0:94eac1a165ab | 42 | RegWrite(0x5F); /* End = 95 */ |
TETSUYA | 0:94eac1a165ab | 43 | |
TETSUYA | 0:94eac1a165ab | 44 | //Contrast |
TETSUYA | 0:94eac1a165ab | 45 | RegWrite(0xa0); //Set remap & data format 0111 0000 |
TETSUYA | 0:94eac1a165ab | 46 | RegWrite(0x74); // 65k Color/8bit buswidth/format1 |
TETSUYA | 0:94eac1a165ab | 47 | RegWrite(0xa1); //set display start row RAM |
TETSUYA | 0:94eac1a165ab | 48 | RegWrite(0x00); |
TETSUYA | 0:94eac1a165ab | 49 | RegWrite(0xa2); //set dispaly offset |
TETSUYA | 0:94eac1a165ab | 50 | RegWrite(0x00); |
TETSUYA | 0:94eac1a165ab | 51 | RegWrite(0xa4); //Set Display Mode |
TETSUYA | 0:94eac1a165ab | 52 | RegWrite(0xa8); //Set Multiplex Ratio |
TETSUYA | 0:94eac1a165ab | 53 | RegWrite(0x3f); |
TETSUYA | 0:94eac1a165ab | 54 | RegWrite(0xad); //Set Master Configuration |
TETSUYA | 0:94eac1a165ab | 55 | RegWrite(0x8f); //(External VCC Supply Selected) |
TETSUYA | 0:94eac1a165ab | 56 | RegWrite(0xB0); //Set Power Saving Mode |
TETSUYA | 0:94eac1a165ab | 57 | RegWrite(0x1a); |
TETSUYA | 0:94eac1a165ab | 58 | RegWrite(0xB1); //Set Phase 1 & 2 Period Adjustment |
TETSUYA | 0:94eac1a165ab | 59 | RegWrite(0x74); |
TETSUYA | 0:94eac1a165ab | 60 | RegWrite(0xb3); //Set Display Clock Divide Ratio / Oscillator Frequency |
TETSUYA | 0:94eac1a165ab | 61 | RegWrite(0xd0); |
TETSUYA | 0:94eac1a165ab | 62 | RegWrite(0x8A); //Set Second Pre-charge Speed of Color A |
TETSUYA | 0:94eac1a165ab | 63 | RegWrite(0x81); |
TETSUYA | 0:94eac1a165ab | 64 | RegWrite(0x8B); //Set Second Pre-charge Speed of Color B |
TETSUYA | 0:94eac1a165ab | 65 | RegWrite(0x82); |
TETSUYA | 0:94eac1a165ab | 66 | RegWrite(0x8C); //Set Second Pre-charge Speed of Color C |
TETSUYA | 0:94eac1a165ab | 67 | RegWrite(0x83); |
TETSUYA | 0:94eac1a165ab | 68 | RegWrite(0xBB); //Set Pre-charge Level |
TETSUYA | 0:94eac1a165ab | 69 | RegWrite(0x3e); |
TETSUYA | 0:94eac1a165ab | 70 | RegWrite(0xBE); //Set VCOMH |
TETSUYA | 0:94eac1a165ab | 71 | RegWrite(0x3e); |
TETSUYA | 0:94eac1a165ab | 72 | RegWrite(0x87); //Set Master Current Control |
TETSUYA | 0:94eac1a165ab | 73 | RegWrite(0x0f); |
TETSUYA | 0:94eac1a165ab | 74 | RegWrite(0x81); //Set Contrast Control for Color gAh |
TETSUYA | 0:94eac1a165ab | 75 | RegWrite(0x80); |
TETSUYA | 0:94eac1a165ab | 76 | RegWrite(0x82); //Set Contrast Control for Color gBh |
TETSUYA | 0:94eac1a165ab | 77 | RegWrite(0x80); |
TETSUYA | 0:94eac1a165ab | 78 | RegWrite(0x83); //Set Contrast Control for Color gCh |
TETSUYA | 0:94eac1a165ab | 79 | RegWrite(0x80); |
TETSUYA | 0:94eac1a165ab | 80 | RegWrite(0xaf); //display ON |
TETSUYA | 0:94eac1a165ab | 81 | |
TETSUYA | 0:94eac1a165ab | 82 | x_locate = 0; |
TETSUYA | 0:94eac1a165ab | 83 | y_locate = 0; |
TETSUYA | 0:94eac1a165ab | 84 | chr_size = CS_NORMAL; |
TETSUYA | 0:94eac1a165ab | 85 | Fill_Screen(0); |
TETSUYA | 0:94eac1a165ab | 86 | } |
TETSUYA | 0:94eac1a165ab | 87 | |
TETSUYA | 0:94eac1a165ab | 88 | // レジスタライト |
TETSUYA | 0:94eac1a165ab | 89 | void SPIOLED96x64::RegWrite(unsigned char Command) |
TETSUYA | 0:94eac1a165ab | 90 | { |
TETSUYA | 0:94eac1a165ab | 91 | DC = 0; // Command |
TETSUYA | 0:94eac1a165ab | 92 | CS = 0; // CS active(toggle OLED) |
TETSUYA | 0:94eac1a165ab | 93 | spi.write(Command); |
TETSUYA | 0:94eac1a165ab | 94 | CS = 1; |
TETSUYA | 0:94eac1a165ab | 95 | } |
TETSUYA | 0:94eac1a165ab | 96 | |
TETSUYA | 0:94eac1a165ab | 97 | |
TETSUYA | 0:94eac1a165ab | 98 | // データライト |
TETSUYA | 0:94eac1a165ab | 99 | void SPIOLED96x64::DataWrite(unsigned char c) |
TETSUYA | 0:94eac1a165ab | 100 | { |
TETSUYA | 0:94eac1a165ab | 101 | DC = 1; // DATA |
TETSUYA | 0:94eac1a165ab | 102 | CS = 0; // CS active(toggle OLED) |
TETSUYA | 0:94eac1a165ab | 103 | spi.write(c); |
TETSUYA | 0:94eac1a165ab | 104 | CS = 1; |
TETSUYA | 0:94eac1a165ab | 105 | } |
TETSUYA | 0:94eac1a165ab | 106 | |
TETSUYA | 0:94eac1a165ab | 107 | // 16ビット書き込み |
TETSUYA | 0:94eac1a165ab | 108 | void SPIOLED96x64::DataWrite_to(unsigned int Dat) |
TETSUYA | 0:94eac1a165ab | 109 | { |
TETSUYA | 0:94eac1a165ab | 110 | DataWrite((unsigned char)((Dat >> 8)& 0x00ff)); |
TETSUYA | 0:94eac1a165ab | 111 | DataWrite((unsigned char)(Dat & 0x00ff)); |
TETSUYA | 0:94eac1a165ab | 112 | } |
TETSUYA | 0:94eac1a165ab | 113 | |
TETSUYA | 0:94eac1a165ab | 114 | |
TETSUYA | 0:94eac1a165ab | 115 | |
TETSUYA | 0:94eac1a165ab | 116 | // 指定座標に指定色でドット描画 |
TETSUYA | 0:94eac1a165ab | 117 | void SPIOLED96x64::Draw_Dot(int x,int y,unsigned int Color) |
TETSUYA | 0:94eac1a165ab | 118 | { |
TETSUYA | 0:94eac1a165ab | 119 | if ( (x<0)||( x > Dis_X_MAX ) |
TETSUYA | 0:94eac1a165ab | 120 | ||(y<0)||( y > Dis_Y_MAX ) ) return ; |
TETSUYA | 0:94eac1a165ab | 121 | |
TETSUYA | 0:94eac1a165ab | 122 | RegWrite(0x15); |
TETSUYA | 0:94eac1a165ab | 123 | RegWrite((unsigned char)x); // Column Start Address |
TETSUYA | 0:94eac1a165ab | 124 | RegWrite((unsigned char)x); // Column End Address |
TETSUYA | 0:94eac1a165ab | 125 | RegWrite(0x75); |
TETSUYA | 0:94eac1a165ab | 126 | RegWrite((unsigned char)y); // Row Start Address |
TETSUYA | 0:94eac1a165ab | 127 | RegWrite((unsigned char)y); // Row End Address |
TETSUYA | 0:94eac1a165ab | 128 | DataWrite_to(Color); |
TETSUYA | 0:94eac1a165ab | 129 | DataWrite_to(Color); |
TETSUYA | 0:94eac1a165ab | 130 | } |
TETSUYA | 0:94eac1a165ab | 131 | |
TETSUYA | 0:94eac1a165ab | 132 | |
TETSUYA | 0:94eac1a165ab | 133 | |
TETSUYA | 0:94eac1a165ab | 134 | void SPIOLED96x64::ChangeFontColor(unsigned int color) |
TETSUYA | 0:94eac1a165ab | 135 | { |
TETSUYA | 0:94eac1a165ab | 136 | Char_Color = color; |
TETSUYA | 0:94eac1a165ab | 137 | } |
TETSUYA | 0:94eac1a165ab | 138 | void SPIOLED96x64::ChangeBGColor(unsigned int color) |
TETSUYA | 0:94eac1a165ab | 139 | { |
TETSUYA | 0:94eac1a165ab | 140 | BGround_Color = color; |
TETSUYA | 0:94eac1a165ab | 141 | } |
TETSUYA | 0:94eac1a165ab | 142 | |
TETSUYA | 0:94eac1a165ab | 143 | |
TETSUYA | 0:94eac1a165ab | 144 | // CS_NORMAL/CS_WIDE/CS_HIGH/CS_WH |
TETSUYA | 0:94eac1a165ab | 145 | void SPIOLED96x64::SetFontSize(int Csize) |
TETSUYA | 0:94eac1a165ab | 146 | { |
TETSUYA | 0:94eac1a165ab | 147 | chr_size = Csize; |
TETSUYA | 0:94eac1a165ab | 148 | } |
TETSUYA | 0:94eac1a165ab | 149 | // 縦横の倍率変化量を返す |
TETSUYA | 0:94eac1a165ab | 150 | void SPIOLED96x64::CS_Conv(int *lpx,int *lpy) |
TETSUYA | 0:94eac1a165ab | 151 | { |
TETSUYA | 0:94eac1a165ab | 152 | switch( chr_size ){ |
TETSUYA | 0:94eac1a165ab | 153 | case CS_WIDE: |
TETSUYA | 0:94eac1a165ab | 154 | *lpx=2; |
TETSUYA | 0:94eac1a165ab | 155 | *lpy=1; |
TETSUYA | 0:94eac1a165ab | 156 | break; |
TETSUYA | 0:94eac1a165ab | 157 | case CS_HIGH: |
TETSUYA | 0:94eac1a165ab | 158 | *lpx=1; |
TETSUYA | 0:94eac1a165ab | 159 | *lpy=2; |
TETSUYA | 0:94eac1a165ab | 160 | break; |
TETSUYA | 0:94eac1a165ab | 161 | case CS_WH : |
TETSUYA | 0:94eac1a165ab | 162 | *lpx=2; |
TETSUYA | 0:94eac1a165ab | 163 | *lpy=2; |
TETSUYA | 0:94eac1a165ab | 164 | break; |
TETSUYA | 0:94eac1a165ab | 165 | case CS_WHx36 : |
TETSUYA | 0:94eac1a165ab | 166 | *lpx=6; |
TETSUYA | 0:94eac1a165ab | 167 | *lpy=6; |
TETSUYA | 0:94eac1a165ab | 168 | break; |
TETSUYA | 0:94eac1a165ab | 169 | case CS_NORMAL: |
TETSUYA | 0:94eac1a165ab | 170 | default: |
TETSUYA | 0:94eac1a165ab | 171 | *lpx=1; |
TETSUYA | 0:94eac1a165ab | 172 | *lpy=1; |
TETSUYA | 0:94eac1a165ab | 173 | break; |
TETSUYA | 0:94eac1a165ab | 174 | } |
TETSUYA | 0:94eac1a165ab | 175 | |
TETSUYA | 0:94eac1a165ab | 176 | } |
TETSUYA | 0:94eac1a165ab | 177 | |
TETSUYA | 0:94eac1a165ab | 178 | // 全角キャラクタの描画処理 |
TETSUYA | 0:94eac1a165ab | 179 | // アスキーキャラクタの位置指定表示(5x7dotフォント) |
TETSUYA | 0:94eac1a165ab | 180 | // フォントの特性上、最上位ビットから順に↑方向に記述される |
TETSUYA | 0:94eac1a165ab | 181 | void SPIOLED96x64::PutChar(int x,int y,unsigned int a) |
TETSUYA | 0:94eac1a165ab | 182 | { |
TETSUYA | 0:94eac1a165ab | 183 | int i,j; |
TETSUYA | 0:94eac1a165ab | 184 | unsigned char Temp=0; |
TETSUYA | 0:94eac1a165ab | 185 | int lpx, lpy, k,l; |
TETSUYA | 0:94eac1a165ab | 186 | int xw; |
TETSUYA | 0:94eac1a165ab | 187 | j = 0; |
TETSUYA | 0:94eac1a165ab | 188 | i = 0; |
TETSUYA | 0:94eac1a165ab | 189 | |
TETSUYA | 0:94eac1a165ab | 190 | CS_Conv(&lpx, &lpy); |
TETSUYA | 0:94eac1a165ab | 191 | if ( a < 0x80 ) { xw = 5; if(a < 32)a=32; } // ASCII |
TETSUYA | 0:94eac1a165ab | 192 | else xw = X_Witch; // Kanji |
TETSUYA | 0:94eac1a165ab | 193 | |
TETSUYA | 0:94eac1a165ab | 194 | for(i=0; i<xw; i++){ |
TETSUYA | 0:94eac1a165ab | 195 | for ( l=0;l<lpx;l++){ |
TETSUYA | 0:94eac1a165ab | 196 | if ( a < 0x80 ) Temp = FontLookup_ABC[a-32][i]; // ASCII |
TETSUYA | 0:94eac1a165ab | 197 | else Temp = FontLookup[a][i]; // Kanji |
TETSUYA | 0:94eac1a165ab | 198 | |
TETSUYA | 0:94eac1a165ab | 199 | for(j=Y_Witch;j!=0;j--){ |
TETSUYA | 0:94eac1a165ab | 200 | for ( k=0;k<lpy;k++){ |
TETSUYA | 0:94eac1a165ab | 201 | if((Temp & 0x80)==0x80){ |
TETSUYA | 0:94eac1a165ab | 202 | Draw_Dot(x+(i*lpx)+l,y+(j*lpy)-k,Char_Color); |
TETSUYA | 0:94eac1a165ab | 203 | }else{ |
TETSUYA | 0:94eac1a165ab | 204 | Draw_Dot(x+(i*lpx)+l,y+(j*lpy)-k,BGround_Color); |
TETSUYA | 0:94eac1a165ab | 205 | } |
TETSUYA | 0:94eac1a165ab | 206 | } |
TETSUYA | 0:94eac1a165ab | 207 | Temp = Temp << 1; |
TETSUYA | 0:94eac1a165ab | 208 | } |
TETSUYA | 0:94eac1a165ab | 209 | } |
TETSUYA | 0:94eac1a165ab | 210 | } |
TETSUYA | 0:94eac1a165ab | 211 | } |
TETSUYA | 0:94eac1a165ab | 212 | |
TETSUYA | 0:94eac1a165ab | 213 | |
TETSUYA | 0:94eac1a165ab | 214 | // 純粋仮想関数でputcを実現 |
TETSUYA | 0:94eac1a165ab | 215 | int SPIOLED96x64::_putc( int c ) |
TETSUYA | 0:94eac1a165ab | 216 | { |
TETSUYA | 0:94eac1a165ab | 217 | static bool kstate = false; |
TETSUYA | 0:94eac1a165ab | 218 | static unsigned int kbuf = 0; |
TETSUYA | 0:94eac1a165ab | 219 | unsigned int p; |
TETSUYA | 0:94eac1a165ab | 220 | int lpx, lpy, w; |
TETSUYA | 0:94eac1a165ab | 221 | |
TETSUYA | 0:94eac1a165ab | 222 | if(!kstate && ((0x81 <= c && c <= 0x9f) || (0xe0 <= c && c <= 0xfc))){ |
TETSUYA | 0:94eac1a165ab | 223 | kstate = true; |
TETSUYA | 0:94eac1a165ab | 224 | kbuf = c; |
TETSUYA | 0:94eac1a165ab | 225 | return c; |
TETSUYA | 0:94eac1a165ab | 226 | } |
TETSUYA | 0:94eac1a165ab | 227 | |
TETSUYA | 0:94eac1a165ab | 228 | if(kstate){ // 2nd byte of shift-jis |
TETSUYA | 0:94eac1a165ab | 229 | kstate = false; |
TETSUYA | 0:94eac1a165ab | 230 | p = findface(kbuf << 8 | c); |
TETSUYA | 0:94eac1a165ab | 231 | w = X_Witch; |
TETSUYA | 0:94eac1a165ab | 232 | } else { |
TETSUYA | 0:94eac1a165ab | 233 | p = c; |
TETSUYA | 0:94eac1a165ab | 234 | w = 6; // 半角は近接するので、1ドットあける |
TETSUYA | 0:94eac1a165ab | 235 | } |
TETSUYA | 0:94eac1a165ab | 236 | PutChar( x_locate , y_locate ,p); |
TETSUYA | 0:94eac1a165ab | 237 | CS_Conv(&lpx, &lpy); |
TETSUYA | 0:94eac1a165ab | 238 | x_locate += (w*lpx); |
TETSUYA | 0:94eac1a165ab | 239 | |
TETSUYA | 0:94eac1a165ab | 240 | |
TETSUYA | 0:94eac1a165ab | 241 | /* |
TETSUYA | 0:94eac1a165ab | 242 | if(kstate== false){ |
TETSUYA | 0:94eac1a165ab | 243 | //画面右端でのクリッピング |
TETSUYA | 0:94eac1a165ab | 244 | if(x_locate + (xsize - 1) >= Dis_X_MAX){ |
TETSUYA | 0:94eac1a165ab | 245 | x_locate = 0; |
TETSUYA | 0:94eac1a165ab | 246 | y_locate += Y_Witch; |
TETSUYA | 0:94eac1a165ab | 247 | if(y_locate >= Dis_Y_MAX) y_locate=0; |
TETSUYA | 0:94eac1a165ab | 248 | } |
TETSUYA | 0:94eac1a165ab | 249 | } |
TETSUYA | 0:94eac1a165ab | 250 | */ |
TETSUYA | 0:94eac1a165ab | 251 | return c; |
TETSUYA | 0:94eac1a165ab | 252 | } |
TETSUYA | 0:94eac1a165ab | 253 | |
TETSUYA | 0:94eac1a165ab | 254 | int SPIOLED96x64::_getc() |
TETSUYA | 0:94eac1a165ab | 255 | { |
TETSUYA | 0:94eac1a165ab | 256 | return -1; |
TETSUYA | 0:94eac1a165ab | 257 | } |
TETSUYA | 0:94eac1a165ab | 258 | void SPIOLED96x64::puts( char *s ) |
TETSUYA | 0:94eac1a165ab | 259 | { |
TETSUYA | 0:94eac1a165ab | 260 | unsigned char c; |
TETSUYA | 0:94eac1a165ab | 261 | while((c = *s++) != '\0') putc((int)c & 0xff); |
TETSUYA | 0:94eac1a165ab | 262 | } |
TETSUYA | 0:94eac1a165ab | 263 | |
TETSUYA | 0:94eac1a165ab | 264 | |
TETSUYA | 0:94eac1a165ab | 265 | |
TETSUYA | 0:94eac1a165ab | 266 | void SPIOLED96x64::locate(int column, int row) |
TETSUYA | 0:94eac1a165ab | 267 | { |
TETSUYA | 0:94eac1a165ab | 268 | x_locate = column; |
TETSUYA | 0:94eac1a165ab | 269 | y_locate = row; |
TETSUYA | 0:94eac1a165ab | 270 | } |
TETSUYA | 0:94eac1a165ab | 271 | |
TETSUYA | 0:94eac1a165ab | 272 | int SPIOLED96x64::row() |
TETSUYA | 0:94eac1a165ab | 273 | { |
TETSUYA | 0:94eac1a165ab | 274 | return y_locate; |
TETSUYA | 0:94eac1a165ab | 275 | } |
TETSUYA | 0:94eac1a165ab | 276 | int SPIOLED96x64::column() |
TETSUYA | 0:94eac1a165ab | 277 | { |
TETSUYA | 0:94eac1a165ab | 278 | return x_locate; |
TETSUYA | 0:94eac1a165ab | 279 | } |
TETSUYA | 0:94eac1a165ab | 280 | |
TETSUYA | 0:94eac1a165ab | 281 | // SJIS漢字コードテーブルから指定の配列アドレスを算出する |
TETSUYA | 0:94eac1a165ab | 282 | unsigned int SPIOLED96x64::findface(unsigned short c) |
TETSUYA | 0:94eac1a165ab | 283 | { |
TETSUYA | 0:94eac1a165ab | 284 | unsigned int p = 0; |
TETSUYA | 0:94eac1a165ab | 285 | int i, sum; |
TETSUYA | 0:94eac1a165ab | 286 | for(sum = i = 0; i < countof(font8table); i++){ |
TETSUYA | 0:94eac1a165ab | 287 | if(font8table[i].start <= c && c <= font8table[i].end){ |
TETSUYA | 0:94eac1a165ab | 288 | p = (sum + c - font8table[i].start); |
TETSUYA | 0:94eac1a165ab | 289 | break; |
TETSUYA | 0:94eac1a165ab | 290 | } |
TETSUYA | 0:94eac1a165ab | 291 | sum += font8table[i].end - font8table[i].start + 1; |
TETSUYA | 0:94eac1a165ab | 292 | } |
TETSUYA | 0:94eac1a165ab | 293 | return p; |
TETSUYA | 0:94eac1a165ab | 294 | } |
TETSUYA | 0:94eac1a165ab | 295 | |
TETSUYA | 0:94eac1a165ab | 296 | // RGB(555)をRGB565値に変換 |
TETSUYA | 0:94eac1a165ab | 297 | // 00~1F(0~31) |
TETSUYA | 0:94eac1a165ab | 298 | unsigned int SPIOLED96x64::ColorConv(unsigned int R,unsigned int G,unsigned int B) |
TETSUYA | 0:94eac1a165ab | 299 | { |
TETSUYA | 0:94eac1a165ab | 300 | unsigned int ret = 0; |
TETSUYA | 0:94eac1a165ab | 301 | unsigned int rv, gv, bv; |
TETSUYA | 0:94eac1a165ab | 302 | |
TETSUYA | 0:94eac1a165ab | 303 | if ( R > 0x1f ) rv= 0x1f; |
TETSUYA | 0:94eac1a165ab | 304 | else rv= (unsigned int)( R & 0x1F ); |
TETSUYA | 0:94eac1a165ab | 305 | if ( G > 0x1f ) gv= 0x3f; |
TETSUYA | 0:94eac1a165ab | 306 | else gv= (unsigned int)( (G<<1) & 0x3F ); |
TETSUYA | 0:94eac1a165ab | 307 | if ( B > 0x1f ) bv= 0x1f; |
TETSUYA | 0:94eac1a165ab | 308 | else bv= (unsigned int)( B & 0x1F ); |
TETSUYA | 0:94eac1a165ab | 309 | |
TETSUYA | 0:94eac1a165ab | 310 | ret = (bv << 11) + (gv << 5) + rv; |
TETSUYA | 0:94eac1a165ab | 311 | return ret; |
TETSUYA | 0:94eac1a165ab | 312 | } |
TETSUYA | 0:94eac1a165ab | 313 | // 画面の指定色塗りつぶし指定領域し |
TETSUYA | 0:94eac1a165ab | 314 | void SPIOLED96x64::Box(int x1,int y1, int x2, int y2, unsigned int Color, int fill) |
TETSUYA | 0:94eac1a165ab | 315 | { |
TETSUYA | 0:94eac1a165ab | 316 | unsigned char i,j; |
TETSUYA | 0:94eac1a165ab | 317 | |
TETSUYA | 0:94eac1a165ab | 318 | switch( fill ) { |
TETSUYA | 0:94eac1a165ab | 319 | case 0: // box |
TETSUYA | 0:94eac1a165ab | 320 | line( x1, y1, x2, y1, Color, 0 ); |
TETSUYA | 0:94eac1a165ab | 321 | line( x2, y1, x2, y2, Color, 0 ); |
TETSUYA | 0:94eac1a165ab | 322 | line( x2, y2, x1, y2, Color, 0 ); |
TETSUYA | 0:94eac1a165ab | 323 | line( x1, y2, x1, y1, Color, 0 ); |
TETSUYA | 0:94eac1a165ab | 324 | break; |
TETSUYA | 0:94eac1a165ab | 325 | default: // fill |
TETSUYA | 0:94eac1a165ab | 326 | for(i=y1;i<=y2;i++) |
TETSUYA | 0:94eac1a165ab | 327 | { |
TETSUYA | 0:94eac1a165ab | 328 | for(j=x1;j<=x2;j++) |
TETSUYA | 0:94eac1a165ab | 329 | { |
TETSUYA | 0:94eac1a165ab | 330 | Draw_Dot(j,i,Color); |
TETSUYA | 0:94eac1a165ab | 331 | // DataWrite_to(Dot); |
TETSUYA | 0:94eac1a165ab | 332 | } |
TETSUYA | 0:94eac1a165ab | 333 | } |
TETSUYA | 0:94eac1a165ab | 334 | break; |
TETSUYA | 0:94eac1a165ab | 335 | } |
TETSUYA | 0:94eac1a165ab | 336 | } |
TETSUYA | 0:94eac1a165ab | 337 | |
TETSUYA | 0:94eac1a165ab | 338 | // 画面の指定色塗りつぶし |
TETSUYA | 0:94eac1a165ab | 339 | void SPIOLED96x64::Fill_Screen(unsigned int Color) |
TETSUYA | 0:94eac1a165ab | 340 | { |
TETSUYA | 0:94eac1a165ab | 341 | BGround_Color = Color; |
TETSUYA | 0:94eac1a165ab | 342 | Box( 0,0, Dis_X_MAX, Dis_Y_MAX , Color , 1); |
TETSUYA | 0:94eac1a165ab | 343 | } |
TETSUYA | 0:94eac1a165ab | 344 | |
TETSUYA | 0:94eac1a165ab | 345 | // Bresenhamの線分発生アルゴリズム |
TETSUYA | 0:94eac1a165ab | 346 | // 整数のみによる線分描画 |
TETSUYA | 0:94eac1a165ab | 347 | // (x0,y0)-(x1,y1)へのライン描画 参照:http //www2.starcat.ne.jp/~fussy/algo/algo1-1.htm |
TETSUYA | 0:94eac1a165ab | 348 | // pat : 0:実線 1:破線 |
TETSUYA | 0:94eac1a165ab | 349 | void SPIOLED96x64::line( int x0, int y0, int x1, int y1, unsigned int fore_col ,int pat ) |
TETSUYA | 0:94eac1a165ab | 350 | { |
TETSUYA | 0:94eac1a165ab | 351 | int E,x,y; |
TETSUYA | 0:94eac1a165ab | 352 | int dx,dy,sx,sy,i; |
TETSUYA | 0:94eac1a165ab | 353 | int cl=1 ; |
TETSUYA | 0:94eac1a165ab | 354 | int clc=0; // 破線用のカウンタ |
TETSUYA | 0:94eac1a165ab | 355 | |
TETSUYA | 0:94eac1a165ab | 356 | sx = ( x1 > x0 ) ? 1 : -1; // xの移動方向 |
TETSUYA | 0:94eac1a165ab | 357 | dx = ( x1 > x0 ) ? x1 - x0 : x0 - x1; // xの移動量 |
TETSUYA | 0:94eac1a165ab | 358 | sy = ( y1 > y0 ) ? 1 : -1; // yの移動方向 |
TETSUYA | 0:94eac1a165ab | 359 | dy = ( y1 > y0 ) ? y1 - y0 : y0 - y1; // yの移動量 |
TETSUYA | 0:94eac1a165ab | 360 | |
TETSUYA | 0:94eac1a165ab | 361 | x = x0; |
TETSUYA | 0:94eac1a165ab | 362 | y = y0; |
TETSUYA | 0:94eac1a165ab | 363 | |
TETSUYA | 0:94eac1a165ab | 364 | if( dx >= dy ) { |
TETSUYA | 0:94eac1a165ab | 365 | /* 傾きが1以下の場合 */ |
TETSUYA | 0:94eac1a165ab | 366 | E = -dx; |
TETSUYA | 0:94eac1a165ab | 367 | for( i = 0; i <= dx; i++ ) { |
TETSUYA | 0:94eac1a165ab | 368 | switch( pat ) { |
TETSUYA | 0:94eac1a165ab | 369 | case 0: // 実線 |
TETSUYA | 0:94eac1a165ab | 370 | cl = fore_col; |
TETSUYA | 0:94eac1a165ab | 371 | break; |
TETSUYA | 0:94eac1a165ab | 372 | default: // 破線 |
TETSUYA | 0:94eac1a165ab | 373 | if ( clc>=3 ) { |
TETSUYA | 0:94eac1a165ab | 374 | if ( cl==fore_col ) cl=BGround_Color; |
TETSUYA | 0:94eac1a165ab | 375 | else cl=fore_col; |
TETSUYA | 0:94eac1a165ab | 376 | clc=0; |
TETSUYA | 0:94eac1a165ab | 377 | }else{ |
TETSUYA | 0:94eac1a165ab | 378 | clc++; |
TETSUYA | 0:94eac1a165ab | 379 | } |
TETSUYA | 0:94eac1a165ab | 380 | break; |
TETSUYA | 0:94eac1a165ab | 381 | } |
TETSUYA | 0:94eac1a165ab | 382 | |
TETSUYA | 0:94eac1a165ab | 383 | Draw_Dot(x,y,cl); |
TETSUYA | 0:94eac1a165ab | 384 | x += sx; |
TETSUYA | 0:94eac1a165ab | 385 | E += 2 * dy; |
TETSUYA | 0:94eac1a165ab | 386 | if( E >= 0 ) { |
TETSUYA | 0:94eac1a165ab | 387 | y += sy; |
TETSUYA | 0:94eac1a165ab | 388 | E -= 2 * dx; |
TETSUYA | 0:94eac1a165ab | 389 | } |
TETSUYA | 0:94eac1a165ab | 390 | } |
TETSUYA | 0:94eac1a165ab | 391 | }else{ |
TETSUYA | 0:94eac1a165ab | 392 | /* 傾きが1より大きい場合 */ |
TETSUYA | 0:94eac1a165ab | 393 | E = -dy; |
TETSUYA | 0:94eac1a165ab | 394 | for( i = 0; i <= dy; i++ ) { |
TETSUYA | 0:94eac1a165ab | 395 | switch( pat ) { |
TETSUYA | 0:94eac1a165ab | 396 | case 0: // 実線 |
TETSUYA | 0:94eac1a165ab | 397 | cl = fore_col; |
TETSUYA | 0:94eac1a165ab | 398 | break; |
TETSUYA | 0:94eac1a165ab | 399 | default: // 破線 |
TETSUYA | 0:94eac1a165ab | 400 | if ( clc>=3 ) { |
TETSUYA | 0:94eac1a165ab | 401 | if ( cl==fore_col ) cl=BGround_Color; |
TETSUYA | 0:94eac1a165ab | 402 | else cl=fore_col; |
TETSUYA | 0:94eac1a165ab | 403 | clc=0; |
TETSUYA | 0:94eac1a165ab | 404 | }else{ |
TETSUYA | 0:94eac1a165ab | 405 | clc++; |
TETSUYA | 0:94eac1a165ab | 406 | } |
TETSUYA | 0:94eac1a165ab | 407 | break; |
TETSUYA | 0:94eac1a165ab | 408 | } |
TETSUYA | 0:94eac1a165ab | 409 | |
TETSUYA | 0:94eac1a165ab | 410 | Draw_Dot(x,y,cl); |
TETSUYA | 0:94eac1a165ab | 411 | y += sy; |
TETSUYA | 0:94eac1a165ab | 412 | E += 2 * dx; |
TETSUYA | 0:94eac1a165ab | 413 | if( E >= 0 ) { |
TETSUYA | 0:94eac1a165ab | 414 | x += sx; |
TETSUYA | 0:94eac1a165ab | 415 | E -= 2 * dy; |
TETSUYA | 0:94eac1a165ab | 416 | } |
TETSUYA | 0:94eac1a165ab | 417 | } |
TETSUYA | 0:94eac1a165ab | 418 | } |
TETSUYA | 0:94eac1a165ab | 419 | } |
TETSUYA | 0:94eac1a165ab | 420 | |
TETSUYA | 0:94eac1a165ab | 421 | // ミッチェナー(Miechener) の円描画 参考:http://dencha.ojaru.jp/programs_07/pg_graphic_09a1.html |
TETSUYA | 0:94eac1a165ab | 422 | // x,y : 中心点 |
TETSUYA | 0:94eac1a165ab | 423 | // radius: 半径 |
TETSUYA | 0:94eac1a165ab | 424 | void SPIOLED96x64::circle (int radius, int x, int y , unsigned int col, int fill) |
TETSUYA | 0:94eac1a165ab | 425 | { |
TETSUYA | 0:94eac1a165ab | 426 | int cx, cy, d; |
TETSUYA | 0:94eac1a165ab | 427 | |
TETSUYA | 0:94eac1a165ab | 428 | d = 3 - 2 * radius; |
TETSUYA | 0:94eac1a165ab | 429 | cy = radius; |
TETSUYA | 0:94eac1a165ab | 430 | |
TETSUYA | 0:94eac1a165ab | 431 | // 初期座標をあらかじめ描画する |
TETSUYA | 0:94eac1a165ab | 432 | Draw_Dot( x, radius+y, col ); // 座標 ( 0, R ); |
TETSUYA | 0:94eac1a165ab | 433 | Draw_Dot( x, -radius+y, col ); // 座標 ( 0, -R); |
TETSUYA | 0:94eac1a165ab | 434 | Draw_Dot( radius+x, y, col ); // 座標 ( R, 0 ); |
TETSUYA | 0:94eac1a165ab | 435 | Draw_Dot( -radius+x, y, col ); // 座標 (-R, 0); |
TETSUYA | 0:94eac1a165ab | 436 | if ( fill ) { |
TETSUYA | 0:94eac1a165ab | 437 | line( x, radius+y, x, -radius+y, col ,0 ); |
TETSUYA | 0:94eac1a165ab | 438 | line( radius+x, y, -radius+x, y, col ,0 ); |
TETSUYA | 0:94eac1a165ab | 439 | } |
TETSUYA | 0:94eac1a165ab | 440 | |
TETSUYA | 0:94eac1a165ab | 441 | for (cx = 0; cx <= cy; cx++){ |
TETSUYA | 0:94eac1a165ab | 442 | if (d >= 0) { |
TETSUYA | 0:94eac1a165ab | 443 | d += 10 + 4 * cx - 4 * cy; |
TETSUYA | 0:94eac1a165ab | 444 | cy--; |
TETSUYA | 0:94eac1a165ab | 445 | } else { |
TETSUYA | 0:94eac1a165ab | 446 | d += 6 + 4 * cx; |
TETSUYA | 0:94eac1a165ab | 447 | } |
TETSUYA | 0:94eac1a165ab | 448 | |
TETSUYA | 0:94eac1a165ab | 449 | // 描画 |
TETSUYA | 0:94eac1a165ab | 450 | Draw_Dot( cy + x, cx + y, col); // 0-45 度の間 |
TETSUYA | 0:94eac1a165ab | 451 | Draw_Dot( cx + x, cy + y, col); // 45-90 度の間 |
TETSUYA | 0:94eac1a165ab | 452 | Draw_Dot( -cx + x, cy + y, col); // 90-135 度の間 |
TETSUYA | 0:94eac1a165ab | 453 | Draw_Dot( -cy + x, cx + y, col); // 135-180 度の間 |
TETSUYA | 0:94eac1a165ab | 454 | |
TETSUYA | 0:94eac1a165ab | 455 | Draw_Dot( -cy + x, -cx + y, col); // 180-225 度の間 |
TETSUYA | 0:94eac1a165ab | 456 | Draw_Dot( -cx + x, -cy + y, col); // 225-270 度の間 |
TETSUYA | 0:94eac1a165ab | 457 | Draw_Dot( cx + x, -cy + y, col); // 270-315 度の間 |
TETSUYA | 0:94eac1a165ab | 458 | Draw_Dot( cy + x, -cx + y, col); // 315-360 度の間 |
TETSUYA | 0:94eac1a165ab | 459 | |
TETSUYA | 0:94eac1a165ab | 460 | if ( fill ) { |
TETSUYA | 0:94eac1a165ab | 461 | line( cy + x, cx + y, cy + x, -cx + y, col ,0 ); |
TETSUYA | 0:94eac1a165ab | 462 | line( cx + x, cy + y, cx + x, -cy + y, col ,0 ); // 45-90 度の間 |
TETSUYA | 0:94eac1a165ab | 463 | line( -cx + x, cy + y, -cx + x, cy + y, col ,0 ) ; // 90-135 度の間 |
TETSUYA | 0:94eac1a165ab | 464 | line( -cy + x, cx + y, -cy + x, cx + y, col ,0 ); // 135-180 度の間 |
TETSUYA | 0:94eac1a165ab | 465 | |
TETSUYA | 0:94eac1a165ab | 466 | line( -cy + x, -cx + y, -cy + x, cx + y, col ,0 ); // 180-225 度の間 |
TETSUYA | 0:94eac1a165ab | 467 | line( -cx + x, -cy + y, -cx + x, cy + y, col ,0 ); // 225-270 度の間 |
TETSUYA | 0:94eac1a165ab | 468 | line( cx + x, -cy + y, cx + x, cy + y, col ,0 ); // 270-315 度の間 |
TETSUYA | 0:94eac1a165ab | 469 | line( cy + x, -cx + y, cy + x, cx + y, col ,0 ); // 315-360 度の間 |
TETSUYA | 0:94eac1a165ab | 470 | } |
TETSUYA | 0:94eac1a165ab | 471 | |
TETSUYA | 0:94eac1a165ab | 472 | } |
TETSUYA | 0:94eac1a165ab | 473 | } |
TETSUYA | 0:94eac1a165ab | 474 | |
TETSUYA | 0:94eac1a165ab | 475 |