Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

Проблема контраста на LCD Bolymin BC2004A, Какие-то кубики и полоски на символах

Отправлено hd44780 13 марта 2007 г. 14:15


Есть LCD Bolymin BC2004A 20x4 .
На команды реагирует, все буковки показывает, все 4 строки работают, знакогенератор работает, но:

- на знакоместах светятся кубики как при неотрегулированном контасте. На строках 1 и 3 кубики, на строках 2 и 4 черточки, похожие на знак =, но с большим расстоянием между ними.
- на входе Vo стоит потенциометр 1 кил, выставлен так, что Vo - фактически земля, но этого не хватает.
- питал схему и от LM7805 и от USB - одинаково.
- читал (http://electronix.ru/forum/index.php?showtopic=11930&hl=BC2004), что у Bolymin какая-то нестандартная инициализация, но какая, так и не понял .

Микрокод управления LCD (компилятор CvAVR):
Код работает на 2 LCD 16x2 и на этом BC2004A.
С теми двумя все идеально, с BC2004A эти непонятные проблемы ....

// Функции работы с hd44780
/*
Подключение индикатора к мк
[LCD] [PORT]
RS PC5 - 0 - рег. упр.; 1 - рег. данных
RW - 0 - запись в HD, 1 - считывание (запаян в землю)
EN PC4 - строб
D0..7 PA0
*/

#include
#include
#include "hd44780lib.h"

#define CONTROL_REG 0
#define DATA_REG 1

#define RS PORTC.5
#define DATA PORTA
#define STROBE PORTC.4

// массив перекодировки русских букв
flash byte letters [ 66 ] [ 2 ] =
{
{ 192, 65 }, // А
{ 193, 160 }, // Б
{ 194, 66 }, // В
{ 195, 161 }, // Г
{ 196, 224 }, // Д
{ 197, 69 }, // Е
{ 168, 162 }, // Ё
{ 198, 163 }, // Ж
{ 199, 164 }, // З
{ 200, 165 }, // И
{ 201, 166 }, // Й
{ 202, 75 }, // К
{ 203, 167 }, // Л
{ 204, 77 }, // М
{ 205, 72 }, // Н
{ 206, 79 }, // О
{ 207, 168 }, // П
{ 208, 80 }, // Р
{ 209, 67 }, // С
{ 210, 84 }, // Т
{ 211, 169 }, // У
{ 212, 228 }, // Ф
{ 213, 88 }, // Х
{ 214, 225 }, // Ц
{ 215, 171 }, // Ч
{ 216, 172 }, // Ш
{ 217, 226 }, // Щ
{ 218, 173 }, // Ъ
{ 220, 98 }, // Ь
{ 219, 174 }, // Ы
{ 221, 175 }, // Э
{ 222, 176 }, // Ю
{ 223, 177 }, // Я
{ 224, 97 }, // а
{ 225, 178 }, // б
{ 226, 179 }, // в
{ 227, 180 }, // г
{ 228, 227 }, // д
{ 229, 101 }, // е
{ 184, 181 }, // ё
{ 230, 182 }, // ж
{ 231, 183 }, // з
{ 232, 184 }, // и
{ 233, 185 }, // й
{ 234, 186 }, // к
{ 235, 187 }, // л
{ 236, 188 }, // м
{ 237, 189 }, // н
{ 238, 111 }, // о
{ 239, 190 }, // п
{ 240, 112 }, // р
{ 241, 99 }, // с
{ 242, 191 }, // т
{ 243, 121 }, // у
{ 244, 228 }, // Ф
{ 245, 120 }, // х
{ 246, 229 }, // ц
{ 247, 192 }, // ч
{ 248, 193 }, // ш
{ 249, 230 }, // щ
{ 250, 194 }, // ъ
{ 252, 196 }, // ь
{ 251, 195 }, // ы
{ 253, 197 }, // э
{ 254, 198 }, // ю
{ 255, 199 } // я
};

// запись байта в hd44780
// rs - значение для линии rs
static void writeByteToHD44780 ( byte dataByte, byte rs );

static byte Win1251toHd44780 ( byte win1251Letter );

// инициализация LCD
void hd44780_init ( )
{
delay_ms ( 30 );

// инициализиовать HD44780 на PORTC
// инициализация 8-бит
RS = 0; // RS := 0 - регистр управления
STROBE = 0; // EN := 0 - снять строб

writeByteToHD44780 ( 0x30, CONTROL_REG ); // 00111000 - Function set (interface is 8 bits long.)
delay_us ( 110 ); // Wait 110 mks
writeByteToHD44780 ( 0x30, CONTROL_REG ); // 00111000 - Function set (interface is 8 bits long.)
delay_ms ( 1 ); // waiting time between instruction is
// longer than the execution instruction time.

writeByteToHD44780 ( 0x38, CONTROL_REG ); // 001 1 1000 8bit - Function set
// xx1(DL)NF**
// DL = 0 --> 4 bit interface;
// DL = 1 --> 8 bit interface
// N = 0 --> 1/8 or 1/11 Duty (1 line).
// N = 1 --> 1/16 Duty (2 lines).
// F = 0 --> 5x7 dots. F = 1 --> 5x10 dots
delay_ms ( 1 ); // waiting time ...

writeByteToHD44780 ( 0x08, CONTROL_REG ); // 00001000 - display off
// xxxx1DCB
// D = 0 --> Display off. D = 1 --> Display on
// C = 0 --> Cursor off. C = 1 --> Cursor on
// B = 0 --> Cursor blink off. B = 1 --> Cursor blink on
delay_ms ( 1 ); // waiting time ...

writeByteToHD44780 ( 0x0C, CONTROL_REG ); // 00001100
// xxxx1DCB
// D = 0 --> Display off. D = 1 --> Display on
// C = 0 --> Cursor off. C = 1 --> Cursor on
// B = 0 --> Cursor blink off. B = 1 --> Cursor blink on
delay_ms ( 1 ); // waiting time ...

writeByteToHD44780 ( 0x06, CONTROL_REG ); // 000001 1 0 - entry mode
// 000001(ID)S
// I/D = 0 --> cursor is in decrement position.
// I/D = 1 --> cursor is in increment position.
// S = 0 --> Shift is invisible. S = 1 --> Shift is visible
delay_ms ( 1 ); // waiting time ...
} // hd44780_init

// вывод строки на LCD
void hd44780_puts ( char *s )
{
int len, i;
byte letter;

len = strlen ( s );
for ( i = 0; i < len; i ++ )
{
letter = Win1251toHd44780 ( s [ i ] ); // байт данных
writeByteToHD44780 ( letter, DATA_REG );
} // for
} // hd44780_puts

// перенос курсора в указанную позицию (нумерация 0, 0)
void hd44780_gotoxy ( char x, char y )
{
char address, setDDRAMaddressCmd, writeValue;

setDDRAMaddressCmd = 0x80; // команда установки адреса

// вычислить адрес курсора (0x40 - адрес начала второй строки)
// address = y * 0x40 + x;
address = 0; // default
switch ( y )
{
case 0: // 0-я строка
address = 0x00;
break;

case 1: // 1-я строка
address = 0x40;
break;

case 2: // 2-я строка
address = 0x14;
break;

case 3: // 3-я строка
address = 0x54;
break;
} // switch

// добавить столбец
if ( x < 20 )
address += x;

// окончательная команда
writeValue = setDDRAMaddressCmd | ( address & 0x7F );

writeByteToHD44780 ( writeValue, CONTROL_REG );
} // hd44780_gotoxy

// вывод строки в указанную позицию
void hd44780_puts_xy ( char x, char y, char *s )
{
hd44780_gotoxy ( x, y );
hd44780_puts ( s );
} // hd44780_puts_xy

// запись байта в hd44780
// rs - значение для линии rs
static void writeByteToHD44780 ( char dataByte, char rs )
{
// выбор регистра
if ( rs == 0 )
RS = 0;
else
RS = 1;

DATA = dataByte; // байт данных

// set strobe
STROBE = 1;
delay_ms ( 1 ); // wait 1 ms

// clear strobe
STROBE = 0;
delay_ms ( 1 ); // wait 1 ms
} // writeByteToHD44780

byte Win1251toHd44780 ( byte win1251Letter )
{
int i;

if ( win1251Letter < 128 )
return win1251Letter;

for ( i = 0; i < 66; i ++ )
{
if ( letters [ i ] [ 0 ] == win1251Letter )
return letters [ i ] [ 1 ];
} // for

return win1251Letter;
} // Win1251toHd44780

Спасибо.


Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

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

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru