ALO-095BWNN-J9 aitendo OLED 96x64 SPI model Ver1.04

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?

UserRevisionLine numberNew 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