Руссификация SD1306(OLED 128x64)

gppsoft
Offline
Зарегистрирован: 13.10.2014

Всем привет. Работаю с дисплеем напрямую без библиотек(по даташиту). Все замечательно, но никак не могу добавить поддержку криллицы. Как я понял символы определены как последовательность байт в массиве. При использовании латинских символов просто считывается элемент массива индекс которого равен коду символа. Но как быть с кирилицей? Пробовал влоб вставить массив из вот этой  статьи, но ничего не выходит. Печатается только "Hello World". Куда копать? Заранее спасибо!


#define SSD1306_LCDWIDTH     128
#define SSD1306_LCDHEIGHT     64
#define SSD1306_OLED_ADDRESS 0x3C
#define SSD1306_COLUMNADDR   0x21
#define SSD1306_PAGEADDR     0x22
#define SSD1306_COMMAND_MODE 0x80
#define SSD1306_DATA_MODE	 0x40
#define SSD1306_DISPLAYOFF   0xAE
#define SSD1306_DISPLAYON    0xAF
#define SSD1306_SETDISPLAYCLOCKDIV 0xD5
#define SSD1306_SETMULTIPLEX 0xA8
#define SSD1306_SETDISPLAYOFFSET 0xD3
#define SSD1306_SETSTARTLINE 0x40
#define SSD1306_CHARGEPUMP 0x8D

#define SSD1306_MEMORYMODE 0x20
#define SSD1306_COLUMNADDR 0x21
#define SSD1306_PAGEADDR   0x22
#define SSD1306_COMSCANINC 0xC0
#define SSD1306_COMSCANDEC 0xC8

#define SSD1306_SEGREMAP 0xA0
#define SSD1306_SETCONTRAST 0x81
#define SSD1306_SETCOMPINS 0xDA
#define SSD1306_SETPRECHARGE 0xD9
#define SSD1306_SETVCOMDETECT 0xDB
#define SSD1306_DISPLAYALLON_RESUME 0xA4
#define SSD1306_NORMALDISPLAY 0xA6
#define SSD1306_INVERTDISPLAY 0xA7

#define BLACK 0
#define WHITE 1
#define INVERSE 2

#define I2C_400KHZ 1

#include <Wire.h>


const byte BasicFont[][5] PROGMEM = {
	0x00, 0x00, 0x00, 0x00, 0x00,// (space) 0x20
	0x00, 0x00, 0x5F, 0x00, 0x00,// !	0x21
	0x00, 0x07, 0x00, 0x07, 0x00,// "	0x22
	0x14, 0x7F, 0x14, 0x7F, 0x14,// #	0x23
	0x24, 0x2A, 0x7F, 0x2A, 0x12,// $	0x24
	0x23, 0x13, 0x08, 0x64, 0x62,// %	0x25
	0x36, 0x49, 0x55, 0x22, 0x50,// &	0x26
	0x00, 0x05, 0x03, 0x00, 0x00,// '	0x27
	0x00, 0x1C, 0x22, 0x41, 0x00,// (	0x28
	0x00, 0x41, 0x22, 0x1C, 0x00,// )	0x29
	0x08, 0x2A, 0x1C, 0x2A, 0x08,// *	0x2A
	0x08, 0x08, 0x3E, 0x08, 0x08,// +	0x2B
	0x00, 0x50, 0x30, 0x00, 0x00,// ,	0x2C
	0x08, 0x08, 0x08, 0x08, 0x08,// -	0x2D
	0x00, 0x60, 0x60, 0x00, 0x00,// .	0x2E
	0x20, 0x10, 0x08, 0x04, 0x02,// /	0x2F
	0x3E, 0x51, 0x49, 0x45, 0x3E,// 	0x30
	0x00, 0x42, 0x7F, 0x40, 0x00,// 1	0x31
	0x42, 0x61, 0x51, 0x49, 0x46,// 2	0x32
	0x21, 0x41, 0x45, 0x4B, 0x31,// 3	0x33
	0x18, 0x14, 0x12, 0x7F, 0x10,// 4	0x34
	0x27, 0x45, 0x45, 0x45, 0x39,// 5	0x35
	0x3C, 0x4A, 0x49, 0x49, 0x30,// 6	0x36
	0x01, 0x71, 0x09, 0x05, 0x03,// 7	0x37
	0x36, 0x49, 0x49, 0x49, 0x36,// 8	0x38
	0x06, 0x49, 0x49, 0x29, 0x1E,// 9	0x39
	0x00, 0x36, 0x36, 0x00, 0x00,// :	0x3A
	0x00, 0x56, 0x36, 0x00, 0x00,// ;	0x3B
	0x00, 0x08, 0x14, 0x22, 0x41,// <	0x3C
	0x14, 0x14, 0x14, 0x14, 0x14,// =	0x3D
	0x41, 0x22, 0x14, 0x08, 0x00,// >	0x3E
	0x02, 0x01, 0x51, 0x09, 0x06,// ?	0x3F
	0x32, 0x49, 0x79, 0x41, 0x3E,// @	0x40
	0x7E, 0x11, 0x11, 0x11, 0x7E,// A	0x41
	0x7F, 0x49, 0x49, 0x49, 0x36,// B	0x42
	0x3E, 0x41, 0x41, 0x41, 0x22,// C	0x43
	0x7F, 0x41, 0x41, 0x22, 0x1C,// D	0x44
	0x7F, 0x49, 0x49, 0x49, 0x41,// E	0x45
	0x7F, 0x09, 0x09, 0x01, 0x01,// F	0x46
	0x3E, 0x41, 0x41, 0x51, 0x32,// G	0x47
	0x7F, 0x08, 0x08, 0x08, 0x7F,// H	0x48
	0x00, 0x41, 0x7F, 0x41, 0x00,// I	0x49
	0x20, 0x40, 0x41, 0x3F, 0x01,// J	0x4A
	0x7F, 0x08, 0x14, 0x22, 0x41,// K	0x4B
	0x7F, 0x40, 0x40, 0x40, 0x40,// L	0x4C
	0x7F, 0x02, 0x04, 0x02, 0x7F,// M	0x4D
	0x7F, 0x04, 0x08, 0x10, 0x7F,// N	0x4E
	0x3E, 0x41, 0x41, 0x41, 0x3E,// O	0x4F
	0x7F, 0x09, 0x09, 0x09, 0x06,// P	0x50
	0x3E, 0x41, 0x51, 0x21, 0x5E,// Q	0x51
	0x7F, 0x09, 0x19, 0x29, 0x46,// R	0x52
	0x46, 0x49, 0x49, 0x49, 0x31,// S	0x53
	0x01, 0x01, 0x7F, 0x01, 0x01,// T	0x54
	0x3F, 0x40, 0x40, 0x40, 0x3F,// U	0x55
	0x1F, 0x20, 0x40, 0x20, 0x1F,// V	0x56
	0x7F, 0x20, 0x18, 0x20, 0x7F,// W	0x57
	0x63, 0x14, 0x08, 0x14, 0x63,// X	0x58
	0x03, 0x04, 0x78, 0x04, 0x03,// Y	0x59
	0x61, 0x51, 0x49, 0x45, 0x43,// Z	0x5A
	0x00, 0x00, 0x7F, 0x41, 0x41,// [	0x5B
	0x02, 0x04, 0x08, 0x10, 0x20,// "\"	0x5C
	0x41, 0x41, 0x7F, 0x00, 0x00,// ]	0x5D
	0x04, 0x02, 0x01, 0x02, 0x04,// ^	0x5E
	0x40, 0x40, 0x40, 0x40, 0x40,// _	0x5F
	0x00, 0x01, 0x02, 0x04, 0x00,// `	0x60
	0x20, 0x54, 0x54, 0x54, 0x78,// a	0x61
	0x7F, 0x48, 0x44, 0x44, 0x38,// b	0x62
	0x38, 0x44, 0x44, 0x44, 0x20,// c	0x63
	0x38, 0x44, 0x44, 0x48, 0x7F,// d	0x64
	0x38, 0x54, 0x54, 0x54, 0x18,// e	0x65
	0x08, 0x7E, 0x09, 0x01, 0x02,// f	0x66
	0x08, 0x14, 0x54, 0x54, 0x3C,// g	0x67
	0x7F, 0x08, 0x04, 0x04, 0x78,// h	0x68
	0x00, 0x44, 0x7D, 0x40, 0x00,// i	0x69
	0x20, 0x40, 0x44, 0x3D, 0x00,// j	0x6A
	0x00, 0x7F, 0x10, 0x28, 0x44,// k	0x6B
	0x00, 0x41, 0x7F, 0x40, 0x00,// l	0x6C
	0x7C, 0x04, 0x18, 0x04, 0x78,// m	0x6D
	0x7C, 0x08, 0x04, 0x04, 0x78,// n	0x6E
	0x38, 0x44, 0x44, 0x44, 0x38,// o	0x6F
	0x7C, 0x14, 0x14, 0x14, 0x08,// p	0x70
	0x08, 0x14, 0x14, 0x18, 0x7C,// q	0x71
	0x7C, 0x08, 0x04, 0x04, 0x08,// r	0x72
	0x48, 0x54, 0x54, 0x54, 0x20,// s	0x73
	0x04, 0x3F, 0x44, 0x40, 0x20,// t	0x74
	0x3C, 0x40, 0x40, 0x20, 0x7C,// u	0x75
	0x1C, 0x20, 0x40, 0x20, 0x1C,// v	0x76
	0x3C, 0x40, 0x30, 0x40, 0x3C,// w	0x77
	0x44, 0x28, 0x10, 0x28, 0x44,// x	0x78
	0x0C, 0x50, 0x50, 0x50, 0x3C,// y	0x79
	0x44, 0x64, 0x54, 0x4C, 0x44,// z	0x7A
	0x00, 0x08, 0x36, 0x41, 0x00,// {	0x7B
	0x00, 0x00, 0x7F, 0x00, 0x00,// |	0x7C
	0x00, 0x41, 0x36, 0x08, 0x00,// }	0x7D
	0x08, 0x08, 0x2A, 0x1C, 0x08,// ->	0x7E
	0x08, 0x1C, 0x2A, 0x08, 0x08, // <-	0x7F
	0x7C, 0x14, 0x14, 0x14, 0x08,//p 	0x80
	0x38, 0x44, 0x44, 0x44, 0x20,//c	0x81
	0x04, 0x04, 0x7c, 0x04, 0x04,//т	0x82
	0x0C, 0x50, 0x50, 0x50, 0x3C,//у	0x83
	0x30, 0x48, 0xfc, 0x48, 0x30,//ф	0x84
	0x44, 0x28, 0x10, 0x28, 0x44,//x	0x85
	0x7c, 0x40, 0x40, 0x40, 0xfc,//ц	0x86
	0x0c, 0x10, 0x10, 0x10, 0x7c,//ч	0x87
	0x7c, 0x40, 0x7c, 0x40, 0x7c,//ш	0x88
	0x7c, 0x40, 0x7c, 0x40, 0xfc,//щ	0x89
	0x04, 0x7c, 0x50, 0x50, 0x20,//ъ	0x8A
	0x7c, 0x50, 0x50, 0x20, 0x7c,//ы	0x8B
	0x7c, 0x50, 0x50, 0x20, 0x00,//ь	0x8C
	0x28, 0x44, 0x54, 0x54, 0x38,//э	0x8D
	0x7c, 0x10, 0x38, 0x44, 0x38,//ю	0x8E
	0x08, 0x54, 0x34, 0x14, 0x7c,//я	0x8F
	0x7e, 0x11, 0x11, 0x11, 0x7e,//A	0x90
	0x7f, 0x49, 0x49, 0x49, 0x33,//Б	0x91
	0x7f, 0x49, 0x49, 0x49, 0x36,//В	0x92
	0x7f, 0x01, 0x01, 0x01, 0x03,//Г	0x93
	0xe0, 0x51, 0x4f, 0x41, 0xff,//Д	0x94
	0x7f, 0x49, 0x49, 0x49, 0x41,//E	0x95
	0x77, 0x08, 0x7f, 0x08, 0x77,//Ж	0x96
	0x41, 0x49, 0x49, 0x49, 0x36,//З	0x97
	0x7f, 0x10, 0x08, 0x04, 0x7f,//И	0x98
	0x7c, 0x21, 0x12, 0x09, 0x7c,//Й	0x99
	0x7f, 0x08, 0x14, 0x22, 0x41,//K	0x9A
	0x20, 0x41, 0x3f, 0x01, 0x7f,//Л	0x9B
	0x7f, 0x02, 0x0c, 0x02, 0x7f,//M	0x9C
	0x7f, 0x08, 0x08, 0x08, 0x7f,//H	0x9D
	0x3e, 0x41, 0x41, 0x41, 0x3e,//O	0x9E
	0x7f, 0x01, 0x01, 0x01, 0x7f,//П	0x9F
	0x7f, 0x09, 0x09, 0x09, 0x06,//P	0xA0
	0x3e, 0x41, 0x41, 0x41, 0x22,//C	0xA1
	0x01, 0x01, 0x7f, 0x01, 0x01,//T	0xA2
	0x47, 0x28, 0x10, 0x08, 0x07,//У	0xA3
	0x1c, 0x22, 0x7f, 0x22, 0x1c,//Ф	0xA4
	0x63, 0x14, 0x08, 0x14, 0x63,//X	0xA5
	0x7f, 0x40, 0x40, 0x40, 0xff,//Ц	0xA6
	0x07, 0x08, 0x08, 0x08, 0x7f,//Ч	0xA7
	0x7f, 0x40, 0x7f, 0x40, 0x7f,//Ш	0xA8
	0x7f, 0x40, 0x7f, 0x40, 0xff,//Щ	0xA9
	0x01, 0x7f, 0x48, 0x48, 0x30,//Ъ	0xAA
	0x7f, 0x48, 0x30, 0x00, 0x7f,//Ы	0xAB
	0x00, 0x7f, 0x48, 0x48, 0x30,//Э	0xAC
	0x22, 0x41, 0x49, 0x49, 0x3e,//Ь	0xAD
	0x7f, 0x08, 0x3e, 0x41, 0x3e,//Ю	0xAE
	0x46, 0x29, 0x19, 0x09, 0x7f,//Я	0xAF
 	0x20, 0x54, 0x54, 0x54, 0x78,//a	0xB0
	0x3c, 0x4a, 0x4a, 0x49, 0x31,//б	0xB1
	0x7c, 0x54, 0x54, 0x28, 0x00,//в	0xB2
	0x7c, 0x04, 0x04, 0x04, 0x0c,//г	0xB3
	0xe0, 0x54, 0x4c, 0x44, 0xfc,//д	0xB4
	0x38, 0x54, 0x54, 0x54, 0x18,//e	0xB5
	0x6c, 0x10, 0x7c, 0x10, 0x6c,//ж	0xB6
	0x44, 0x44, 0x54, 0x54, 0x28,//з	0xB7
	0x7c, 0x20, 0x10, 0x08, 0x7c,//и	0xB8
	0x7c, 0x41, 0x22, 0x11, 0x7c,//й	0xB9
	0x7c, 0x10, 0x28, 0x44, 0x00,//к	0xBA
	0x20, 0x44, 0x3c, 0x04, 0x7c,//л	0xBB
	0x7c, 0x08, 0x10, 0x08, 0x7c,//м	0xBC
	0x7c, 0x10, 0x10, 0x10, 0x7c,//н	0xBD
	0x38, 0x44, 0x44, 0x44, 0x38,//o	0xBE
	0x7c, 0x04, 0x04, 0x04, 0x7c //п	0xBF 
};


void setup(){
	initDisplay();
	printString("Hello!",0,0,6);
	printString("Привет!",0,1,7);
}

void loop(){
	
}

//Инициализация дисплея
void initDisplay(){

	if (I2C_400KHZ){
		// save I2C bitrate (default 100Khz)
		byte twbrbackup = TWBR;
		TWBR = 12; 
		//TWBR = twbrbackup;
		//Serial.println(TWBR, DEC);
		//Serial.println(TWSR & 0x3, DEC);
	}

	sendCommand(SSD1306_DISPLAYOFF);//Выключаем дисплей
	sendCommand(SSD1306_SETDISPLAYCLOCKDIV);//Синхронизация тактирования походу :)
	sendCommand(SSD1306_COMMAND_MODE);//Drk.xftv ht;bv 
	sendCommand(SSD1306_SETMULTIPLEX);
	sendCommand(0x3F);
	sendCommand(SSD1306_SETDISPLAYOFFSET);  
	sendCommand(0x00);
	sendCommand(SSD1306_SETSTARTLINE | 0x0);            // line #0
	sendCommand(SSD1306_CHARGEPUMP);                    // 0x8D
	sendCommand(0x14); // [2] charge pump setting (p62): 0x014 enable, 0x010 disable 
	sendCommand(SSD1306_MEMORYMODE);                    // 0x20
	sendCommand(0x00);                                  // 0x0 act like ks0108
	sendCommand(SSD1306_SEGREMAP | 0x1);
	sendCommand(SSD1306_COMSCANDEC);

	sendCommand(SSD1306_SETCOMPINS);                    // 0xDA
	sendCommand(0x12);

	sendCommand(SSD1306_SETCONTRAST);
	sendCommand(0xCF);

	sendCommand(SSD1306_SETPRECHARGE); 
	sendCommand(0xF1);

	sendCommand(SSD1306_SETVCOMDETECT);                 // 0xDB
	sendCommand(0x40);
	sendCommand(SSD1306_DISPLAYALLON_RESUME);           // 0xA4
	sendCommand(SSD1306_NORMALDISPLAY);                 // 0xA6

	sendCommand(SSD1306_DISPLAYON);

}


void printChar(byte C, byte X, byte Y){
	setCursor(X,Y);
    
	for(byte i=0; i<5; i++) {
       sendData(pgm_read_byte(&BasicFont[C-32][i]));
    }
}

void printString(const char *String, byte X, byte Y, byte numChar){
	byte cursor = X;
	byte count=0;
    while(String[count] && count<numChar){
		setCursor(cursor, Y);
		printChar(String[count++],cursor,Y);
		cursor+=8;
	}
}




void setCursor(byte x, byte y){
	sendCommand(SSD1306_COLUMNADDR);
	sendCommand(x);   
	sendCommand(x+6);

	sendCommand(SSD1306_PAGEADDR);
	sendCommand(y);
	sendCommand(y);
}


void invertDisplay(uint8_t i) {
	if (i) {
		sendCommand(SSD1306_INVERTDISPLAY);
	} else {
		sendCommand(SSD1306_NORMALDISPLAY);
	}
}

void sendCommand(byte command){
	Wire.beginTransmission(SSD1306_OLED_ADDRESS);
	Wire.write(0x00);
	Wire.write(command);
	Wire.endTransmission();
}

void sendData(byte command){
	Wire.beginTransmission(SSD1306_OLED_ADDRESS);
	Wire.write(0x40);
	Wire.write(command);
	Wire.endTransmission();
}

 

faraddin
Offline
Зарегистрирован: 11.08.2013

В ветке Общий есть та же тема только для дисплея 5110

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Основная проблема это определение кода кирилического символа который нужно выводить - ведь корилица в юникоде состоит из 2 байт(первый это номер таблицы, второй код символа в таблице), а у вас нет проверки байта таблицы -эти байты нужно пропускать.

    char table = 0x00;
    while(String[count] && count<numChar){
        char c = String[count++];
        if (c >= 0x20){
            setCursor(cursor, Y);
            printChar(table,c,cursor,Y);
            cursor+=8;
        }else{
            table = c;
        } 
    }
void printChar(byte T,byte C, byte X, byte Y){
    setCursor(X,Y);
    byte offset =  0x20;
    if(T == 0x04){
        offset = 0x80;
    }
    for(byte i=0; i<5; i++) {
       sendData(pgm_read_byte(&BasicFont[C-offset][i]));
    }
}

 

gppsoft
Offline
Зарегистрирован: 13.10.2014

NeiroN пишет:

Основная проблема это определение кода кирилического символа который нужно выводить - ведь корилица в юникоде состоит из 2 байт(первый это номер таблицы, второй код символа в таблице), а у вас нет проверки байта таблицы -эти байты нужно пропускать.

    char table = 0x00;
    while(String[count] && count<numChar){
        char c = String[count++];
        if (c >= 0x20){
            setCursor(cursor, Y);
            printChar(table,c,cursor,Y);
            cursor+=8;
        }else{
            table = c;
        } 
    }
void printChar(byte T,byte C, byte X, byte Y){
    setCursor(X,Y);
    byte offset =  0x20;
    if(T == 0x04){
        offset = 0x80;
    }
    for(byte i=0; i<5; i++) {
       sendData(pgm_read_byte(&BasicFont[C-offset][i]));
    }
}

К сожалению не работает. Кирилица в кракозябрах и латиница кривовата стала :)

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

я что за вас еще считать все должен? Все смещения? Вы вообще поняли что я имелл вииду? Таблицу символов виндовую откройте хотябы.


void printChar(byte T,byte C, byte X, byte Y){
    setCursor(X,Y);
    byte sym =  C-0x20;
    if(T == 0x04){
        sym = C+0x50; // Для буквы А код в таблице 0x10, а смещение в памяти 0x60
    }
    for(byte i=0; i<5; i++) {
       sendData(pgm_read_byte(&BasicFont[sym][i]));
    }
}

Учитесь думать прежде чем что-то вставить.

А еще надо сделать правильной вашу таблицу там со смещением 0x60 должны быть Буквы АБВГДЕЖЗИКЛМН 

gppsoft
Offline
Зарегистрирован: 13.10.2014

NeiroN пишет:

я что за вас еще считать все должен? Все смещения? Вы вообще поняли что я имелл вииду? Таблицу символов виндовую откройте хотябы.


void printChar(byte T,byte C, byte X, byte Y){
    setCursor(X,Y);
    byte sym =  C-0x20;
    if(T == 0x04){
        sym = C+0x50; // Для буквы А код в таблице 0x10, а смещение в памяти 0x60
    }
    for(byte i=0; i<5; i++) {
       sendData(pgm_read_byte(&BasicFont[sym][i]));
    }
}

Учитесь думать прежде чем что-то вставить.

Спасибо за помощь конечно. Но я не понял причем тут смещения? В данном массиве графические представления символов. 

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Ну для не понятных скажу еще раз - ваша таблица начинается с 0х20 -  тоесть 0x20(код символа) должно стать равно 0х00(данные символа) - вот 0х20 это смещение для сопоставление ANSI таблицы(0x00 таблица в юникоде) и вашей таблицы данных(чтобы считать нужные данные).

А чтобы сопоставить таблицу кирилицы юникода к вашей таблице данных нужно рассчитать смещение - потому что вы используете не все символы из 0х04 таблицы юникода. В таблице идут вначале заглавные буквы, потом строчные - данные нужно привести к этому же виду. И если таблица 0х04 то смещение должно быть таким чтобы код 0х10 (символ) указывал на букву "А" в таблице данных. В таблице данных буква А стоит(должна быть там после этих стрелок) на позиции 0х60 и ее код 0х10 - значит к коду символа нужно добавлять 0х50 (0х10+0х50 = 0х60).

 

gppsoft
Offline
Зарегистрирован: 13.10.2014

NeiroN пишет:

Ну для не понятных скажу еще раз - ваша таблица начинается с 0х20 -  тоесть 0x20(код символа) должно стать равно 0х00(данные символа) - вот 0х20 это смещение для сопоставление ANSI таблицы(0x00 таблица в юникоде) и вашей таблицы данных(чтобы считать нужные данные).

А чтобы сопоставить таблицу кирилицы юникода к вашей таблице данных нужно рассчитать смещение - потому что вы используете не все символы из 0х04 таблицы юникода. В таблице идут вначале заглавные буквы, потом строчные - данные нужно привести к этому же виду. И если таблица 0х04 то смещение должно быть таким чтобы код 0х10 (символ) указывал на букву "А" в таблице данных. В таблице данных буква А стоит(должна быть там после этих стрелок) на позиции 0х60 и ее код 0х10 - значит к коду символа нужно добавлять 0х50 (0х10+0х50 = 0х60).

 

 

К сожалению я вас не понимаю. Причем тут коды символов в UTF и ASCII? В этом массиве предствлено графическое отображение каждого символа. Если к примеру символ '!', то возьмется 1(первый) элемент массива и все его байты(8*8) будут отправлены на дисплей. Где 0 это потушить пиксель а 1 зажечь. Причем тут преобразование? :)

Вот еще пример(только латинские символы) 8х8 пикселей:

#define SSD1306_LCDWIDTH     128
#define SSD1306_LCDHEIGHT     64
#define SSD1306_OLED_ADDRESS 0x3C
#define SSD1306_COLUMNADDR   0x21
#define SSD1306_PAGEADDR     0x22
#define SSD1306_COMMAND_MODE 0x80
#define SSD1306_DATA_MODE	 0x40
#define SSD1306_DISPLAYOFF   0xAE
#define SSD1306_DISPLAYON    0xAF
#define SSD1306_SETDISPLAYCLOCKDIV 0xD5
#define SSD1306_SETMULTIPLEX 0xA8
#define SSD1306_SETDISPLAYOFFSET 0xD3
#define SSD1306_SETSTARTLINE 0x40
#define SSD1306_CHARGEPUMP 0x8D

#define SSD1306_MEMORYMODE 0x20
#define SSD1306_COLUMNADDR 0x21
#define SSD1306_PAGEADDR   0x22
#define SSD1306_COMSCANINC 0xC0
#define SSD1306_COMSCANDEC 0xC8

#define SSD1306_SEGREMAP 0xA0
#define SSD1306_SETCONTRAST 0x81
#define SSD1306_SETCOMPINS 0xDA
#define SSD1306_SETPRECHARGE 0xD9
#define SSD1306_SETVCOMDETECT 0xDB
#define SSD1306_DISPLAYALLON_RESUME 0xA4
#define SSD1306_NORMALDISPLAY 0xA6
#define SSD1306_INVERTDISPLAY 0xA7

#define BLACK 0
#define WHITE 1
#define INVERSE 2

#define I2C_400KHZ 1

#include <Wire.h>


const byte BasicFont[][8] PROGMEM = {
	{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
	{0x00,0x00,0x5F,0x00,0x00,0x00,0x00,0x00},
	{0x00,0x00,0x07,0x00,0x07,0x00,0x00,0x00},
	{0x00,0x14,0x7F,0x14,0x7F,0x14,0x00,0x00},
	{0x00,0x24,0x2A,0x7F,0x2A,0x12,0x00,0x00},
	{0x00,0x23,0x13,0x08,0x64,0x62,0x00,0x00},
	{0x00,0x36,0x49,0x55,0x22,0x50,0x00,0x00},
	{0x00,0x00,0x05,0x03,0x00,0x00,0x00,0x00},
	{0x00,0x1C,0x22,0x41,0x00,0x00,0x00,0x00},
	{0x00,0x41,0x22,0x1C,0x00,0x00,0x00,0x00},
	{0x00,0x08,0x2A,0x1C,0x2A,0x08,0x00,0x00},
	{0x00,0x08,0x08,0x3E,0x08,0x08,0x00,0x00},
	{0x00,0xA0,0x60,0x00,0x00,0x00,0x00,0x00},
	{0x00,0x08,0x08,0x08,0x08,0x08,0x00,0x00},
	{0x00,0x60,0x60,0x00,0x00,0x00,0x00,0x00},
	{0x00,0x20,0x10,0x08,0x04,0x02,0x00,0x00},
	{0x00,0x3E,0x51,0x49,0x45,0x3E,0x00,0x00},
	{0x00,0x00,0x42,0x7F,0x40,0x00,0x00,0x00},
	{0x00,0x62,0x51,0x49,0x49,0x46,0x00,0x00},
	{0x00,0x22,0x41,0x49,0x49,0x36,0x00,0x00},
	{0x00,0x18,0x14,0x12,0x7F,0x10,0x00,0x00},
	{0x00,0x27,0x45,0x45,0x45,0x39,0x00,0x00},
	{0x00,0x3C,0x4A,0x49,0x49,0x30,0x00,0x00},
	{0x00,0x01,0x71,0x09,0x05,0x03,0x00,0x00},
	{0x00,0x36,0x49,0x49,0x49,0x36,0x00,0x00},
	{0x00,0x06,0x49,0x49,0x29,0x1E,0x00,0x00},
	{0x00,0x00,0x36,0x36,0x00,0x00,0x00,0x00},
	{0x00,0x00,0xAC,0x6C,0x00,0x00,0x00,0x00},
	{0x00,0x08,0x14,0x22,0x41,0x00,0x00,0x00},
	{0x00,0x14,0x14,0x14,0x14,0x14,0x00,0x00},
	{0x00,0x41,0x22,0x14,0x08,0x00,0x00,0x00},
	{0x00,0x02,0x01,0x51,0x09,0x06,0x00,0x00},
	{0x00,0x32,0x49,0x79,0x41,0x3E,0x00,0x00},
	{0x00,0x7E,0x09,0x09,0x09,0x7E,0x00,0x00},
	{0x00,0x7F,0x49,0x49,0x49,0x36,0x00,0x00},
	{0x00,0x3E,0x41,0x41,0x41,0x22,0x00,0x00},
	{0x00,0x7F,0x41,0x41,0x22,0x1C,0x00,0x00},
	{0x00,0x7F,0x49,0x49,0x49,0x41,0x00,0x00},
	{0x00,0x7F,0x09,0x09,0x09,0x01,0x00,0x00},
	{0x00,0x3E,0x41,0x41,0x51,0x72,0x00,0x00},
	{0x00,0x7F,0x08,0x08,0x08,0x7F,0x00,0x00},
	{0x00,0x41,0x7F,0x41,0x00,0x00,0x00,0x00},
	{0x00,0x20,0x40,0x41,0x3F,0x01,0x00,0x00},
	{0x00,0x7F,0x08,0x14,0x22,0x41,0x00,0x00},
	{0x00,0x7F,0x40,0x40,0x40,0x40,0x00,0x00},
	{0x00,0x7F,0x02,0x0C,0x02,0x7F,0x00,0x00},
	{0x00,0x7F,0x04,0x08,0x10,0x7F,0x00,0x00},
	{0x00,0x3E,0x41,0x41,0x41,0x3E,0x00,0x00},
	{0x00,0x7F,0x09,0x09,0x09,0x06,0x00,0x00},
	{0x00,0x3E,0x41,0x51,0x21,0x5E,0x00,0x00},
	{0x00,0x7F,0x09,0x19,0x29,0x46,0x00,0x00},
	{0x00,0x26,0x49,0x49,0x49,0x32,0x00,0x00},
	{0x00,0x01,0x01,0x7F,0x01,0x01,0x00,0x00},
	{0x00,0x3F,0x40,0x40,0x40,0x3F,0x00,0x00},
	{0x00,0x1F,0x20,0x40,0x20,0x1F,0x00,0x00},
	{0x00,0x3F,0x40,0x38,0x40,0x3F,0x00,0x00},
	{0x00,0x63,0x14,0x08,0x14,0x63,0x00,0x00},
	{0x00,0x03,0x04,0x78,0x04,0x03,0x00,0x00},
	{0x00,0x61,0x51,0x49,0x45,0x43,0x00,0x00},
	{0x00,0x7F,0x41,0x41,0x00,0x00,0x00,0x00},
	{0x00,0x02,0x04,0x08,0x10,0x20,0x00,0x00},
	{0x00,0x41,0x41,0x7F,0x00,0x00,0x00,0x00},
	{0x00,0x04,0x02,0x01,0x02,0x04,0x00,0x00},
	{0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00},
	{0x00,0x01,0x02,0x04,0x00,0x00,0x00,0x00},
	{0x00,0x20,0x54,0x54,0x54,0x78,0x00,0x00},
	{0x00,0x7F,0x48,0x44,0x44,0x38,0x00,0x00},
	{0x00,0x38,0x44,0x44,0x28,0x00,0x00,0x00},
	{0x00,0x38,0x44,0x44,0x48,0x7F,0x00,0x00},
	{0x00,0x38,0x54,0x54,0x54,0x18,0x00,0x00},
	{0x00,0x08,0x7E,0x09,0x02,0x00,0x00,0x00},
	{0x00,0x18,0xA4,0xA4,0xA4,0x7C,0x00,0x00},
	{0x00,0x7F,0x08,0x04,0x04,0x78,0x00,0x00},
	{0x00,0x00,0x7D,0x00,0x00,0x00,0x00,0x00},
	{0x00,0x80,0x84,0x7D,0x00,0x00,0x00,0x00},
	{0x00,0x7F,0x10,0x28,0x44,0x00,0x00,0x00},
	{0x00,0x41,0x7F,0x40,0x00,0x00,0x00,0x00},
	{0x00,0x7C,0x04,0x18,0x04,0x78,0x00,0x00},
	{0x00,0x7C,0x08,0x04,0x7C,0x00,0x00,0x00},
	{0x00,0x38,0x44,0x44,0x38,0x00,0x00,0x00},
	{0x00,0xFC,0x24,0x24,0x18,0x00,0x00,0x00},
	{0x00,0x18,0x24,0x24,0xFC,0x00,0x00,0x00},
	{0x00,0x00,0x7C,0x08,0x04,0x00,0x00,0x00},
	{0x00,0x48,0x54,0x54,0x24,0x00,0x00,0x00},
	{0x00,0x04,0x7F,0x44,0x00,0x00,0x00,0x00},
	{0x00,0x3C,0x40,0x40,0x7C,0x00,0x00,0x00},
	{0x00,0x1C,0x20,0x40,0x20,0x1C,0x00,0x00},
	{0x00,0x3C,0x40,0x30,0x40,0x3C,0x00,0x00},
	{0x00,0x44,0x28,0x10,0x28,0x44,0x00,0x00},
	{0x00,0x1C,0xA0,0xA0,0x7C,0x00,0x00,0x00},
	{0x00,0x44,0x64,0x54,0x4C,0x44,0x00,0x00},
	{0x00,0x08,0x36,0x41,0x00,0x00,0x00,0x00},
	{0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00},
	{0x00,0x41,0x36,0x08,0x00,0x00,0x00,0x00},
	{0x00,0x02,0x01,0x01,0x02,0x01,0x00,0x00},
	{0x00,0x02,0x05,0x05,0x02,0x00,0x00,0x00} 
};

void setup(){
	initDisplay();
	printString("Hello!",0,0,6);
	printString("123",0,1,7);
}

void loop(){
	
}

//Инициализация дисплея
void initDisplay(){

	if (I2C_400KHZ){
		// save I2C bitrate (default 100Khz)
		byte twbrbackup = TWBR;
		TWBR = 12; 
		//TWBR = twbrbackup;
		//Serial.println(TWBR, DEC);
		//Serial.println(TWSR & 0x3, DEC);
	}

	sendCommand(SSD1306_DISPLAYOFF);//Выключаем дисплей
	sendCommand(SSD1306_SETDISPLAYCLOCKDIV);//Синхронизация тактирования походу :)
	sendCommand(SSD1306_COMMAND_MODE);//Drk.xftv ht;bv 
	sendCommand(SSD1306_SETMULTIPLEX);
	sendCommand(0x3F);
	sendCommand(SSD1306_SETDISPLAYOFFSET);  
	sendCommand(0x00);
	sendCommand(SSD1306_SETSTARTLINE | 0x0);            // line #0
	sendCommand(SSD1306_CHARGEPUMP);                    // 0x8D
	sendCommand(0x14); // [2] charge pump setting (p62): 0x014 enable, 0x010 disable 
	sendCommand(SSD1306_MEMORYMODE);                    // 0x20
	sendCommand(0x00);                                  // 0x0 act like ks0108
	sendCommand(SSD1306_SEGREMAP | 0x1);
	sendCommand(SSD1306_COMSCANDEC);

	sendCommand(SSD1306_SETCOMPINS);                    // 0xDA
	sendCommand(0x12);

	sendCommand(SSD1306_SETCONTRAST);
	sendCommand(0xCF);

	sendCommand(SSD1306_SETPRECHARGE); 
	sendCommand(0xF1);

	sendCommand(SSD1306_SETVCOMDETECT);                 // 0xDB
	sendCommand(0x40);
	sendCommand(SSD1306_DISPLAYALLON_RESUME);           // 0xA4
	sendCommand(SSD1306_NORMALDISPLAY);                 // 0xA6

	sendCommand(SSD1306_DISPLAYON);

}


void printChar(unsigned char c, byte X, byte Y){
	setCursor(X,Y);
    
	for(byte i=0; i<8; i++) {
       sendData(pgm_read_byte(&BasicFont[c-32][i]));
    }
}

void printString(const char *String, byte X, byte Y, byte numChar){
	byte cursor = X;
	byte count=0;
    while(String[count] && count<numChar){
		setCursor(cursor, Y);
		printChar(String[count++],cursor,Y);
		cursor+=8;
	}
}




void setCursor(byte x, byte y){
	sendCommand(SSD1306_COLUMNADDR);
	sendCommand(x);   
	sendCommand(x+8);

	sendCommand(SSD1306_PAGEADDR);
	sendCommand(y);
	sendCommand(y);
}


void invertDisplay(uint8_t i) {
	if (i) {
		sendCommand(SSD1306_INVERTDISPLAY);
	} else {
		sendCommand(SSD1306_NORMALDISPLAY);
	}
}

void sendCommand(byte command){
	Wire.beginTransmission(SSD1306_OLED_ADDRESS);
	Wire.write(0x00);
	Wire.write(command);
	Wire.endTransmission();
}

void sendData(byte command){
	Wire.beginTransmission(SSD1306_OLED_ADDRESS);
	Wire.write(0x40);
	Wire.write(command);
	Wire.endTransmission();
}

 

faraddin
Offline
Зарегистрирован: 11.08.2013

Как Вам повезло, что пухлявый дрыхнет... Вам пытаются объяснить что у вас допустим второй элемент массива это "!", а символ его вызывающий имеет код допустим 21. А 21 элемент массива какую букву будет отображать?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

он думает если в комментах рядом написана буква ардуина знает что строка рядом это для него))

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Автор вообще смутно понимает как работает этот код. Скопировал где-то пример непонятно для какой кодовой таблицы(той в которой строки в программе).

З.Ы. Напоминает одну сказку где парень засунул дрова в печку в перемешку с тестом со словами "Зажарится как нибудь", чтобы получились прожки - и был искренне недоволен результатом, когда получил черные пирожки.

gppsoft
Offline
Зарегистрирован: 13.10.2014

jeka_tm пишет:

он думает если в комментах рядом написана буква ардуина знает что строка рядом это для него))

А вы юморист :)

gppsoft
Offline
Зарегистрирован: 13.10.2014

NeiroN пишет:

Автор вообще смутно понимает как работает этот код. Скопировал где-то пример непонятно для какой кодовой таблицы(той в которой строки в программе).

З.Ы. Напоминает одну сказку где парень засунул дрова в печку в перемешку с тестом со словами "Зажарится как нибудь", чтобы получились прожки - и был искренне недоволен результатом, когда получил черные пирожки.

Да, так и есть. Часть кода (таблица символов) скопированна. Разве я не правильно понимаю что индекс элемента массива должен быть равен коду символа в ASCII таблице? 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

faraddin пишет:

Как Вам повезло, что пухлявый дрыхнет... Вам пытаются объяснить что у вас допустим второй элемент массива это "!", а символ его вызывающий имеет код допустим 21. А 21 элемент массива какую букву будет отображать?


Да уж. Мной смотрю уже детей пугают. Гыыыы
а он кстати и не поймет то что вы ему обьясняете. Ибо тупит страшно. У него даже не хватает соображения что бы в этот код вставить serial.print и посмотреть что ему его масив возращает. А вы ему сразу про кодировки и прочую лабуду.

gppsoft
Offline
Зарегистрирован: 13.10.2014

Puhlyaviy пишет:
faraddin пишет:

Как Вам повезло, что пухлявый дрыхнет... Вам пытаются объяснить что у вас допустим второй элемент массива это "!", а символ его вызывающий имеет код допустим 21. А 21 элемент массива какую букву будет отображать?

Да уж. Мной смотрю уже детей пугают. Гыыыы а он кстати и не поймет то что вы ему обьясняете. Ибо тупит страшно. У него даже не хватает соображения что бы в этот код вставить serial.print и посмотреть что ему его масив возращает. А вы ему сразу про кодировки и прочую лабуду.

Проснулись(с ДВ?)? Вот зря так. Вовзращает код символа. Но не понятно к какой таблице символов.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Незря!
только не разбирающийся новичек будет сходу кричать что он крут и обошелся без библиотек. :) потому что нормальные здоровые люди не тратят время на изобретения лисапедов. Гыыы избавиться от библиотеки легко. Просто нужно весь код с библиотеки вынести в основное тело программы.
к тому-же вас уже несколько раз ткнули там где проблема. Но вам начхать ибо вы не знаете как изменить код. И видимо ждете что кто это сделает за вас.

Так что НЕЗРЯ!

gppsoft
Offline
Зарегистрирован: 13.10.2014

Puhlyaviy пишет:
Незря! только не разбирающийся новичек будет сходу кричать что он крут и обошелся без библиотек. :) потому что нормальные здоровые люди не тратят время на изобретения лисапедов.

Оооккк... Гуру. Мне доказывать кому-то что-то давно не нужно. Тем более тут. Спасибо.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Дадада.
В данный момент у вас элементарная задача. Взять с массива нужный элемент. Но вы не можете решить эту задачу. Хотя
1. Вам указали в чем ошибка
2. Вам сказали что есть ветка где решали похожую проблему

Давайте теперь подумаем почему вы еще не решили свою проблему?

gppsoft
Offline
Зарегистрирован: 13.10.2014

Puhlyaviy пишет:
Давайте теперь подумаем почему вы еще не решили свою проблему?

Потому что я живу на ДВ и сейчас середина дня. Потому что я сейчас на работе.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

gppsoft пишет:

Puhlyaviy пишет:
Давайте теперь подумаем почему вы еще не решили свою проблему?

Потому что я живу на ДВ и сейчас середина дня. Потому что я сейчас на работе.


Ой, вы оправдываетесь и что то мне доказываете? Ужас

Ну предыдущим вечером целой группе народа так и не удалось донести до вас истину. Посмотрим сегодня.

У нас не принято писать за кого то код. Обьяснять, советоваться, философию почесывать эт сколько угодно. А поощрять заносчивых новичков писанием за них кода, зачем?

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013
char str[] = "АБВГДЕЖЗИКЛМН";
void setup(){
 Serial.begin(9600); 
}
void loop(){
for(int i=0; i<26;i+=2){
 Serial.print("Table = 0x");
 Serial.println((byte)str[i],HEX);
 Serial.print("Char = 0x");
 Serial.println((byte)str[i+1],HEX);
}
 Serial.println();
delay(2000);
}

Вот так можно посмотреть какие коды соответвуют символам. Если вы запустите пример то увидите что кодовая таблица получается 0xD0, А русские буквы начинаются с 0x90. Тут про это написано: http://fkn.ktu10.com/?q=node/5542

gppsoft
Offline
Зарегистрирован: 13.10.2014

NeiroN пишет:

char str[] = "АБВГДЕЖЗИКЛМН";
void setup(){
 Serial.begin(9600); 
}
void loop(){
for(int i=0; i<26;i+=2){
 Serial.print("Table = 0x");
 Serial.println((byte)str[i],HEX);
 Serial.print("Char = 0x");
 Serial.println((byte)str[i+1],HEX);
}
 Serial.println();
delay(2000);
}

Вот так можно посмотреть какие коды соответвуют символам. Если вы запустите пример то увидите что кодовая таблица получается 0xD0, А русские буквы начинаются с 0x90. Тут про это написано: http://fkn.ktu10.com/?q=node/5542

 

Вообщем если я вас правильно понял, то мне нужно следущее...

Массив латинских символов ASCII таблица.

const byte BasicFont[][8] PROGMEM = {
	{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
	{0x00,0x00,0x5F,0x00,0x00,0x00,0x00,0x00},
	{0x00,0x00,0x07,0x00,0x07,0x00,0x00,0x00},
	{0x00,0x14,0x7F,0x14,0x7F,0x14,0x00,0x00},
	{0x00,0x24,0x2A,0x7F,0x2A,0x12,0x00,0x00},
	{0x00,0x23,0x13,0x08,0x64,0x62,0x00,0x00},
	{0x00,0x36,0x49,0x55,0x22,0x50,0x00,0x00},
	{0x00,0x00,0x05,0x03,0x00,0x00,0x00,0x00},
	{0x00,0x1C,0x22,0x41,0x00,0x00,0x00,0x00},
	{0x00,0x41,0x22,0x1C,0x00,0x00,0x00,0x00},
	{0x00,0x08,0x2A,0x1C,0x2A,0x08,0x00,0x00},
	{0x00,0x08,0x08,0x3E,0x08,0x08,0x00,0x00},
	{0x00,0xA0,0x60,0x00,0x00,0x00,0x00,0x00},
	{0x00,0x08,0x08,0x08,0x08,0x08,0x00,0x00},
	{0x00,0x60,0x60,0x00,0x00,0x00,0x00,0x00},
	{0x00,0x20,0x10,0x08,0x04,0x02,0x00,0x00},
	{0x00,0x3E,0x51,0x49,0x45,0x3E,0x00,0x00},
	{0x00,0x00,0x42,0x7F,0x40,0x00,0x00,0x00},
	{0x00,0x62,0x51,0x49,0x49,0x46,0x00,0x00},
	{0x00,0x22,0x41,0x49,0x49,0x36,0x00,0x00},
	{0x00,0x18,0x14,0x12,0x7F,0x10,0x00,0x00},
	{0x00,0x27,0x45,0x45,0x45,0x39,0x00,0x00},
	{0x00,0x3C,0x4A,0x49,0x49,0x30,0x00,0x00},
	{0x00,0x01,0x71,0x09,0x05,0x03,0x00,0x00},
	{0x00,0x36,0x49,0x49,0x49,0x36,0x00,0x00},
	{0x00,0x06,0x49,0x49,0x29,0x1E,0x00,0x00},
	{0x00,0x00,0x36,0x36,0x00,0x00,0x00,0x00},
	{0x00,0x00,0xAC,0x6C,0x00,0x00,0x00,0x00},
	{0x00,0x08,0x14,0x22,0x41,0x00,0x00,0x00},
	{0x00,0x14,0x14,0x14,0x14,0x14,0x00,0x00},
	{0x00,0x41,0x22,0x14,0x08,0x00,0x00,0x00},
	{0x00,0x02,0x01,0x51,0x09,0x06,0x00,0x00},
	{0x00,0x32,0x49,0x79,0x41,0x3E,0x00,0x00},
	{0x00,0x7E,0x09,0x09,0x09,0x7E,0x00,0x00},
	{0x00,0x7F,0x49,0x49,0x49,0x36,0x00,0x00},
	{0x00,0x3E,0x41,0x41,0x41,0x22,0x00,0x00},
	{0x00,0x7F,0x41,0x41,0x22,0x1C,0x00,0x00},
	{0x00,0x7F,0x49,0x49,0x49,0x41,0x00,0x00},
	{0x00,0x7F,0x09,0x09,0x09,0x01,0x00,0x00},
	{0x00,0x3E,0x41,0x41,0x51,0x72,0x00,0x00},
	{0x00,0x7F,0x08,0x08,0x08,0x7F,0x00,0x00},
	{0x00,0x41,0x7F,0x41,0x00,0x00,0x00,0x00},
	{0x00,0x20,0x40,0x41,0x3F,0x01,0x00,0x00},
	{0x00,0x7F,0x08,0x14,0x22,0x41,0x00,0x00},
	{0x00,0x7F,0x40,0x40,0x40,0x40,0x00,0x00},
	{0x00,0x7F,0x02,0x0C,0x02,0x7F,0x00,0x00},
	{0x00,0x7F,0x04,0x08,0x10,0x7F,0x00,0x00},
	{0x00,0x3E,0x41,0x41,0x41,0x3E,0x00,0x00},
	{0x00,0x7F,0x09,0x09,0x09,0x06,0x00,0x00},
	{0x00,0x3E,0x41,0x51,0x21,0x5E,0x00,0x00},
	{0x00,0x7F,0x09,0x19,0x29,0x46,0x00,0x00},
	{0x00,0x26,0x49,0x49,0x49,0x32,0x00,0x00},
	{0x00,0x01,0x01,0x7F,0x01,0x01,0x00,0x00},
	{0x00,0x3F,0x40,0x40,0x40,0x3F,0x00,0x00},
	{0x00,0x1F,0x20,0x40,0x20,0x1F,0x00,0x00},
	{0x00,0x3F,0x40,0x38,0x40,0x3F,0x00,0x00},
	{0x00,0x63,0x14,0x08,0x14,0x63,0x00,0x00},
	{0x00,0x03,0x04,0x78,0x04,0x03,0x00,0x00},
	{0x00,0x61,0x51,0x49,0x45,0x43,0x00,0x00},
	{0x00,0x7F,0x41,0x41,0x00,0x00,0x00,0x00},
	{0x00,0x02,0x04,0x08,0x10,0x20,0x00,0x00},
	{0x00,0x41,0x41,0x7F,0x00,0x00,0x00,0x00},
	{0x00,0x04,0x02,0x01,0x02,0x04,0x00,0x00},
	{0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00},
	{0x00,0x01,0x02,0x04,0x00,0x00,0x00,0x00},
	{0x00,0x20,0x54,0x54,0x54,0x78,0x00,0x00},
	{0x00,0x7F,0x48,0x44,0x44,0x38,0x00,0x00},
	{0x00,0x38,0x44,0x44,0x28,0x00,0x00,0x00},
	{0x00,0x38,0x44,0x44,0x48,0x7F,0x00,0x00},
	{0x00,0x38,0x54,0x54,0x54,0x18,0x00,0x00},
	{0x00,0x08,0x7E,0x09,0x02,0x00,0x00,0x00},
	{0x00,0x18,0xA4,0xA4,0xA4,0x7C,0x00,0x00},
	{0x00,0x7F,0x08,0x04,0x04,0x78,0x00,0x00},
	{0x00,0x00,0x7D,0x00,0x00,0x00,0x00,0x00},
	{0x00,0x80,0x84,0x7D,0x00,0x00,0x00,0x00},
	{0x00,0x7F,0x10,0x28,0x44,0x00,0x00,0x00},
	{0x00,0x41,0x7F,0x40,0x00,0x00,0x00,0x00},
	{0x00,0x7C,0x04,0x18,0x04,0x78,0x00,0x00},
	{0x00,0x7C,0x08,0x04,0x7C,0x00,0x00,0x00},
	{0x00,0x38,0x44,0x44,0x38,0x00,0x00,0x00},
	{0x00,0xFC,0x24,0x24,0x18,0x00,0x00,0x00},
	{0x00,0x18,0x24,0x24,0xFC,0x00,0x00,0x00},
	{0x00,0x00,0x7C,0x08,0x04,0x00,0x00,0x00},
	{0x00,0x48,0x54,0x54,0x24,0x00,0x00,0x00},
	{0x00,0x04,0x7F,0x44,0x00,0x00,0x00,0x00},
	{0x00,0x3C,0x40,0x40,0x7C,0x00,0x00,0x00},
	{0x00,0x1C,0x20,0x40,0x20,0x1C,0x00,0x00},
	{0x00,0x3C,0x40,0x30,0x40,0x3C,0x00,0x00},
	{0x00,0x44,0x28,0x10,0x28,0x44,0x00,0x00},
	{0x00,0x1C,0xA0,0xA0,0x7C,0x00,0x00,0x00},
	{0x00,0x44,0x64,0x54,0x4C,0x44,0x00,0x00},
	{0x00,0x08,0x36,0x41,0x00,0x00,0x00,0x00},
	{0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00},
	{0x00,0x41,0x36,0x08,0x00,0x00,0x00,0x00},
	{0x00,0x02,0x01,0x01,0x02,0x01,0x00,0x00},
	{0x00,0x02,0x05,0x05,0x02,0x00,0x00,0x00} 
};

Добавляю в него русские символы и в случае использования кирилицы мне нужно вычислить нужный индекс элемента? Т.е к примеру если я сейчас вот в этот массив добавлю 97 элемент, в котором будет "А" что будет равно индексу 144(UNICODE), то следовательно можно вычислить длинну смещения в данной(моей) таблице как 144-97=47... Далее 144-47 = 97. Так? Я совсем запутался уже.

faraddin
Offline
Зарегистрирован: 11.08.2013

Вам в любом случае нужно учитывать смещения. У вас "BasicFont[5]" будет рисовать символ "#", при том, что символ решетки имеет код 0x23 и когда вы пытаетесь вызвать BasicFont['#'] это равно BasicFont[35], который будет рисовать символ "C"

gppsoft
Offline
Зарегистрирован: 13.10.2014

faraddin пишет:

Вам в любом случае нужно учитывать смещения. У вас "BasicFont[5]" будет рисовать символ "#", при том, что символ решетки имеет код 0x23 и когда вы пытаетесь вызвать BasicFont['#'] это равно BasicFont[35], который будет рисовать символ "C"

Это имеется в виду?

void printChar(unsigned char c, byte X, byte Y){
	setCursor(X,Y);

	for(byte i=0; i<8; i++) {
             sendData(pgm_read_byte(&BasicFont[c-32][i]));
    }
}

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

о до человека дошло))

faraddin
Offline
Зарегистрирован: 11.08.2013

Да, но это не касается кириллицы. У нее другие смещения, смотрите соседнюю ветку, там уже все посчитали.

gppsoft
Offline
Зарегистрирован: 13.10.2014

jeka_tm пишет:

о до человека дошло))

Не только это дошло, но и то что VS в другой кодировке собирала проект :))))

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

и еще. несколько условий ставится если требуется уменьшить занимаемый объем массивом символов. и тогда делается массив с нужными символами. например только русские буквы и цифры. и условиями и смещениями получаем нужные строки массива

gppsoft
Offline
Зарегистрирован: 13.10.2014

faraddin пишет:

Да, но это не касается кириллицы. У нее другие смещения, смотрите соседнюю ветку, там уже все посчитали.

Ну не беда. Можно ведь проверит. Но до этого момента мне надо как-то понять что надо читать второй байт... Хм.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

в смысле 2 байт? буква из 5 байт. из них второй байт?

faraddin
Offline
Зарегистрирован: 11.08.2013

gppsoft пишет:

Ну не беда. Можно ведь проверит. Но до этого момента мне надо как-то понять что надо читать второй байт... Хм.

Ну так вам написали код, для проверки, какие байты к вам приходят, когда вы отправляете определенный русский символ, а уж зная эту информацию легко отсеит ненужные (если они есть) и сместить нужные

gppsoft
Offline
Зарегистрирован: 13.10.2014

jeka_tm пишет:

в смысле 2 байт? буква из 5 байт. из них второй байт?

Не не не.. Не так поняли. Я не про то. Вот у меня есть метод:

void printChar(unsigned char c, byte X, byte Y){
	setCursor(X,Y);

	for(byte i=0; i<8; i++) {
             sendData(pgm_read_byte(&BasicFont[c-32][i]));
    }
}

В него прилетает кирилический символ "А"... Но значением(индексом) в таблице Unicode является 2-ой байт. 

faraddin
Offline
Зарегистрирован: 11.08.2013

jeka_tm пишет:

в смысле 2 байт? буква из 5 байт. из них второй байт?

я думаю он имеет ввиду юникод, в котором каждый воторой символ нужно отбросить

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

а что проблема отсеять 1 байт? вот например как использовать старший

lcd_write_dat(dat>>8);

а младший сам отсеется если в переменную типа байт отправить unsigned int

gppsoft
Offline
Зарегистрирован: 13.10.2014

jeka_tm пишет:

а что проблема отсеять 1 байт? вот например как использовать старший

lcd_write_dat(dat>>8);

а младший сам отсеется если в переменную типа байт отправить unsigned int

Ну или как вариант смотреть если прилетело 0xEF, то смещаться на 1 байт вперед?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

faraddin пишет:

jeka_tm пишет:

в смысле 2 байт? буква из 5 байт. из них второй байт?

я думаю он имеет ввиду юникод, в котором каждый воторой символ нужно отбросить

в юникоде возвращается значение 0xD8F7 например из 2 байт или два раза по байту? не понял честно сказать

gppsoft
Offline
Зарегистрирован: 13.10.2014

jeka_tm пишет:

faraddin пишет:

jeka_tm пишет:

в смысле 2 байт? буква из 5 байт. из них второй байт?

я думаю он имеет ввиду юникод, в котором каждый воторой символ нужно отбросить

в юникоде возвращается значение 0xD8F7 например из 2 байт или два раза по байту? не понял честно сказать

Я имею в виду это: "Как определить в методе printChar что в него передан кирилический символ?"

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

jeka_tm пишет:

а что проблема отсеять 1 байт? вот например как использовать старший

lcd_write_dat(dat>>8);

а младший сам отсеется если в переменную типа байт отправить unsigned int

блин ошибочка. отсеется конечно старший байт если в переменную типа байт отправить unsigned int

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

gppsoft пишет:

Я имею в виду это: "Как определить в методе printChar что в него передан кирилический символ?"

так пример кода дали как посмотреть коды букв. даже не зная кодировки уже можно сделать по этим данным

а то что кириллица или латиница неважно. все равно вернется код символа. просто он будет в какой то другой части таблицы используемой кодировки

gppsoft
Offline
Зарегистрирован: 13.10.2014

jeka_tm пишет:

gppsoft пишет:

Я имею в виду это: "Как определить в методе printChar что в него передан кирилический символ?"

так пример кода дали как посмотреть коды букв. даже не зная кодировки уже можно сделать по этим данным

а то что кириллица или латиница неважно. все равно вернется код символа. просто он будет в какой то другой части таблицы используемой кодировки

Я понимаю это. Смотрите в метод прилетает символ "W" он подходит под условие &BasicFont[c-32][i]). Но если туда прилетает кирилический символ "Ы", а прилетать будет только первый байт закодированного 2 байтами символа в отличии от латинских. Вот тут-то мне нужно понять что "ага... это не латиница, сместиться надо на +1 байт и посмотреть что там за число" Ок.. там 171... Производим вычисления и берем нужный элемент массива. Верно?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

ну так поставь условие. если русские буквы это всегда 2байта, а английские 1 байт. сравни просто по размеру . если код символа больше 255 значит это русская буква. отсеиваешь 1 байт и выводишь

я правильно тебя понял?

gppsoft
Offline
Зарегистрирован: 13.10.2014

jeka_tm пишет:

ну так поставь условие. если русские буквы это всегда 2байта, а английские 1 байт. сравни просто по размеру . если код символа больше 255 значит это русская буква. отсеиваешь 1 байт и выводишь

я правильно тебя понял?

Да, верно. Видимо мне пора спать :) Всем спасибо. Если что, завтра помучаю вас еще ;)