Руссификация SD1306(OLED 128x64)
- Войдите на сайт для отправки комментариев
Пнд, 13/10/2014 - 14:35
Всем привет. Работаю с дисплеем напрямую без библиотек(по даташиту). Все замечательно, но никак не могу добавить поддержку криллицы. Как я понял символы определены как последовательность байт в массиве. При использовании латинских символов просто считывается элемент массива индекс которого равен коду символа. Но как быть с кирилицей? Пробовал влоб вставить массив из вот этой статьи, но ничего не выходит. Печатается только "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();
}
В ветке Общий есть та же тема только для дисплея 5110
Основная проблема это определение кода кирилического символа который нужно выводить - ведь корилица в юникоде состоит из 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])); } }Основная проблема это определение кода кирилического символа который нужно выводить - ведь корилица в юникоде состоит из 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])); } }К сожалению не работает. Кирилица в кракозябрах и латиница кривовата стала :)
я что за вас еще считать все должен? Все смещения? Вы вообще поняли что я имелл вииду? Таблицу символов виндовую откройте хотябы.
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 должны быть Буквы АБВГДЕЖЗИКЛМН
я что за вас еще считать все должен? Все смещения? Вы вообще поняли что я имелл вииду? Таблицу символов виндовую откройте хотябы.
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])); } }Учитесь думать прежде чем что-то вставить.
Спасибо за помощь конечно. Но я не понял причем тут смещения? В данном массиве графические представления символов.
Ну для не понятных скажу еще раз - ваша таблица начинается с 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).
Ну для не понятных скажу еще раз - ваша таблица начинается с 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(); }Как Вам повезло, что пухлявый дрыхнет... Вам пытаются объяснить что у вас допустим второй элемент массива это "!", а символ его вызывающий имеет код допустим 21. А 21 элемент массива какую букву будет отображать?
он думает если в комментах рядом написана буква ардуина знает что строка рядом это для него))
Автор вообще смутно понимает как работает этот код. Скопировал где-то пример непонятно для какой кодовой таблицы(той в которой строки в программе).
З.Ы. Напоминает одну сказку где парень засунул дрова в печку в перемешку с тестом со словами "Зажарится как нибудь", чтобы получились прожки - и был искренне недоволен результатом, когда получил черные пирожки.
он думает если в комментах рядом написана буква ардуина знает что строка рядом это для него))
А вы юморист :)
Автор вообще смутно понимает как работает этот код. Скопировал где-то пример непонятно для какой кодовой таблицы(той в которой строки в программе).
З.Ы. Напоминает одну сказку где парень засунул дрова в печку в перемешку с тестом со словами "Зажарится как нибудь", чтобы получились прожки - и был искренне недоволен результатом, когда получил черные пирожки.
Да, так и есть. Часть кода (таблица символов) скопированна. Разве я не правильно понимаю что индекс элемента массива должен быть равен коду символа в ASCII таблице?
Как Вам повезло, что пухлявый дрыхнет... Вам пытаются объяснить что у вас допустим второй элемент массива это "!", а символ его вызывающий имеет код допустим 21. А 21 элемент массива какую букву будет отображать?
Да уж. Мной смотрю уже детей пугают. Гыыыы
а он кстати и не поймет то что вы ему обьясняете. Ибо тупит страшно. У него даже не хватает соображения что бы в этот код вставить serial.print и посмотреть что ему его масив возращает. А вы ему сразу про кодировки и прочую лабуду.
Как Вам повезло, что пухлявый дрыхнет... Вам пытаются объяснить что у вас допустим второй элемент массива это "!", а символ его вызывающий имеет код допустим 21. А 21 элемент массива какую букву будет отображать?
Проснулись(с ДВ?)? Вот зря так. Вовзращает код символа. Но не понятно к какой таблице символов.
Незря!
только не разбирающийся новичек будет сходу кричать что он крут и обошелся без библиотек. :) потому что нормальные здоровые люди не тратят время на изобретения лисапедов. Гыыы избавиться от библиотеки легко. Просто нужно весь код с библиотеки вынести в основное тело программы.
к тому-же вас уже несколько раз ткнули там где проблема. Но вам начхать ибо вы не знаете как изменить код. И видимо ждете что кто это сделает за вас.
Так что НЕЗРЯ!
Оооккк... Гуру. Мне доказывать кому-то что-то давно не нужно. Тем более тут. Спасибо.
Дадада.
В данный момент у вас элементарная задача. Взять с массива нужный элемент. Но вы не можете решить эту задачу. Хотя
1. Вам указали в чем ошибка
2. Вам сказали что есть ветка где решали похожую проблему
Давайте теперь подумаем почему вы еще не решили свою проблему?
Потому что я живу на ДВ и сейчас середина дня. Потому что я сейчас на работе.
Потому что я живу на ДВ и сейчас середина дня. Потому что я сейчас на работе.
Ой, вы оправдываетесь и что то мне доказываете? Ужас
Ну предыдущим вечером целой группе народа так и не удалось донести до вас истину. Посмотрим сегодня.
У нас не принято писать за кого то код. Обьяснять, советоваться, философию почесывать эт сколько угодно. А поощрять заносчивых новичков писанием за них кода, зачем?
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
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. Так? Я совсем запутался уже.
Вам в любом случае нужно учитывать смещения. У вас "BasicFont[5]" будет рисовать символ "#", при том, что символ решетки имеет код 0x23 и когда вы пытаетесь вызвать BasicFont['#'] это равно BasicFont[35], который будет рисовать символ "C"
Вам в любом случае нужно учитывать смещения. У вас "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])); } }о до человека дошло))
Да, но это не касается кириллицы. У нее другие смещения, смотрите соседнюю ветку, там уже все посчитали.
о до человека дошло))
Не только это дошло, но и то что VS в другой кодировке собирала проект :))))
и еще. несколько условий ставится если требуется уменьшить занимаемый объем массивом символов. и тогда делается массив с нужными символами. например только русские буквы и цифры. и условиями и смещениями получаем нужные строки массива
Да, но это не касается кириллицы. У нее другие смещения, смотрите соседнюю ветку, там уже все посчитали.
Ну не беда. Можно ведь проверит. Но до этого момента мне надо как-то понять что надо читать второй байт... Хм.
в смысле 2 байт? буква из 5 байт. из них второй байт?
Ну не беда. Можно ведь проверит. Но до этого момента мне надо как-то понять что надо читать второй байт... Хм.
Ну так вам написали код, для проверки, какие байты к вам приходят, когда вы отправляете определенный русский символ, а уж зная эту информацию легко отсеит ненужные (если они есть) и сместить нужные
в смысле 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-ой байт.
в смысле 2 байт? буква из 5 байт. из них второй байт?
я думаю он имеет ввиду юникод, в котором каждый воторой символ нужно отбросить
а что проблема отсеять 1 байт? вот например как использовать старший
а младший сам отсеется если в переменную типа байт отправить unsigned int
а что проблема отсеять 1 байт? вот например как использовать старший
а младший сам отсеется если в переменную типа байт отправить unsigned int
Ну или как вариант смотреть если прилетело 0xEF, то смещаться на 1 байт вперед?
в смысле 2 байт? буква из 5 байт. из них второй байт?
я думаю он имеет ввиду юникод, в котором каждый воторой символ нужно отбросить
в юникоде возвращается значение 0xD8F7 например из 2 байт или два раза по байту? не понял честно сказать
в смысле 2 байт? буква из 5 байт. из них второй байт?
я думаю он имеет ввиду юникод, в котором каждый воторой символ нужно отбросить
в юникоде возвращается значение 0xD8F7 например из 2 байт или два раза по байту? не понял честно сказать
Я имею в виду это: "Как определить в методе printChar что в него передан кирилический символ?"
а что проблема отсеять 1 байт? вот например как использовать старший
а младший сам отсеется если в переменную типа байт отправить unsigned int
блин ошибочка. отсеется конечно старший байт если в переменную типа байт отправить unsigned int
Я имею в виду это: "Как определить в методе printChar что в него передан кирилический символ?"
так пример кода дали как посмотреть коды букв. даже не зная кодировки уже можно сделать по этим данным
а то что кириллица или латиница неважно. все равно вернется код символа. просто он будет в какой то другой части таблицы используемой кодировки
Я имею в виду это: "Как определить в методе printChar что в него передан кирилический символ?"
так пример кода дали как посмотреть коды букв. даже не зная кодировки уже можно сделать по этим данным
а то что кириллица или латиница неважно. все равно вернется код символа. просто он будет в какой то другой части таблицы используемой кодировки
Я понимаю это. Смотрите в метод прилетает символ "W" он подходит под условие &BasicFont[c-32][i]). Но если туда прилетает кирилический символ "Ы", а прилетать будет только первый байт закодированного 2 байтами символа в отличии от латинских. Вот тут-то мне нужно понять что "ага... это не латиница, сместиться надо на +1 байт и посмотреть что там за число" Ок.. там 171... Производим вычисления и берем нужный элемент массива. Верно?
ну так поставь условие. если русские буквы это всегда 2байта, а английские 1 байт. сравни просто по размеру . если код символа больше 255 значит это русская буква. отсеиваешь 1 байт и выводишь
я правильно тебя понял?
ну так поставь условие. если русские буквы это всегда 2байта, а английские 1 байт. сравни просто по размеру . если код символа больше 255 значит это русская буква. отсеиваешь 1 байт и выводишь
я правильно тебя понял?
Да, верно. Видимо мне пора спать :) Всем спасибо. Если что, завтра помучаю вас еще ;)