Adafruit ssd1331 OLED 96x64 SPI model
Fork of OledLib by
spioled96x64.cpp@6:7c25a9403243, 2011-01-15 (annotated)
- Committer:
- TETSUYA
- Date:
- Sat Jan 15 03:24:10 2011 +0000
- Revision:
- 6:7c25a9403243
- Parent:
- 5:730724f253a4
- Child:
- 7:60b2f555f3b7
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
TETSUYA | 4:b68843c0269c | 1 | |
TETSUYA | 4:b68843c0269c | 2 | |
TETSUYA | 2:e331851128c1 | 3 | // ALO-095BWNN-J9 test program |
TETSUYA | 2:e331851128c1 | 4 | // See also "http://www.aitendo.co.jp/product/2099" |
TETSUYA | 3:eab8d193745a | 5 | // Ver1.00 初版完成 |
TETSUYA | 3:eab8d193745a | 6 | // Ver1.01 フォントをk6x8フォントに変更。定義Hファイルも全角とは分離 |
TETSUYA | 3:eab8d193745a | 7 | // フォント描画ルーチンが1ドットすくなく動くのを修正 |
TETSUYA | 3:eab8d193745a | 8 | // 任意カラーパターンを描画できるように修正 |
TETSUYA | 4:b68843c0269c | 9 | // Ver1.02 SD1331/1332用 GACcommand対応 |
TETSUYA | 4:b68843c0269c | 10 | // ただし現状ではRectangeしか機能しない模様 |
TETSUYA | 5:730724f253a4 | 11 | // Ver1.03 Box (GAC) Color Bug fix |
TETSUYA | 6:7c25a9403243 | 12 | // Ver.104 Font Position Convert Bug fix |
TETSUYA | 6:7c25a9403243 | 13 | // Position Clip is refine. |
TETSUYA | 2:e331851128c1 | 14 | |
TETSUYA | 2:e331851128c1 | 15 | #include "mbed.h" |
TETSUYA | 2:e331851128c1 | 16 | #include "spioled96x64.h" |
TETSUYA | 2:e331851128c1 | 17 | |
TETSUYA | 2:e331851128c1 | 18 | //Serial pc(USBTX, USBRX); |
TETSUYA | 2:e331851128c1 | 19 | #define countof(x) ( sizeof(x) / sizeof(x[0]) ) |
TETSUYA | 2:e331851128c1 | 20 | |
TETSUYA | 2:e331851128c1 | 21 | |
TETSUYA | 3:eab8d193745a | 22 | // コンストラクタ |
TETSUYA | 2:e331851128c1 | 23 | SPIOLED96x64::SPIOLED96x64(PinName cs_pin, PinName rst_pin, PinName a0_pin, PinName mosi_pin, PinName miso_pin, PinName sclk_pin) |
TETSUYA | 2:e331851128c1 | 24 | : CS(cs_pin), RES(rst_pin), DC(a0_pin), spi(mosi_pin, miso_pin, sclk_pin) |
TETSUYA | 2:e331851128c1 | 25 | { |
TETSUYA | 2:e331851128c1 | 26 | Init(); |
TETSUYA | 2:e331851128c1 | 27 | } |
TETSUYA | 2:e331851128c1 | 28 | |
TETSUYA | 3:eab8d193745a | 29 | // イニシャライザ |
TETSUYA | 2:e331851128c1 | 30 | void SPIOLED96x64::Init(void) |
TETSUYA | 2:e331851128c1 | 31 | { |
TETSUYA | 2:e331851128c1 | 32 | |
TETSUYA | 2:e331851128c1 | 33 | spi.format(8,3); //8bit frame and POL=1 /PHA=1(UpEdge Sampled) |
TETSUYA | 2:e331851128c1 | 34 | spi.frequency(25000000); // modify later |
TETSUYA | 2:e331851128c1 | 35 | //spi.frequency(42000000); // modify later |
TETSUYA | 2:e331851128c1 | 36 | |
TETSUYA | 2:e331851128c1 | 37 | // reset |
TETSUYA | 2:e331851128c1 | 38 | wait_ms(200); |
TETSUYA | 2:e331851128c1 | 39 | RES = 0; //Reset active |
TETSUYA | 2:e331851128c1 | 40 | wait_ms(200); |
TETSUYA | 2:e331851128c1 | 41 | RES = 1; |
TETSUYA | 2:e331851128c1 | 42 | |
TETSUYA | 2:e331851128c1 | 43 | |
TETSUYA | 2:e331851128c1 | 44 | // initialize sequence |
TETSUYA | 2:e331851128c1 | 45 | RegWrite(0xae); //OLED display OFF |
TETSUYA | 2:e331851128c1 | 46 | |
TETSUYA | 2:e331851128c1 | 47 | //Row Address |
TETSUYA | 2:e331851128c1 | 48 | RegWrite(0x75); /* Set Row Address */ |
TETSUYA | 2:e331851128c1 | 49 | RegWrite(0x00); /* Start = 0 */ |
TETSUYA | 2:e331851128c1 | 50 | RegWrite(0x3f); /* End = 63 */ |
TETSUYA | 2:e331851128c1 | 51 | RegWrite(0x15); /* Set Column Address */ |
TETSUYA | 2:e331851128c1 | 52 | RegWrite(0x00); /* Start = 0 */ |
TETSUYA | 2:e331851128c1 | 53 | RegWrite(0x5F); /* End = 95 */ |
TETSUYA | 2:e331851128c1 | 54 | |
TETSUYA | 2:e331851128c1 | 55 | //Contrast |
TETSUYA | 2:e331851128c1 | 56 | RegWrite(0xa0); //Set remap & data format 0111 0000 |
TETSUYA | 2:e331851128c1 | 57 | RegWrite(0x74); // 65k Color/8bit buswidth/format1 |
TETSUYA | 2:e331851128c1 | 58 | RegWrite(0xa1); //set display start row RAM |
TETSUYA | 2:e331851128c1 | 59 | RegWrite(0x00); |
TETSUYA | 2:e331851128c1 | 60 | RegWrite(0xa2); //set dispaly offset |
TETSUYA | 2:e331851128c1 | 61 | RegWrite(0x00); |
TETSUYA | 2:e331851128c1 | 62 | RegWrite(0xa4); //Set Display Mode |
TETSUYA | 2:e331851128c1 | 63 | RegWrite(0xa8); //Set Multiplex Ratio |
TETSUYA | 2:e331851128c1 | 64 | RegWrite(0x3f); |
TETSUYA | 2:e331851128c1 | 65 | RegWrite(0xad); //Set Master Configuration |
TETSUYA | 2:e331851128c1 | 66 | RegWrite(0x8f); //(External VCC Supply Selected) |
TETSUYA | 2:e331851128c1 | 67 | RegWrite(0xB0); //Set Power Saving Mode |
TETSUYA | 2:e331851128c1 | 68 | RegWrite(0x1a); |
TETSUYA | 2:e331851128c1 | 69 | RegWrite(0xB1); //Set Phase 1 & 2 Period Adjustment |
TETSUYA | 2:e331851128c1 | 70 | RegWrite(0x74); |
TETSUYA | 2:e331851128c1 | 71 | RegWrite(0xb3); //Set Display Clock Divide Ratio / Oscillator Frequency |
TETSUYA | 2:e331851128c1 | 72 | RegWrite(0xd0); |
TETSUYA | 2:e331851128c1 | 73 | RegWrite(0x8A); //Set Second Pre-charge Speed of Color A |
TETSUYA | 2:e331851128c1 | 74 | RegWrite(0x81); |
TETSUYA | 2:e331851128c1 | 75 | RegWrite(0x8B); //Set Second Pre-charge Speed of Color B |
TETSUYA | 2:e331851128c1 | 76 | RegWrite(0x82); |
TETSUYA | 2:e331851128c1 | 77 | RegWrite(0x8C); //Set Second Pre-charge Speed of Color C |
TETSUYA | 2:e331851128c1 | 78 | RegWrite(0x83); |
TETSUYA | 2:e331851128c1 | 79 | RegWrite(0xBB); //Set Pre-charge Level |
TETSUYA | 2:e331851128c1 | 80 | RegWrite(0x3e); |
TETSUYA | 2:e331851128c1 | 81 | RegWrite(0xBE); //Set VCOMH |
TETSUYA | 2:e331851128c1 | 82 | RegWrite(0x3e); |
TETSUYA | 2:e331851128c1 | 83 | RegWrite(0x87); //Set Master Current Control |
TETSUYA | 2:e331851128c1 | 84 | RegWrite(0x0f); |
TETSUYA | 2:e331851128c1 | 85 | RegWrite(0x81); //Set Contrast Control for Color gAh |
TETSUYA | 2:e331851128c1 | 86 | RegWrite(0x80); |
TETSUYA | 2:e331851128c1 | 87 | RegWrite(0x82); //Set Contrast Control for Color gBh |
TETSUYA | 2:e331851128c1 | 88 | RegWrite(0x80); |
TETSUYA | 2:e331851128c1 | 89 | RegWrite(0x83); //Set Contrast Control for Color gCh |
TETSUYA | 2:e331851128c1 | 90 | RegWrite(0x80); |
TETSUYA | 2:e331851128c1 | 91 | RegWrite(0xaf); //display ON |
TETSUYA | 2:e331851128c1 | 92 | |
TETSUYA | 2:e331851128c1 | 93 | x_locate = 0; |
TETSUYA | 2:e331851128c1 | 94 | y_locate = 0; |
TETSUYA | 2:e331851128c1 | 95 | chr_size = CS_NORMAL; |
TETSUYA | 2:e331851128c1 | 96 | Fill_Screen(0); |
TETSUYA | 4:b68843c0269c | 97 | GAC_Useflag = 0; |
TETSUYA | 2:e331851128c1 | 98 | } |
TETSUYA | 2:e331851128c1 | 99 | |
TETSUYA | 3:eab8d193745a | 100 | // レジスタライト |
TETSUYA | 2:e331851128c1 | 101 | void SPIOLED96x64::RegWrite(unsigned char Command) |
TETSUYA | 2:e331851128c1 | 102 | { |
TETSUYA | 2:e331851128c1 | 103 | DC = 0; // Command |
TETSUYA | 2:e331851128c1 | 104 | CS = 0; // CS active(toggle OLED) |
TETSUYA | 2:e331851128c1 | 105 | spi.write(Command); |
TETSUYA | 2:e331851128c1 | 106 | CS = 1; |
TETSUYA | 2:e331851128c1 | 107 | } |
TETSUYA | 3:eab8d193745a | 108 | // マルチバイト レジスタ設定 |
TETSUYA | 2:e331851128c1 | 109 | void SPIOLED96x64::RegWriteM(unsigned char *Command, int count) |
TETSUYA | 2:e331851128c1 | 110 | { |
TETSUYA | 2:e331851128c1 | 111 | int i; |
TETSUYA | 2:e331851128c1 | 112 | DC = 0; // Command |
TETSUYA | 2:e331851128c1 | 113 | CS = 0; // CS active(toggle OLED) |
TETSUYA | 2:e331851128c1 | 114 | for( i=0;i<count;i++){ |
TETSUYA | 2:e331851128c1 | 115 | spi.write(*Command++); |
TETSUYA | 2:e331851128c1 | 116 | } |
TETSUYA | 2:e331851128c1 | 117 | CS = 1; |
TETSUYA | 2:e331851128c1 | 118 | } |
TETSUYA | 2:e331851128c1 | 119 | |
TETSUYA | 2:e331851128c1 | 120 | |
TETSUYA | 3:eab8d193745a | 121 | // データライト |
TETSUYA | 2:e331851128c1 | 122 | void SPIOLED96x64::DataWrite(unsigned char c) |
TETSUYA | 2:e331851128c1 | 123 | { |
TETSUYA | 2:e331851128c1 | 124 | DC = 1; // DATA |
TETSUYA | 2:e331851128c1 | 125 | CS = 0; // CS active(toggle OLED) |
TETSUYA | 2:e331851128c1 | 126 | spi.write(c); |
TETSUYA | 2:e331851128c1 | 127 | CS = 1; |
TETSUYA | 2:e331851128c1 | 128 | } |
TETSUYA | 2:e331851128c1 | 129 | |
TETSUYA | 3:eab8d193745a | 130 | // 16ビット書き込み |
TETSUYA | 2:e331851128c1 | 131 | void SPIOLED96x64::DataWrite_to(unsigned int Dat) |
TETSUYA | 2:e331851128c1 | 132 | { |
TETSUYA | 2:e331851128c1 | 133 | DC = 1; // DATA |
TETSUYA | 2:e331851128c1 | 134 | CS = 0; // CS active(toggle OLED) |
TETSUYA | 2:e331851128c1 | 135 | spi.write((unsigned char)((Dat >> 8)& 0x00ff)); |
TETSUYA | 2:e331851128c1 | 136 | spi.write((unsigned char)(Dat & 0x00ff)); |
TETSUYA | 2:e331851128c1 | 137 | CS = 1; |
TETSUYA | 2:e331851128c1 | 138 | /* |
TETSUYA | 2:e331851128c1 | 139 | DataWrite((unsigned char)((Dat >> 8)& 0x00ff)); |
TETSUYA | 2:e331851128c1 | 140 | DataWrite((unsigned char)(Dat & 0x00ff)); |
TETSUYA | 2:e331851128c1 | 141 | */ |
TETSUYA | 2:e331851128c1 | 142 | } |
TETSUYA | 2:e331851128c1 | 143 | |
TETSUYA | 2:e331851128c1 | 144 | |
TETSUYA | 2:e331851128c1 | 145 | |
TETSUYA | 3:eab8d193745a | 146 | // 指定座標に指定色でドット描画 |
TETSUYA | 2:e331851128c1 | 147 | void SPIOLED96x64::Draw_Dot(int x,int y,unsigned int Color) |
TETSUYA | 2:e331851128c1 | 148 | { |
TETSUYA | 2:e331851128c1 | 149 | unsigned char cmd[7]={0x15,0x00,0x00,0x75,0x00,0x00,0x00}; |
TETSUYA | 6:7c25a9403243 | 150 | if ( ( x < 0 )||( y < 0 ) |
TETSUYA | 6:7c25a9403243 | 151 | ||( x > Dis_X_MAX )||( y > Dis_Y_MAX ) ) return ; |
TETSUYA | 2:e331851128c1 | 152 | cmd[1] = (unsigned char)x; |
TETSUYA | 2:e331851128c1 | 153 | cmd[2] = (unsigned char)x; |
TETSUYA | 2:e331851128c1 | 154 | cmd[4] = (unsigned char)y; |
TETSUYA | 2:e331851128c1 | 155 | cmd[5] = (unsigned char)y; |
TETSUYA | 2:e331851128c1 | 156 | RegWriteM(cmd, 6); |
TETSUYA | 2:e331851128c1 | 157 | DataWrite_to(Color); |
TETSUYA | 2:e331851128c1 | 158 | //DataWrite_to(Color); |
TETSUYA | 2:e331851128c1 | 159 | } |
TETSUYA | 2:e331851128c1 | 160 | |
TETSUYA | 2:e331851128c1 | 161 | |
TETSUYA | 2:e331851128c1 | 162 | |
TETSUYA | 2:e331851128c1 | 163 | void SPIOLED96x64::ChangeFontColor(unsigned int color) |
TETSUYA | 2:e331851128c1 | 164 | { |
TETSUYA | 2:e331851128c1 | 165 | Char_Color = color; |
TETSUYA | 2:e331851128c1 | 166 | } |
TETSUYA | 2:e331851128c1 | 167 | void SPIOLED96x64::ChangeBGColor(unsigned int color) |
TETSUYA | 2:e331851128c1 | 168 | { |
TETSUYA | 2:e331851128c1 | 169 | BGround_Color = color; |
TETSUYA | 2:e331851128c1 | 170 | } |
TETSUYA | 2:e331851128c1 | 171 | |
TETSUYA | 2:e331851128c1 | 172 | |
TETSUYA | 2:e331851128c1 | 173 | // CS_NORMAL/CS_WIDE/CS_HIGH/CS_WH |
TETSUYA | 2:e331851128c1 | 174 | void SPIOLED96x64::SetFontSize(int Csize) |
TETSUYA | 2:e331851128c1 | 175 | { |
TETSUYA | 2:e331851128c1 | 176 | chr_size = Csize; |
TETSUYA | 2:e331851128c1 | 177 | } |
TETSUYA | 3:eab8d193745a | 178 | // 縦横の倍率変化量を返す |
TETSUYA | 2:e331851128c1 | 179 | void SPIOLED96x64::CS_Conv(int *lpx,int *lpy) |
TETSUYA | 2:e331851128c1 | 180 | { |
TETSUYA | 2:e331851128c1 | 181 | switch( chr_size ){ |
TETSUYA | 2:e331851128c1 | 182 | case CS_WIDE: |
TETSUYA | 2:e331851128c1 | 183 | *lpx=2; |
TETSUYA | 2:e331851128c1 | 184 | *lpy=1; |
TETSUYA | 2:e331851128c1 | 185 | break; |
TETSUYA | 2:e331851128c1 | 186 | case CS_HIGH: |
TETSUYA | 2:e331851128c1 | 187 | *lpx=1; |
TETSUYA | 2:e331851128c1 | 188 | *lpy=2; |
TETSUYA | 2:e331851128c1 | 189 | break; |
TETSUYA | 2:e331851128c1 | 190 | case CS_WH : |
TETSUYA | 2:e331851128c1 | 191 | *lpx=2; |
TETSUYA | 2:e331851128c1 | 192 | *lpy=2; |
TETSUYA | 2:e331851128c1 | 193 | break; |
TETSUYA | 2:e331851128c1 | 194 | case CS_WHx36 : |
TETSUYA | 2:e331851128c1 | 195 | *lpx=6; |
TETSUYA | 2:e331851128c1 | 196 | *lpy=6; |
TETSUYA | 2:e331851128c1 | 197 | break; |
TETSUYA | 2:e331851128c1 | 198 | case CS_NORMAL: |
TETSUYA | 2:e331851128c1 | 199 | default: |
TETSUYA | 2:e331851128c1 | 200 | *lpx=1; |
TETSUYA | 2:e331851128c1 | 201 | *lpy=1; |
TETSUYA | 2:e331851128c1 | 202 | break; |
TETSUYA | 2:e331851128c1 | 203 | } |
TETSUYA | 2:e331851128c1 | 204 | |
TETSUYA | 2:e331851128c1 | 205 | } |
TETSUYA | 2:e331851128c1 | 206 | |
TETSUYA | 3:eab8d193745a | 207 | // 全角キャラクタの描画処理 |
TETSUYA | 3:eab8d193745a | 208 | // アスキーキャラクタの位置指定表示(5x7dotフォント) |
TETSUYA | 3:eab8d193745a | 209 | // フォントの特性上、最上位ビットから順に↑方向に記述される |
TETSUYA | 2:e331851128c1 | 210 | void SPIOLED96x64::PutChar(int x,int y,unsigned int a) |
TETSUYA | 2:e331851128c1 | 211 | { |
TETSUYA | 2:e331851128c1 | 212 | int i,j; |
TETSUYA | 2:e331851128c1 | 213 | unsigned char Temp=0; |
TETSUYA | 2:e331851128c1 | 214 | int lpx, lpy, k,l; |
TETSUYA | 2:e331851128c1 | 215 | int xw; |
TETSUYA | 2:e331851128c1 | 216 | j = 0; |
TETSUYA | 2:e331851128c1 | 217 | i = 0; |
TETSUYA | 2:e331851128c1 | 218 | |
TETSUYA | 2:e331851128c1 | 219 | CS_Conv(&lpx, &lpy); |
TETSUYA | 2:e331851128c1 | 220 | if ( a < 0x80 ) { xw = X_WitchASC; if(a < 32)a=32; } // ASCII |
TETSUYA | 2:e331851128c1 | 221 | else xw = X_Witch; // Kanji |
TETSUYA | 2:e331851128c1 | 222 | |
TETSUYA | 2:e331851128c1 | 223 | for(i=0; i<xw; i++){ |
TETSUYA | 2:e331851128c1 | 224 | for ( l=0;l<lpx;l++){ |
TETSUYA | 2:e331851128c1 | 225 | if ( a < 0x80 ) Temp = FontLookup_ABC[a-32][i]; // ASCII(0x20~0x7f)==> 0x00~0x5f |
TETSUYA | 2:e331851128c1 | 226 | else Temp = FontLookup[a][i]; // Kanji |
TETSUYA | 2:e331851128c1 | 227 | |
TETSUYA | 2:e331851128c1 | 228 | for(j=Y_Witch-1;j>=0;j--){ |
TETSUYA | 2:e331851128c1 | 229 | for ( k=0;k<lpy;k++){ |
TETSUYA | 6:7c25a9403243 | 230 | Draw_Dot(x+(i*lpx)+l,y+(((j+1)*lpy)-1)-k, ((Temp & 0x80)==0x80) ? Char_Color : BGround_Color); |
TETSUYA | 2:e331851128c1 | 231 | } |
TETSUYA | 2:e331851128c1 | 232 | Temp = Temp << 1; |
TETSUYA | 2:e331851128c1 | 233 | } |
TETSUYA | 2:e331851128c1 | 234 | } |
TETSUYA | 2:e331851128c1 | 235 | } |
TETSUYA | 2:e331851128c1 | 236 | } |
TETSUYA | 2:e331851128c1 | 237 | |
TETSUYA | 2:e331851128c1 | 238 | |
TETSUYA | 3:eab8d193745a | 239 | // 純粋仮想関数でputcを実現 |
TETSUYA | 2:e331851128c1 | 240 | int SPIOLED96x64::_putc( int c ) |
TETSUYA | 2:e331851128c1 | 241 | { |
TETSUYA | 2:e331851128c1 | 242 | static bool kstate = false; |
TETSUYA | 2:e331851128c1 | 243 | static unsigned int kbuf = 0; |
TETSUYA | 2:e331851128c1 | 244 | unsigned int p; |
TETSUYA | 2:e331851128c1 | 245 | int lpx, lpy, w; |
TETSUYA | 2:e331851128c1 | 246 | |
TETSUYA | 2:e331851128c1 | 247 | if(!kstate && ((0x81 <= c && c <= 0x9f) || (0xe0 <= c && c <= 0xfc))){ |
TETSUYA | 2:e331851128c1 | 248 | kstate = true; |
TETSUYA | 2:e331851128c1 | 249 | kbuf = c; |
TETSUYA | 2:e331851128c1 | 250 | return c; |
TETSUYA | 2:e331851128c1 | 251 | } |
TETSUYA | 2:e331851128c1 | 252 | |
TETSUYA | 2:e331851128c1 | 253 | if(kstate){ // 2nd byte of shift-jis |
TETSUYA | 2:e331851128c1 | 254 | kstate = false; |
TETSUYA | 2:e331851128c1 | 255 | p = findface(kbuf << 8 | c); |
TETSUYA | 2:e331851128c1 | 256 | w = X_Witch; |
TETSUYA | 2:e331851128c1 | 257 | } else { |
TETSUYA | 2:e331851128c1 | 258 | p = c; |
TETSUYA | 3:eab8d193745a | 259 | w = X_WitchASC; // 半角は近接するので、1ドットあける |
TETSUYA | 2:e331851128c1 | 260 | } |
TETSUYA | 2:e331851128c1 | 261 | PutChar( x_locate , y_locate ,p); |
TETSUYA | 2:e331851128c1 | 262 | CS_Conv(&lpx, &lpy); |
TETSUYA | 2:e331851128c1 | 263 | x_locate += (w*lpx); |
TETSUYA | 2:e331851128c1 | 264 | |
TETSUYA | 2:e331851128c1 | 265 | |
TETSUYA | 2:e331851128c1 | 266 | /* |
TETSUYA | 2:e331851128c1 | 267 | if(kstate== false){ |
TETSUYA | 3:eab8d193745a | 268 | //画面右端でのクリッピング |
TETSUYA | 2:e331851128c1 | 269 | if(x_locate + (xsize - 1) >= Dis_X_MAX){ |
TETSUYA | 2:e331851128c1 | 270 | x_locate = 0; |
TETSUYA | 2:e331851128c1 | 271 | y_locate += Y_Witch; |
TETSUYA | 2:e331851128c1 | 272 | if(y_locate >= Dis_Y_MAX) y_locate=0; |
TETSUYA | 2:e331851128c1 | 273 | } |
TETSUYA | 2:e331851128c1 | 274 | } |
TETSUYA | 2:e331851128c1 | 275 | */ |
TETSUYA | 2:e331851128c1 | 276 | return c; |
TETSUYA | 2:e331851128c1 | 277 | } |
TETSUYA | 2:e331851128c1 | 278 | |
TETSUYA | 2:e331851128c1 | 279 | int SPIOLED96x64::_getc() |
TETSUYA | 2:e331851128c1 | 280 | { |
TETSUYA | 2:e331851128c1 | 281 | return -1; |
TETSUYA | 2:e331851128c1 | 282 | } |
TETSUYA | 2:e331851128c1 | 283 | |
TETSUYA | 2:e331851128c1 | 284 | /* |
TETSUYA | 2:e331851128c1 | 285 | void SPIOLED96x64::puts( char *s ) |
TETSUYA | 2:e331851128c1 | 286 | { |
TETSUYA | 2:e331851128c1 | 287 | unsigned char c; |
TETSUYA | 2:e331851128c1 | 288 | while((c = *s++) != '\0') putc((int)c & 0xff); |
TETSUYA | 2:e331851128c1 | 289 | } |
TETSUYA | 2:e331851128c1 | 290 | */ |
TETSUYA | 2:e331851128c1 | 291 | |
TETSUYA | 2:e331851128c1 | 292 | |
TETSUYA | 2:e331851128c1 | 293 | void SPIOLED96x64::locate(int column, int row) |
TETSUYA | 2:e331851128c1 | 294 | { |
TETSUYA | 2:e331851128c1 | 295 | x_locate = column; |
TETSUYA | 2:e331851128c1 | 296 | y_locate = row; |
TETSUYA | 2:e331851128c1 | 297 | } |
TETSUYA | 2:e331851128c1 | 298 | |
TETSUYA | 2:e331851128c1 | 299 | int SPIOLED96x64::row() |
TETSUYA | 2:e331851128c1 | 300 | { |
TETSUYA | 2:e331851128c1 | 301 | return y_locate; |
TETSUYA | 2:e331851128c1 | 302 | } |
TETSUYA | 2:e331851128c1 | 303 | int SPIOLED96x64::column() |
TETSUYA | 2:e331851128c1 | 304 | { |
TETSUYA | 2:e331851128c1 | 305 | return x_locate; |
TETSUYA | 2:e331851128c1 | 306 | } |
TETSUYA | 2:e331851128c1 | 307 | |
TETSUYA | 3:eab8d193745a | 308 | // SJIS漢字コードテーブルから指定の配列アドレスを算出する |
TETSUYA | 2:e331851128c1 | 309 | unsigned int SPIOLED96x64::findface(unsigned short c) |
TETSUYA | 2:e331851128c1 | 310 | { |
TETSUYA | 2:e331851128c1 | 311 | unsigned int p = 0; |
TETSUYA | 2:e331851128c1 | 312 | int i, sum; |
TETSUYA | 2:e331851128c1 | 313 | for(sum = i = 0; i < countof(font8table); i++){ |
TETSUYA | 2:e331851128c1 | 314 | if(font8table[i].start <= c && c <= font8table[i].end){ |
TETSUYA | 2:e331851128c1 | 315 | p = (sum + c - font8table[i].start); |
TETSUYA | 2:e331851128c1 | 316 | break; |
TETSUYA | 2:e331851128c1 | 317 | } |
TETSUYA | 2:e331851128c1 | 318 | sum += font8table[i].end - font8table[i].start + 1; |
TETSUYA | 2:e331851128c1 | 319 | } |
TETSUYA | 2:e331851128c1 | 320 | return p; |
TETSUYA | 2:e331851128c1 | 321 | } |
TETSUYA | 2:e331851128c1 | 322 | |
TETSUYA | 3:eab8d193745a | 323 | // RGB(555)をRGB565値に変換 |
TETSUYA | 2:e331851128c1 | 324 | // 00~1F(0~31) |
TETSUYA | 2:e331851128c1 | 325 | unsigned int SPIOLED96x64::ColorConv(unsigned int R,unsigned int G,unsigned int B) |
TETSUYA | 2:e331851128c1 | 326 | { |
TETSUYA | 2:e331851128c1 | 327 | unsigned int ret = 0; |
TETSUYA | 2:e331851128c1 | 328 | unsigned int rv, gv, bv; |
TETSUYA | 2:e331851128c1 | 329 | |
TETSUYA | 2:e331851128c1 | 330 | if ( R > 0x1f ) rv= 0x1f; |
TETSUYA | 2:e331851128c1 | 331 | else rv= (unsigned int)( R & 0x1F ); |
TETSUYA | 2:e331851128c1 | 332 | if ( G > 0x1f ) gv= 0x3f; |
TETSUYA | 2:e331851128c1 | 333 | else gv= (unsigned int)( (G<<1) & 0x3F ); |
TETSUYA | 2:e331851128c1 | 334 | if ( B > 0x1f ) bv= 0x1f; |
TETSUYA | 2:e331851128c1 | 335 | else bv= (unsigned int)( B & 0x1F ); |
TETSUYA | 2:e331851128c1 | 336 | |
TETSUYA | 2:e331851128c1 | 337 | ret = (bv << 11) + (gv << 5) + rv; |
TETSUYA | 2:e331851128c1 | 338 | return ret; |
TETSUYA | 2:e331851128c1 | 339 | } |
TETSUYA | 3:eab8d193745a | 340 | // 画面の指定色塗りつぶし指定領域し |
TETSUYA | 2:e331851128c1 | 341 | void SPIOLED96x64::Box(int x1,int y1, int x2, int y2, unsigned int Color, int fill) |
TETSUYA | 2:e331851128c1 | 342 | { |
TETSUYA | 4:b68843c0269c | 343 | |
TETSUYA | 4:b68843c0269c | 344 | if ( !GAC_Useflag ){ |
TETSUYA | 4:b68843c0269c | 345 | unsigned char i,j; |
TETSUYA | 2:e331851128c1 | 346 | |
TETSUYA | 4:b68843c0269c | 347 | switch( fill ) { |
TETSUYA | 4:b68843c0269c | 348 | case 0: // box |
TETSUYA | 4:b68843c0269c | 349 | line( x1, y1, x2, y1, Color, 0 ); |
TETSUYA | 4:b68843c0269c | 350 | line( x2, y1, x2, y2, Color, 0 ); |
TETSUYA | 4:b68843c0269c | 351 | line( x2, y2, x1, y2, Color, 0 ); |
TETSUYA | 4:b68843c0269c | 352 | line( x1, y2, x1, y1, Color, 0 ); |
TETSUYA | 4:b68843c0269c | 353 | break; |
TETSUYA | 4:b68843c0269c | 354 | default: // fill |
TETSUYA | 4:b68843c0269c | 355 | for(i=y1;i<=y2;i++) |
TETSUYA | 2:e331851128c1 | 356 | { |
TETSUYA | 4:b68843c0269c | 357 | for(j=x1;j<=x2;j++) |
TETSUYA | 4:b68843c0269c | 358 | { |
TETSUYA | 4:b68843c0269c | 359 | Draw_Dot(j,i,Color); |
TETSUYA | 4:b68843c0269c | 360 | // DataWrite_to(Dot); |
TETSUYA | 4:b68843c0269c | 361 | } |
TETSUYA | 2:e331851128c1 | 362 | } |
TETSUYA | 4:b68843c0269c | 363 | break; |
TETSUYA | 2:e331851128c1 | 364 | } |
TETSUYA | 4:b68843c0269c | 365 | }else{ |
TETSUYA | 4:b68843c0269c | 366 | // SSD1331/1332用 GAC(アクセラレートコマンド) |
TETSUYA | 4:b68843c0269c | 367 | unsigned char cmd[11]={ 0 }; |
TETSUYA | 4:b68843c0269c | 368 | |
TETSUYA | 6:7c25a9403243 | 369 | if ( x1 < 0 ) x1 = 0; |
TETSUYA | 6:7c25a9403243 | 370 | else if ( x1 > Dis_X_MAX ) x1 = Dis_X_MAX; |
TETSUYA | 6:7c25a9403243 | 371 | if ( y1 < 0 ) y1 = 0; |
TETSUYA | 6:7c25a9403243 | 372 | else if ( y1 > Dis_Y_MAX ) y1 = Dis_Y_MAX; |
TETSUYA | 6:7c25a9403243 | 373 | if ( x2 < 0 ) x2 = 0; |
TETSUYA | 6:7c25a9403243 | 374 | else if ( x2 > Dis_X_MAX ) x2 = Dis_X_MAX; |
TETSUYA | 6:7c25a9403243 | 375 | if ( y2 < 0 ) y2 = 0; |
TETSUYA | 6:7c25a9403243 | 376 | else if ( y2 > Dis_Y_MAX ) y2 = Dis_Y_MAX; |
TETSUYA | 4:b68843c0269c | 377 | |
TETSUYA | 4:b68843c0269c | 378 | cmd[0] = GAC_FILL_ENABLE_DISABLE; // |
TETSUYA | 4:b68843c0269c | 379 | cmd[1] = (unsigned char)fill; //( fill ) ? 0 : 0; |
TETSUYA | 4:b68843c0269c | 380 | RegWriteM(cmd, 2); |
TETSUYA | 4:b68843c0269c | 381 | |
TETSUYA | 4:b68843c0269c | 382 | cmd[0] = GAC_DRAW_RECTANGLE; // |
TETSUYA | 4:b68843c0269c | 383 | cmd[1] = (unsigned char)x1; |
TETSUYA | 4:b68843c0269c | 384 | cmd[2] = (unsigned char)y1; |
TETSUYA | 4:b68843c0269c | 385 | cmd[3] = (unsigned char)x2; |
TETSUYA | 4:b68843c0269c | 386 | cmd[4] = (unsigned char)y2; |
TETSUYA | 5:730724f253a4 | 387 | cmd[5] = (unsigned char)(((Color>>11)&0x1f)<<1); // Outline Blue |
TETSUYA | 5:730724f253a4 | 388 | cmd[6] = (unsigned char) ((Color>>5 )&0x3f); // Outline Green |
TETSUYA | 5:730724f253a4 | 389 | cmd[7] = (unsigned char)(( Color &0x1f)<<1); // Outline Red |
TETSUYA | 5:730724f253a4 | 390 | cmd[8] = (unsigned char)(((Color>>11)&0x1f)<<1); // Outline Blue |
TETSUYA | 5:730724f253a4 | 391 | cmd[9] = (unsigned char) ((Color>>5 )&0x3f); // Outline Green |
TETSUYA | 5:730724f253a4 | 392 | cmd[10]= (unsigned char)(( Color &0x1f)<<1); // Outline Red |
TETSUYA | 4:b68843c0269c | 393 | |
TETSUYA | 4:b68843c0269c | 394 | RegWriteM(cmd, 11); |
TETSUYA | 4:b68843c0269c | 395 | wait_ms( 1 ); |
TETSUYA | 4:b68843c0269c | 396 | |
TETSUYA | 2:e331851128c1 | 397 | } |
TETSUYA | 2:e331851128c1 | 398 | } |
TETSUYA | 2:e331851128c1 | 399 | |
TETSUYA | 3:eab8d193745a | 400 | // 画面の指定色塗りつぶし |
TETSUYA | 2:e331851128c1 | 401 | void SPIOLED96x64::Fill_Screen(unsigned int Color) |
TETSUYA | 2:e331851128c1 | 402 | { |
TETSUYA | 2:e331851128c1 | 403 | BGround_Color = Color; |
TETSUYA | 2:e331851128c1 | 404 | Box( 0,0, Dis_X_MAX, Dis_Y_MAX , Color , 1); |
TETSUYA | 2:e331851128c1 | 405 | } |
TETSUYA | 2:e331851128c1 | 406 | |
TETSUYA | 3:eab8d193745a | 407 | // Bresenhamの線分発生アルゴリズム |
TETSUYA | 3:eab8d193745a | 408 | // 整数のみによる線分描画 |
TETSUYA | 3:eab8d193745a | 409 | // (x0,y0)-(x1,y1)へのライン描画 参照:http //www2.starcat.ne.jp/~fussy/algo/algo1-1.htm |
TETSUYA | 3:eab8d193745a | 410 | // pat : 0:実線 1:破線 |
TETSUYA | 2:e331851128c1 | 411 | void SPIOLED96x64::line( int x0, int y0, int x1, int y1, unsigned int fore_col ,int pat ) |
TETSUYA | 2:e331851128c1 | 412 | { |
TETSUYA | 2:e331851128c1 | 413 | int E,x,y; |
TETSUYA | 2:e331851128c1 | 414 | int dx,dy,sx,sy,i; |
TETSUYA | 2:e331851128c1 | 415 | int cl=1 ; |
TETSUYA | 3:eab8d193745a | 416 | int clc=0; // 破線用のカウンタ |
TETSUYA | 2:e331851128c1 | 417 | |
TETSUYA | 3:eab8d193745a | 418 | sx = ( x1 > x0 ) ? 1 : -1; // xの移動方向 |
TETSUYA | 3:eab8d193745a | 419 | dx = ( x1 > x0 ) ? x1 - x0 : x0 - x1; // xの移動量 |
TETSUYA | 3:eab8d193745a | 420 | sy = ( y1 > y0 ) ? 1 : -1; // yの移動方向 |
TETSUYA | 3:eab8d193745a | 421 | dy = ( y1 > y0 ) ? y1 - y0 : y0 - y1; // yの移動量 |
TETSUYA | 2:e331851128c1 | 422 | |
TETSUYA | 2:e331851128c1 | 423 | x = x0; |
TETSUYA | 2:e331851128c1 | 424 | y = y0; |
TETSUYA | 2:e331851128c1 | 425 | |
TETSUYA | 2:e331851128c1 | 426 | if( dx >= dy ) { |
TETSUYA | 3:eab8d193745a | 427 | /* 傾きが1以下の場合 */ |
TETSUYA | 2:e331851128c1 | 428 | E = -dx; |
TETSUYA | 2:e331851128c1 | 429 | for( i = 0; i <= dx; i++ ) { |
TETSUYA | 2:e331851128c1 | 430 | switch( pat ) { |
TETSUYA | 3:eab8d193745a | 431 | case 0: // 実線 |
TETSUYA | 2:e331851128c1 | 432 | cl = fore_col; |
TETSUYA | 2:e331851128c1 | 433 | break; |
TETSUYA | 3:eab8d193745a | 434 | default: // 破線 |
TETSUYA | 2:e331851128c1 | 435 | if ( clc>=3 ) { |
TETSUYA | 2:e331851128c1 | 436 | if ( cl==fore_col ) cl=BGround_Color; |
TETSUYA | 2:e331851128c1 | 437 | else cl=fore_col; |
TETSUYA | 2:e331851128c1 | 438 | clc=0; |
TETSUYA | 2:e331851128c1 | 439 | }else{ |
TETSUYA | 2:e331851128c1 | 440 | clc++; |
TETSUYA | 2:e331851128c1 | 441 | } |
TETSUYA | 2:e331851128c1 | 442 | break; |
TETSUYA | 2:e331851128c1 | 443 | } |
TETSUYA | 2:e331851128c1 | 444 | |
TETSUYA | 2:e331851128c1 | 445 | Draw_Dot(x,y,cl); |
TETSUYA | 2:e331851128c1 | 446 | x += sx; |
TETSUYA | 2:e331851128c1 | 447 | E += 2 * dy; |
TETSUYA | 2:e331851128c1 | 448 | if( E >= 0 ) { |
TETSUYA | 2:e331851128c1 | 449 | y += sy; |
TETSUYA | 2:e331851128c1 | 450 | E -= 2 * dx; |
TETSUYA | 2:e331851128c1 | 451 | } |
TETSUYA | 2:e331851128c1 | 452 | } |
TETSUYA | 2:e331851128c1 | 453 | }else{ |
TETSUYA | 3:eab8d193745a | 454 | /* 傾きが1より大きい場合 */ |
TETSUYA | 2:e331851128c1 | 455 | E = -dy; |
TETSUYA | 2:e331851128c1 | 456 | for( i = 0; i <= dy; i++ ) { |
TETSUYA | 2:e331851128c1 | 457 | switch( pat ) { |
TETSUYA | 3:eab8d193745a | 458 | case 0: // 実線 |
TETSUYA | 2:e331851128c1 | 459 | cl = fore_col; |
TETSUYA | 2:e331851128c1 | 460 | break; |
TETSUYA | 3:eab8d193745a | 461 | default: // 破線 |
TETSUYA | 2:e331851128c1 | 462 | if ( clc>=3 ) { |
TETSUYA | 2:e331851128c1 | 463 | if ( cl==fore_col ) cl=BGround_Color; |
TETSUYA | 2:e331851128c1 | 464 | else cl=fore_col; |
TETSUYA | 2:e331851128c1 | 465 | clc=0; |
TETSUYA | 2:e331851128c1 | 466 | }else{ |
TETSUYA | 2:e331851128c1 | 467 | clc++; |
TETSUYA | 2:e331851128c1 | 468 | } |
TETSUYA | 2:e331851128c1 | 469 | break; |
TETSUYA | 2:e331851128c1 | 470 | } |
TETSUYA | 2:e331851128c1 | 471 | |
TETSUYA | 2:e331851128c1 | 472 | Draw_Dot(x,y,cl); |
TETSUYA | 2:e331851128c1 | 473 | y += sy; |
TETSUYA | 2:e331851128c1 | 474 | E += 2 * dx; |
TETSUYA | 2:e331851128c1 | 475 | if( E >= 0 ) { |
TETSUYA | 2:e331851128c1 | 476 | x += sx; |
TETSUYA | 2:e331851128c1 | 477 | E -= 2 * dy; |
TETSUYA | 2:e331851128c1 | 478 | } |
TETSUYA | 2:e331851128c1 | 479 | } |
TETSUYA | 2:e331851128c1 | 480 | } |
TETSUYA | 2:e331851128c1 | 481 | } |
TETSUYA | 2:e331851128c1 | 482 | |
TETSUYA | 3:eab8d193745a | 483 | // ミッチェナー(Miechener) の円描画 参考:http://dencha.ojaru.jp/programs_07/pg_graphic_09a1.html |
TETSUYA | 3:eab8d193745a | 484 | // x,y : 中心点 |
TETSUYA | 3:eab8d193745a | 485 | // radius: 半径 |
TETSUYA | 2:e331851128c1 | 486 | void SPIOLED96x64::circle (int radius, int x, int y , unsigned int col, int fill) |
TETSUYA | 2:e331851128c1 | 487 | { |
TETSUYA | 2:e331851128c1 | 488 | int cx, cy, d; |
TETSUYA | 2:e331851128c1 | 489 | |
TETSUYA | 2:e331851128c1 | 490 | d = 3 - 2 * radius; |
TETSUYA | 2:e331851128c1 | 491 | cy = radius; |
TETSUYA | 2:e331851128c1 | 492 | |
TETSUYA | 3:eab8d193745a | 493 | // 初期座標をあらかじめ描画する |
TETSUYA | 3:eab8d193745a | 494 | Draw_Dot( x, radius+y, col ); // 座標 ( 0, R ); |
TETSUYA | 3:eab8d193745a | 495 | Draw_Dot( x, -radius+y, col ); // 座標 ( 0, -R); |
TETSUYA | 3:eab8d193745a | 496 | Draw_Dot( radius+x, y, col ); // 座標 ( R, 0 ); |
TETSUYA | 3:eab8d193745a | 497 | Draw_Dot( -radius+x, y, col ); // 座標 (-R, 0); |
TETSUYA | 2:e331851128c1 | 498 | if ( fill ) { |
TETSUYA | 2:e331851128c1 | 499 | line( x, radius+y, x, -radius+y, col ,0 ); |
TETSUYA | 2:e331851128c1 | 500 | line( radius+x, y, -radius+x, y, col ,0 ); |
TETSUYA | 2:e331851128c1 | 501 | } |
TETSUYA | 2:e331851128c1 | 502 | |
TETSUYA | 2:e331851128c1 | 503 | for (cx = 0; cx <= cy; cx++){ |
TETSUYA | 2:e331851128c1 | 504 | if (d >= 0) { |
TETSUYA | 2:e331851128c1 | 505 | d += 10 + 4 * cx - 4 * cy; |
TETSUYA | 2:e331851128c1 | 506 | cy--; |
TETSUYA | 2:e331851128c1 | 507 | } else { |
TETSUYA | 2:e331851128c1 | 508 | d += 6 + 4 * cx; |
TETSUYA | 2:e331851128c1 | 509 | } |
TETSUYA | 2:e331851128c1 | 510 | |
TETSUYA | 3:eab8d193745a | 511 | // 描画 |
TETSUYA | 3:eab8d193745a | 512 | Draw_Dot( cy + x, cx + y, col); // 0-45 度の間 |
TETSUYA | 3:eab8d193745a | 513 | Draw_Dot( cx + x, cy + y, col); // 45-90 度の間 |
TETSUYA | 3:eab8d193745a | 514 | Draw_Dot( -cx + x, cy + y, col); // 90-135 度の間 |
TETSUYA | 3:eab8d193745a | 515 | Draw_Dot( -cy + x, cx + y, col); // 135-180 度の間 |
TETSUYA | 2:e331851128c1 | 516 | |
TETSUYA | 3:eab8d193745a | 517 | Draw_Dot( -cy + x, -cx + y, col); // 180-225 度の間 |
TETSUYA | 3:eab8d193745a | 518 | Draw_Dot( -cx + x, -cy + y, col); // 225-270 度の間 |
TETSUYA | 3:eab8d193745a | 519 | Draw_Dot( cx + x, -cy + y, col); // 270-315 度の間 |
TETSUYA | 3:eab8d193745a | 520 | Draw_Dot( cy + x, -cx + y, col); // 315-360 度の間 |
TETSUYA | 2:e331851128c1 | 521 | |
TETSUYA | 2:e331851128c1 | 522 | if ( fill ) { |
TETSUYA | 2:e331851128c1 | 523 | line( cy + x, cx + y, cy + x, -cx + y, col ,0 ); |
TETSUYA | 3:eab8d193745a | 524 | line( cx + x, cy + y, cx + x, -cy + y, col ,0 ); // 45-90 度の間 |
TETSUYA | 3:eab8d193745a | 525 | line( -cx + x, cy + y, -cx + x, cy + y, col ,0 ) ; // 90-135 度の間 |
TETSUYA | 3:eab8d193745a | 526 | line( -cy + x, cx + y, -cy + x, cx + y, col ,0 ); // 135-180 度の間 |
TETSUYA | 2:e331851128c1 | 527 | |
TETSUYA | 3:eab8d193745a | 528 | line( -cy + x, -cx + y, -cy + x, cx + y, col ,0 ); // 180-225 度の間 |
TETSUYA | 3:eab8d193745a | 529 | line( -cx + x, -cy + y, -cx + x, cy + y, col ,0 ); // 225-270 度の間 |
TETSUYA | 3:eab8d193745a | 530 | line( cx + x, -cy + y, cx + x, cy + y, col ,0 ); // 270-315 度の間 |
TETSUYA | 3:eab8d193745a | 531 | line( cy + x, -cx + y, cy + x, cx + y, col ,0 ); // 315-360 度の間 |
TETSUYA | 2:e331851128c1 | 532 | } |
TETSUYA | 2:e331851128c1 | 533 | |
TETSUYA | 2:e331851128c1 | 534 | } |
TETSUYA | 2:e331851128c1 | 535 | } |
TETSUYA | 2:e331851128c1 | 536 | |
TETSUYA | 2:e331851128c1 | 537 | // Color Pattern |
TETSUYA | 3:eab8d193745a | 538 | // pattern *P はRGB565(2バイト型)のデータ配列で渡す |
TETSUYA | 2:e331851128c1 | 539 | void SPIOLED96x64::Pattern(int x,int y,int width, int height, unsigned int *p) |
TETSUYA | 2:e331851128c1 | 540 | { |
TETSUYA | 2:e331851128c1 | 541 | |
TETSUYA | 2:e331851128c1 | 542 | int i,j; |
TETSUYA | 4:b68843c0269c | 543 | |
TETSUYA | 2:e331851128c1 | 544 | for(i=0; i<width; i++){ |
TETSUYA | 2:e331851128c1 | 545 | for(j=height-1;j>=0;j--){ |
TETSUYA | 2:e331851128c1 | 546 | Draw_Dot(x+i,y+j,*p++); |
TETSUYA | 2:e331851128c1 | 547 | } |
TETSUYA | 2:e331851128c1 | 548 | } |
TETSUYA | 2:e331851128c1 | 549 | |
TETSUYA | 2:e331851128c1 | 550 | } |
TETSUYA | 4:b68843c0269c | 551 | void SPIOLED96x64::GACEnable(int enable) |
TETSUYA | 4:b68843c0269c | 552 | { |
TETSUYA | 4:b68843c0269c | 553 | GAC_Useflag = enable; |
TETSUYA | 4:b68843c0269c | 554 | } |
TETSUYA | 6:7c25a9403243 | 555 | |
TETSUYA | 2:e331851128c1 | 556 | |
TETSUYA | 4:b68843c0269c | 557 | // 任意領域のコピー |
TETSUYA | 4:b68843c0269c | 558 | // SSD1332では機能しない模様... |
TETSUYA | 4:b68843c0269c | 559 | void SPIOLED96x64::Copy(int src_x1,int src_y1,int src_x2,int src_y2, int dst_x,int dst_y) |
TETSUYA | 4:b68843c0269c | 560 | { |
TETSUYA | 4:b68843c0269c | 561 | |
TETSUYA | 4:b68843c0269c | 562 | if ( GAC_Useflag ){ |
TETSUYA | 4:b68843c0269c | 563 | // SSD1331/1332用 GAC(アクセラレートコマンド) |
TETSUYA | 4:b68843c0269c | 564 | unsigned char cmd[11]={ 0 }; |
TETSUYA | 4:b68843c0269c | 565 | int p; |
TETSUYA | 4:b68843c0269c | 566 | if ( ( src_x1 > Dis_X_MAX )||( src_y1 > Dis_Y_MAX ) |
TETSUYA | 4:b68843c0269c | 567 | ||( src_x2 > Dis_X_MAX )||( src_y2 > Dis_Y_MAX ) ) return ; |
TETSUYA | 4:b68843c0269c | 568 | //if ( dst_x > Dis_X_MAX )||( dst_y > Dis_Y_MAX ) return; |
TETSUYA | 4:b68843c0269c | 569 | |
TETSUYA | 4:b68843c0269c | 570 | |
TETSUYA | 4:b68843c0269c | 571 | p=0; |
TETSUYA | 4:b68843c0269c | 572 | cmd[p++] = GAC_COPY_AREA; // |
TETSUYA | 4:b68843c0269c | 573 | cmd[p++] = (unsigned char)src_x1; |
TETSUYA | 4:b68843c0269c | 574 | cmd[p++] = (unsigned char)src_y1; |
TETSUYA | 4:b68843c0269c | 575 | cmd[p++] = (unsigned char)src_x2; |
TETSUYA | 4:b68843c0269c | 576 | cmd[p++] = (unsigned char)src_y2; |
TETSUYA | 4:b68843c0269c | 577 | cmd[p++] = (unsigned char)dst_x; |
TETSUYA | 4:b68843c0269c | 578 | cmd[p++] = (unsigned char)dst_y; |
TETSUYA | 4:b68843c0269c | 579 | |
TETSUYA | 4:b68843c0269c | 580 | RegWriteM(cmd, p); |
TETSUYA | 4:b68843c0269c | 581 | |
TETSUYA | 4:b68843c0269c | 582 | } |
TETSUYA | 4:b68843c0269c | 583 | } |
TETSUYA | 2:e331851128c1 | 584 | |
TETSUYA | 4:b68843c0269c | 585 | // スクロール設定 |
TETSUYA | 4:b68843c0269c | 586 | void SPIOLED96x64::ScrollSet(int a, int b, int c, int d , int frame_interval) |
TETSUYA | 4:b68843c0269c | 587 | { |
TETSUYA | 4:b68843c0269c | 588 | if ( GAC_Useflag ){ |
TETSUYA | 4:b68843c0269c | 589 | // SSD1331/1332用 GAC(アクセラレートコマンド) |
TETSUYA | 4:b68843c0269c | 590 | unsigned char cmd[11]={ 0 }; |
TETSUYA | 4:b68843c0269c | 591 | int p; |
TETSUYA | 4:b68843c0269c | 592 | //if ( ( startline > Dis_Y_MAX+1 )||( (startline+lincount) > Dis_Y_MAX+1 ) ) return ; |
TETSUYA | 4:b68843c0269c | 593 | if ( frame_interval > 3 ) frame_interval = 3; |
TETSUYA | 4:b68843c0269c | 594 | |
TETSUYA | 4:b68843c0269c | 595 | p=0; |
TETSUYA | 4:b68843c0269c | 596 | cmd[p++] = GAC_SCROLL_SETUP; // |
TETSUYA | 4:b68843c0269c | 597 | cmd[p++] = (unsigned char)a; |
TETSUYA | 4:b68843c0269c | 598 | cmd[p++] = (unsigned char)b; |
TETSUYA | 4:b68843c0269c | 599 | cmd[p++] = (unsigned char)c; |
TETSUYA | 4:b68843c0269c | 600 | cmd[p++] = (unsigned char)d; |
TETSUYA | 4:b68843c0269c | 601 | cmd[p++] = (unsigned char)frame_interval; |
TETSUYA | 4:b68843c0269c | 602 | |
TETSUYA | 4:b68843c0269c | 603 | RegWriteM(cmd, p); |
TETSUYA | 4:b68843c0269c | 604 | |
TETSUYA | 4:b68843c0269c | 605 | } |
TETSUYA | 4:b68843c0269c | 606 | |
TETSUYA | 4:b68843c0269c | 607 | } |
TETSUYA | 4:b68843c0269c | 608 | void SPIOLED96x64::Scroll(int enable) |
TETSUYA | 4:b68843c0269c | 609 | { |
TETSUYA | 4:b68843c0269c | 610 | if ( GAC_Useflag ){ |
TETSUYA | 4:b68843c0269c | 611 | // SSD1331/1332用 GAC(アクセラレートコマンド) |
TETSUYA | 4:b68843c0269c | 612 | unsigned char cmd = (enable) ? GAC_SCROLL_START : GAC_SCROLL_STOP; // |
TETSUYA | 4:b68843c0269c | 613 | |
TETSUYA | 4:b68843c0269c | 614 | RegWrite(cmd); |
TETSUYA | 4:b68843c0269c | 615 | |
TETSUYA | 4:b68843c0269c | 616 | } |
TETSUYA | 4:b68843c0269c | 617 | } |
TETSUYA | 2:e331851128c1 | 618 |