Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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 |