|
|
  |
Кирилица на LCD смешивается! |
|
|
|
Aug 13 2008, 12:12
|

Участник

Группа: Свой
Сообщений: 67
Регистрация: 5-02-07
Пользователь №: 25 074

|
Код const unsigned char WinToLCD_Table[]={ 0x00, //000 Cимвол - User 0 0x01, //001 Cимвол - User 1 0x02, //002 Cимвол - User 2 0x03, //003 Cимвол - User 3 0x04, //004 Cимвол - User 4 0x05, //005 Cимвол - User 5 0x06, //006 Cимвол - User 6 0x07, //007 Cимвол - User 7 0x08, //008 Cимвол - User 0 0x09, //009 Cимвол - User 1 0x0A, //010 Cимвол - User 2 0x0B, //011 Cимвол - User 3 0x0C, //012 Cимвол - User 4 0x0D, //013 Cимвол - User 5 0x0E, //014 Cимвол - User 6 0x0F, //015 Cимвол - User 7 0x20, //016 Cимвол - 0x20, //017 Cимвол - 0x20, //018 Cимвол - 0x20, //019 Cимвол - 0x20, //020 Cимвол - 0x20, //021 Cимвол - 0x20, //022 Cимвол - 0x20, //023 Cимвол - 0x20, //024 Cимвол - 0x20, //025 Cимвол - 0x20, //026 Cимвол - 0x20, //027 Cимвол - 0x20, //028 Cимвол - 0x20, //029 Cимвол - 0x20, //030 Cимвол - 0x20, //031 Cимвол - 0x20, //032 Cимвол - 0x21, //033 Cимвол - ! 0x22, //034 Cимвол - " 0x23, //035 Cимвол - # 0x24, //036 Cимвол - $ 0x25, //037 Cимвол - % 0x26, //038 Cимвол - & 0x27, //039 Cимвол - ' 0x28, //040 Cимвол - Левая скобка 0x29, //041 Cимвол - Правая скобка 0x2A, //042 Cимвол - * 0x2B, //043 Cимвол - + 0x2C, //044 Cимвол - , 0x2D, //045 Cимвол - - 0x2E, //046 Cимвол - . 0x2F, //047 Cимвол - / 0x30, //048 Cимвол - 0 0x31, //049 Cимвол - 1 0x32, //050 Cимвол - 2 0x33, //051 Cимвол - 3 0x34, //052 Cимвол - 4 0x35, //053 Cимвол - 5 0x36, //054 Cимвол - 6 0x37, //055 Cимвол - 7 0x38, //056 Cимвол - 8 0x39, //057 Cимвол - 9 0x3A, //058 Cимвол - : 0x3B, //059 Cимвол -; 0x3C, //060 Cимвол - < 0x3D, //061 Cимвол - = 0x3E, //062 Cимвол - > 0x3F, //063 Cимвол - ? 0x40, //064 Cимвол - @ 0x41, //065 Cимвол - A 0x42, //066 Cимвол - B 0x43, //067 Cимвол - C 0x44, //068 Cимвол - D 0x45, //069 Cимвол - E 0x46, //070 Cимвол - F 0x47, //071 Cимвол - G 0x48, //072 Cимвол - H 0x49, //073 Cимвол - I 0x4A, //074 Cимвол - J 0x4B, //075 Cимвол - K 0x4C, //076 Cимвол - L 0x4D, //077 Cимвол - M 0x4E, //078 Cимвол - N 0x4F, //079 Cимвол - O 0x50, //080 Cимвол - P 0x51, //081 Cимвол - Q 0x52, //082 Cимвол - R 0x53, //083 Cимвол - S 0x54, //084 Cимвол - T 0x55, //085 Cимвол - U 0x56, //086 Cимвол - V 0x57, //087 Cимвол - W 0x58, //088 Cимвол - X 0x59, //089 Cимвол - Y 0x5A, //090 Cимвол - Z 0x5B, //091 Cимвол - Левая квадратная скобка 0x5C, //092 Cимвол - Правая наклонная черта 0x5D, //093 Cимвол - Правая квадратная скобка 0x5E, //094 Cимвол - ^ 0x5F, //095 Cимвол - _ 0x60, //096 Cимвол - ` 0x61, //097 Cимвол - a 0x62, //098 Cимвол - b 0x63, //099 Cимвол - c 0x64, //100 Cимвол - d 0x65, //101 Cимвол - e 0x66, //102 Cимвол - f 0x67, //103 Cимвол - g 0x68, //104 Cимвол - h 0x69, //105 Cимвол - i 0x6A, //106 Cимвол - j 0x6B, //107 Cимвол - k 0x6C, //108 Cимвол - l 0x6D, //109 Cимвол - m 0x6E, //110 Cимвол - n 0x6F, //111 Cимвол - o 0x70, //112 Cимвол - p 0x71, //113 Cимвол - q 0x72, //114 Cимвол - r 0x73, //115 Cимвол - s 0x74, //116 Cимвол - t 0x75, //117 Cимвол - u 0x76, //118 Cимвол - v 0x77, //119 Cимвол - w 0x78, //120 Cимвол - x 0x79, //121 Cимвол - y 0x7A, //122 Cимвол - z 0x7B, //123 Cимвол - Левая фигурная скобка 0x7C, //124 Cимвол - | 0x7D, //125 Cимвол - Правая фигурная скобка 0x20, //126 Cимвол - 0x20, //127 Cимвол - 0x20, //128 Cимвол - 0x20, //129 Cимвол - 0x20, //130 Cимвол - 0x20, //131 Cимвол - 0x20, //132 Cимвол - 0x20, //133 Cимвол - 0x20, //134 Cимвол - 0x20, //135 Cимвол - 0x20, //136 Cимвол - 0x20, //137 Cимвол - 0x20, //138 Cимвол - 0x20, //139 Cимвол - 0x20, //140 Cимвол - 0x20, //141 Cимвол - 0x20, //142 Cимвол - 0x20, //143 Cимвол - 0x20, //144 Cимвол - 0x20, //145 Cимвол - 0x20, //146 Cимвол - 0x20, //147 Cимвол - 0x20, //148 Cимвол - 0x20, //149 Cимвол - 0x20, //150 Cимвол - 0x20, //151 Cимвол - 0x20, //152 Cимвол - 0x20, //153 Cимвол - 0x20, //154 Cимвол - 0x20, //155 Cимвол - 0x20, //156 Cимвол - 0x20, //157 Cимвол - 0x20, //158 Cимвол - 0x20, //159 Cимвол - 0x20, //160 Cимвол - 0x20, //161 Cимвол - 0x20, //162 Cимвол - 0x20, //163 Cимвол - 0x20, //164 Cимвол - 0x20, //165 Cимвол - 0x20, //166 Cимвол - 0x20, //167 Cимвол - 0xA2, //168 Cимвол - Ё 0x20, //169 Cимвол - 0x20, //170 Cимвол - 0x20, //171 Cимвол - 0x20, //172 Cимвол - 0x20, //173 Cимвол - 0x20, //174 Cимвол - 0x20, //175 Cимвол - 0x20, //176 Cимвол - 0x20, //177 Cимвол - 0x20, //178 Cимвол - 0x20, //179 Cимвол - 0x20, //180 Cимвол - 0x20, //181 Cимвол - 0x20, //182 Cимвол - 0x20, //183 Cимвол - 0xB5, //184 Cимвол - ё 0x20, //185 Cимвол - 0x20, //186 Cимвол - 0x20, //187 Cимвол - 0x20, //188 Cимвол - 0x20, //189 Cимвол - 0x20, //190 Cимвол - 0x20, //191 Cимвол - 0x41, //192 Cимвол - А 0xA0, //193 Cимвол - Б 0x42, //194 Cимвол - В 0xA1, //195 Cимвол - Г 0xE0, //196 Cимвол - Д 0x45, //197 Cимвол - Е 0xA3, //198 Cимвол - Ж 0xA4, //199 Cимвол - З 0xA5, //200 Cимвол - И 0xA6, //201 Cимвол - Й 0x4B, //202 Cимвол - К 0xA7, //203 Cимвол - Л 0x4D, //204 Cимвол - М 0x48, //205 Cимвол - Н 0x4F, //206 Cимвол - О 0xA8, //207 Cимвол - П 0x50, //208 Cимвол - Р 0x43, //209 Cимвол - С 0x54, //210 Cимвол - Т 0xA9, //211 Cимвол - У 0xAA, //212 Cимвол - Ф 0x58, //213 Cимвол - Х 0xE1, //214 Cимвол - Ц 0xAB, //215 Cимвол - Ч 0xAC, //216 Cимвол - Ш 0xE2, //217 Cимвол - Щ 0xAD, //218 Cимвол - Ъ 0xAE, //219 Cимвол - Ы 0x62, //220 Cимвол - Ь 0xAF, //221 Cимвол - Э 0xB0, //222 Cимвол - Ю 0xB1, //223 Cимвол - Я 0x61, //224 Cимвол - а 0xB2, //225 Cимвол - б 0xB3, //226 Cимвол - в 0xB4, //227 Cимвол - г 0xE3, //228 Cимвол - д 0x65, //229 Cимвол - е 0xB6, //230 Cимвол - ж 0xB7, //231 Cимвол - з 0xB8, //232 Cимвол - и 0xB9, //233 Cимвол - й 0xBA, //234 Cимвол - к 0xBB, //235 Cимвол - л 0xBC, //236 Cимвол - м 0xBD, //237 Cимвол - н 0x6F, //238 Cимвол - о 0xBE, //239 Cимвол - п 0x70, //240 Cимвол - р 0x63, //241 Cимвол - с 0xBF, //242 Cимвол - т 0x79, //243 Cимвол - у 0xE4, //244 Cимвол - ф 0x78, //245 Cимвол - х 0xE5, //246 Cимвол - ц 0xC0, //247 Cимвол - ч 0xC1, //248 Cимвол - ш 0xE6, //249 Cимвол - щ 0xC2, //250 Cимвол - ъ 0xC3, //251 Cимвол - ы 0xC4, //252 Cимвол - ь 0xC5, //253 Cимвол - э 0xC6, //254 Cимвол - ю 0xC7 //255 Cимвол - я };
unsigned char ConvertByteToLCD(unsigned char Byte_LCD) { return WinToLCD_Table[Byte_LCD]; } Ещё табличка - работает шустрее, вероятно, чем прошлая... Специфичные знаки игнорированы.
|
|
|
|
|
Aug 13 2008, 12:18
|

Частый гость
 
Группа: Участник
Сообщений: 89
Регистрация: 5-10-07
Пользователь №: 31 098

|
Цитата(VXDRV @ Aug 13 2008, 16:12)  Ещё табличка - работает шустрее, вероятно, чем прошлая... Специфичные знаки игнорированы. а как, например, с этой табличкой что-то вывести на LCD?
|
|
|
|
|
Aug 13 2008, 13:15
|

Чайник, 1 литр
   
Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168

|
Добавлю свой вариант: Код #define _UNK 0xFF static const BYTE CP1251_to_HD44780[256] = { // NUL STX SOT ETX EOT ENQ ACK BEL BS HT LF VT FF CR SO SI _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, // DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, // SP ! " # $ % & ' ( ) * + , - . / 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, // 0 1 2 3 4 5 6 7 8 9 : ; < = > ? 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, // @ A B C D E F G H I J K L M N O 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, // P Q R S T U V W X Y Z [ \ ] ^ _ 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, _UNK, 0x5D, 0x5E, 0x5F, // ` a b c d e f g h i j k l m n o 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, // p q r s t u v w x y z { | } ~ DEL 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, _UNK, _UNK, _UNK, 0xE9, _UNK, // _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, // _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, // § Ё « _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, 0xFD, 0xA2, _UNK, _UNK, 0xC8, _UNK, _UNK, _UNK, _UNK, // ° · ё » 0xEF, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, 0xDF, 0xB5, _UNK, _UNK, 0xC9, _UNK, _UNK, _UNK, _UNK, // А Б В Г Д Е Ж З И Й К Л М Н О П 0x41, 0xA0, 0x42, 0xA1, 0xE0, 0x45, 0xA3, 0xA4, 0xA5, 0xA6, 0x4B, 0xA7, 0x4D, 0x48, 0x4F, 0xA8, // Р С Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я 0x50, 0x43, 0x54, 0xA9, 0xAA, 0x58, 0xE1, 0xAB, 0xAC, 0xE2, 0xAD, 0xAE, 0x62, 0xAF, 0xB0, 0xB1, // а б в г д е ж з и й к л м н о п 0x61, 0xB2, 0xB3, 0xB4, 0xE3, 0x65, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0x6F, 0xBE, // р с т у ф х ц ч ш щ ъ ы ь э ю я 0x70, 0x63, 0xBF, 0x79, 0xE4, 0x78, 0xE5, 0xC0, 0xC1, 0xE6, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7 };
void CE110_LCD_Write(BYTE c) { I2C_Start(); I2C_WriteByte(I2C_ACCESS_WRITE(CE110_I2C_ADDRESS)); I2C_WriteByte(CE110_I2C_CTL_LCD(CE110_CTL_Multi, CE110_CTL_RS, CE110_CTL_NORW)); I2C_WriteByte(CP1251_to_HD44780[c]); I2C_Stop(); }
void CE110_LCD_WriteString(char *str) { BYTE *pos = (BYTE *) str; I2C_Start(); I2C_WriteByte(I2C_ACCESS_WRITE(CE110_I2C_ADDRESS)); I2C_WriteByte(CE110_I2C_CTL_LCD(CE110_CTL_Multi, CE110_CTL_RS, CE110_CTL_NORW)); while(*pos) { I2C_WriteByte(CP1251_to_HD44780[*pos]); pos++; } I2C_Stop(); }
void CE110_LCD_WriteString_CSEG(prog_uchar *str) { prog_uchar *pos = str; BYTE val; I2C_Start(); I2C_WriteByte(I2C_ACCESS_WRITE(CE110_I2C_ADDRESS)); I2C_WriteByte(CE110_I2C_CTL_LCD(CE110_CTL_Multi, CE110_CTL_RS, CE110_CTL_NORW)); do { val = pgm_read_byte_far((int) pos); if(val) { I2C_WriteByte(CP1251_to_HD44780[val]); pos++; } } while(val); I2C_Stop(); } Ну и пример использования: Код prog_uchar FD_TimeFmtStr[] = "Время, ЧЧ:ММ: "; // все в обычной кодировке Windows, 1251
CE110_LCD_WriteString_CSEG(FD_TimeFmtStr);
CE110_LCD_Write('Ы');
CE110_LCD_WriteString("Ыыы!"); Правда, ежели требуется максимум быстродействия, то лучше без преобразований лишних...
|
|
|
|
|
Aug 13 2008, 13:31
|

Участник

Группа: Свой
Сообщений: 67
Регистрация: 5-02-07
Пользователь №: 25 074

|
Цитата(_Олег_ @ Aug 13 2008, 18:18)  а как, например, с этой табличкой что-то вывести на LCD? В последних проектах использую RTOS SALVO. Например, задача по выводу на LCD 16x2: Код void Task_LCDOut(void) { OS_Delay(16); WriteIR(0x30); OS_Delay(5); WriteIR(0x30); OS_Delay(5); WriteIR(0x30); OS_Delay(5); WriteIR(0x38); OS_Delay(5); WriteIR(0x80); OS_Delay(5); WriteIR(0x0C); OS_Delay(5); WriteIR(0x06); while (WaitReady()==0) {OS_Yield();};
// Зашиваем сердечко в LCD WriteIR(0x40); while (WaitReady()==0) {OS_Yield();}; WriteDR(0b00000000); while (WaitReady()==0) {OS_Yield();}; WriteDR(0b00001010); while (WaitReady()==0) {OS_Yield();}; WriteDR(0b00011111); while (WaitReady()==0) {OS_Yield();}; WriteDR(0b00011111); while (WaitReady()==0) {OS_Yield();}; WriteDR(0b00001110); while (WaitReady()==0) {OS_Yield();}; WriteDR(0b00000100); while (WaitReady()==0) {OS_Yield();}; WriteDR(0b00000000); while (WaitReady()==0) {OS_Yield();}; WriteDR(0b00000000); while (WaitReady()==0) {OS_Yield();}; for (;;) { OS_Delay(2);
if (LCD_ACTION==34) {LCD_ACTION=0;} if (LCD_ACTION==0) { if (WaitReady()==1) {WriteIR(0x80);} else {LCD_ACTION=255;} } if (LCD_ACTION==17) { if (WaitReady()==1) {WriteIR(0xC0);} else {LCD_ACTION=16;} } if ((LCD_ACTION>=1)&&(LCD_ACTION<=16)) { if (WaitReady()==1) { WriteDR(ConvertByteToLCD(LCD_CHAR[LCD_ACTION-1])); } else { --LCD_ACTION; } } if ((LCD_ACTION>=18)&&(LCD_ACTION<=33)) { if (WaitReady()==1) { WriteDR(ConvertByteToLCD(LCD_CHAR[LCD_ACTION-2])); } else { --LCD_ACTION; } } ++LCD_ACTION; } } LCD_CHAR[0...31] - буфер (unsigned char) в RAM; LCD_ACTION - счётчик действий; За проход задачи обновляется один символ. Первая строка символы с 0 по 15, вторая с 16 по 31. Дополнительные функции (используемые в других задачах): Код void CopyROMtoLCDBuff(const unsigned char *StrIn, unsigned char *LCD_Buff)
{ while (*StrIn) { *(LCD_Buff++)=*(StrIn++); } }
void CopyRAMtoLCDBuff(unsigned char *StrIn, unsigned char *LCD_Buff) { while (*StrIn) { *(LCD_Buff++)=*(StrIn++); } }
unsigned char length(unsigned char *StrIn) { unsigned char L; L=0; while (*StrIn) { StrIn++; L++; } return L; } Например вывод текста в буфер LCD: Код const unsigned char Message_MEASURING[]="Measuring..."; const unsigned char Message_STATE2[]="Перенапряжение"; Вызов: Код pLCD_CHAR=&LCD_CHAR[0]; CopyROMtoLCDBuff(Message_MEASURING, pLCD_CHAR); pLCD_CHAR=&LCD_CHAR[16]; CopyROMtoLCDBuff(Message_STATE2, pLCD_CHAR); , где pLCD_CHAR - указатель на буфер LCD. Выводятся сообщения начиная с нулевого и с шестнадцатого символа (Выводится в верхней строке - "Measuring...", в нижней - "Перенапряжение"). Из оперативной памяти (например, изменяющиеся переменные - должны завершаться нулём): Код pITOA_BUFF=&ITOA_BUFF[0]; pLCD_CHAR=&LCD_CHAR[10]; itoa10(pITOA_BUFF, HR_Temp); CopyRAMtoLCDBuff(pITOA_BUFF, pLCD_CHAR); - Выводятся с 10 позиции цифры, разложенные в ITOA_BUFF. Или тупо - присвоением: Код pITOA_BUFF=&ITOA_BUFF[0]; LCD_CHAR[3]=ITOA_BUFF[0]; LCD_CHAR[4]=ITOA_BUFF[1]; LCD_CHAR[5]='.'; LCD_CHAR[6]=ITOA_BUFF[2]; - Выводятся цифры из ITOA_BUFF с разделительной точкой. Кстати, не забываем затирать старую инфу в буфере LCD_CHAR, записывая код 0x20, при обновлении её. При этом происходит постоянное обновление экрана. Необходимо переписывать только LCD_CHAR.
|
|
|
|
|
Aug 13 2008, 13:57
|

Участник

Группа: Свой
Сообщений: 67
Регистрация: 5-02-07
Пользователь №: 25 074

|
Цитата(Kolia @ Aug 13 2008, 19:49)  Пользуй мою табличку - она меньше требует памяти, а по скорости практически не уступает SysRq VXDRV зато экономия флэхи 64 байта вместо 256 Ну да... ))) При том, что я повесил проект на ось - о тормозах говорить мне безсмысленно. )))
|
|
|
|
|
Aug 14 2008, 07:15
|

Частый гость
 
Группа: Участник
Сообщений: 89
Регистрация: 5-10-07
Пользователь №: 31 098

|
Цитата(mempfis_ @ Aug 14 2008, 10:50)  Подкину Вам и свой вариант вывода кириллицы на жк-индикаторы. программа работает и в CVAVR и в IAR (конечно с учётом синтаксиса в обоих компиляторах) Пример использования __flash unsigned char TestString[17] = {"Тэст Test "}; WriteStringToDispley(&TestString[0]); P.S. Для жк 16х2 каждая строка занимает 17 байт (16 символов плюс 1 окончания строки). Программа пишет 16 символов, но не сложно ввести проверку на символ окончания строки и писать только то что нужно. Надеюсь кому-нибудь моя программа поможет  Спасибо, обязательно посмотрю.
|
|
|
|
|
Aug 14 2008, 09:14
|
Профессионал
    
Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008

|
2SysRqЦитата (я лишь программер, железо получаю готовое). Чем улучшить? Влиять на разработчиков и приучать их вешать всё на аппаратные интерфейсы. Мне знакома подобная ситуация, сам был в такой. Благоприятному взаимодействию очень помогают знания схемотехники у программиста. 2mempfis_Тогда уж не Цитата WriteStringToDispley(&TestString[0]); , а Цитата WriteStringToDisplay(&TestString[0]); По английски тоже лучше без ошибок писать
--------------------
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|