Работа с ЖКИ на контроллере HD44780 и его аналогах
-
BerZerK-ku
- Мучитель микросхем
- Сообщения: 492
- Зарегистрирован: Вт июл 22, 2008 08:10:54
- Gl. Sergey
- Родился
- Сообщения: 14
- Зарегистрирован: Пт ноя 23, 2007 21:04:15
- Откуда: Липецк
- Контактная информация:
Хотя это не самый смачный вариант, но я двигал 1602 на следующую строку таким образом:
писал на первой строке 16 символов, потом чтобы прыгнуть на вторую, вызывал подпрограмму:
При работе с дисплеем 0802, вместо 24 надо вписать 32
писал на первой строке 16 символов, потом чтобы прыгнуть на вторую, вызывал подпрограмму:
Код: Выделить всё
;*********************************************
; сдвиг курсора на 24 места вперёд (переход на следующую строку)
sdvig_24: cbi portc,RS ; индикатор в режим комманд
ldi temp1,24 ; на такое количество знакомест сдвинется курсор
ldi temp,20; 20- это пустой знак, он пишется в ячейки между 1 и 2 строками
sdvig: rcall cyk2 ; вызов подпрограммы записи одного знака
dec temp1
brne sdvig
sbi portc,RS ; индикатор в режим данных
ret
;**************************************************
cyk2: out PORTA,temp; отдача данных в порт вывода
sbi portc,E ; порт С - управляет ногами индикатора: E, RS, R\W
rcall Delay ;
cbi portc,E
rcall Delay
ret
;*********************************************При работе с дисплеем 0802, вместо 24 надо вписать 32
Код: Выделить всё
ldi temp1,32 ; на такое количество знакомест сдвинется курсорДоброго всем времени суток!!! С праздничками все присутствующих и не присутствующих !!
У меня проблемка с WH1602A. подключен он к Меге 16. Как ни стараюсь его привести в чувство - он не отзывается вообще никак
помогите, пожалуйста, разобраться, в чем дело!
Заранее огромное спасибо!
У меня проблемка с WH1602A. подключен он к Меге 16. Как ни стараюсь его привести в чувство - он не отзывается вообще никак
Код: Выделить всё
#define F_CPU 4000000UL
void RS_on()
{
PORTC |= 0b00100000;
}
void RS_off()
{
PORTC &= 0b11011111;
}
void RW_on()
{
PORTC |= 0b00010000;
}
void RW_off()
{
PORTC &= 0b11101111;
}
void E_on()
{
PORTC |= 0b00001000;
}
void E_off()
{
PORTC &= 0b11110111;
}
void Init()
{
DDRA = 0xFF;
PORTA = ~0;
DDRB = 0xFF;
PORTB = 0;
DDRC = 0xFF;
PORTC = 0;
DDRD = 0xFF;
}
void cmdLCD(unsigned char data)
{
RS_off();RW_off();
asm volatile("nop");
PORTB = data;
E_on();
asm volatile("nop");
E_off();
asm volatile("nop");
};
void Init_LCD()
{
_delay_ms(100);
cmdLCD(0x0C);
_delay_ms(10);
cmdLCD(0x0C);
_delay_ms(10);
cmdLCD(0x0C);
_delay_ms(10);
//function set interface data length + symbol + lines
cmdLCD(0x2C);
_delay_ms(10);
//display off
cmdLCD(0x10);
_delay_ms(10);
//display clear
cmdLCD(0x80);
_delay_ms(10);
cmdLCD(0x20);
_delay_ms(10);
cmdLCD(0xF0);
}
int main()
{
Init();
Init_LCD();
_delay_us(100);
cmdLCD(0x81);
_delay_us(100);
RS_on();
cmdLCD(0b00001100);
_delay_us(100);
return 0;
}
Заранее огромное спасибо!
- Вложения
-
- sch.JPG
- Схема подключения
- (47.58 КБ) 812 скачиваний
Здравствуйте. Вызывает сомнение правомочность вот этого
"...void cmdLCD(unsigned char data)
{
RS_off();RW_off();
asm volatile("nop");
PORTB = data;
E_on();
asm volatile("nop");
E_off();
asm volatile("nop");
}..."
Вы пытаетесь управлять тремя битами управления одновременно. Нужно побитно в соответствии с временной диаграммой. На предыдущей странице этой ветки есть примеры.
"...void cmdLCD(unsigned char data)
{
RS_off();RW_off();
asm volatile("nop");
PORTB = data;
E_on();
asm volatile("nop");
E_off();
asm volatile("nop");
}..."
Вы пытаетесь управлять тремя битами управления одновременно. Нужно побитно в соответствии с временной диаграммой. На предыдущей странице этой ветки есть примеры.
-
vlad555
- Первый раз сказал Мяу!
- Сообщения: 23
- Зарегистрирован: Ср дек 17, 2008 20:04:36
- Контактная информация:
Пробовал этот вариант
GrigaN писал(а):
лови.. я сделал так, как советовал народ.. чуточку доработал.. все работает
char *str; // буферная строковая перменная для вывода
//массив во флэш-памяти для русских символов
flash char Decode2Rus[255-192+1]= {
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,0xAD,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 };
//функция вывода на LCD русско-символьной строки
void putsf(flash unsigned char *string)
{
char c; //символ из строки
while (c=*string++){
if(c>=192) lcd_putchar(Decode2Rus[c-192]);
else lcd_putchar(c);
}
}
выводить на лсд будешь вот так:
putsf("я Кот Матроскин!");
Все скомпилилось,только в протеусе выводит каракули.Прилагаю картинку.Помогите разобраться.
GrigaN писал(а):
лови.. я сделал так, как советовал народ.. чуточку доработал.. все работает
char *str; // буферная строковая перменная для вывода
//массив во флэш-памяти для русских символов
flash char Decode2Rus[255-192+1]= {
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,0xAD,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 };
//функция вывода на LCD русско-символьной строки
void putsf(flash unsigned char *string)
{
char c; //символ из строки
while (c=*string++){
if(c>=192) lcd_putchar(Decode2Rus[c-192]);
else lcd_putchar(c);
}
}
выводить на лсд будешь вот так:
putsf("я Кот Матроскин!");
Все скомпилилось,только в протеусе выводит каракули.Прилагаю картинку.Помогите разобраться.
- Вложения
-
- Безымянный111111.JPG
- (12.94 КБ) 1171 скачивание
а протеус нормально переваривает кирилицу ?
и почему нельзя проверить на реальном устройстве ? по-моему намного эффективнее . лично я не особо доверяю симуляторам , т.к. в реальности может получиться совсем наоборот . лучше пощупать самому , чем посмотреть на экран моника
и почему нельзя проверить на реальном устройстве ? по-моему намного эффективнее . лично я не особо доверяю симуляторам , т.к. в реальности может получиться совсем наоборот . лучше пощупать самому , чем посмотреть на экран моника
есть вопросы ? чего-то не знаешь ? [url=http://s61.radikal.ru/i174/1006/79/bc6a635c1451.jpg][color=blue][b]прежде всего смотри это[/b][/color][/url]
Atmel.ru писал(а):Перекодировщик Win-текста сообщений для ЖКИ-контроллера HD44780
Позволяет решить трудности с несоответствием кодов русских букв, зашитых в контроллер HD44780 с ANSI-кодировкой Windows и одновременно избавиться от программного перекодирования "на лету", мгновенно создав Си-код на основе набранного текста.
Возможности:
1. Создание гибкого Си-кода сообщений на основе набранного текста
2. Автоматическое присваивание уникального имени каждой строке сообщения
3. Позиционирование набранного текста на эмуляторе дисплея 4х16 строк
В комплекте поставки:
1. Работающий пример программы создания меню для установки параметров на двухстрочном индикаторе
2. В комплет также входит удобная утилита для перевода между форматами Bin,Hex,Dec
Перед стартом программы HD44780.exe для дальнейшего удобства ее использования сопоставьте тип файлов *.lcd с самой программой
Размер: 920 KB.
http://www.atmel.ru/Binary/HD-44780.exe
Боишся - не делай. Делаешь - не бойся.
- mr.Kirill
- Мучитель микросхем
- Сообщения: 438
- Зарегистрирован: Вт сен 25, 2007 19:40:26
- Откуда: Челябинск
С помощью этого файла Proteus у меня лично начинал отображать русский шрифт. Гарантировано работал с ним до версии 7.2, 7.4 не пробовал.
- Вложения
-
- lcdalpha.rar
- Добавить эту DLL'ку в папку Proteus\Models. Не забудьте сделать бэкап старого файла на всякий случай.
- (35.27 КБ) 910 скачиваний
- Lonleystranger
- Потрогал лапой паяльник
- Сообщения: 361
- Зарегистрирован: Ср янв 21, 2009 00:45:33
Алекс. писал(а):Добрый день!
Я делаю первое устройство на Atmega16 с индикацией на ЖКИ PC-1601A.
Использую CVAVR 2.03.4.
Для проверки сделал простой код: кнопка включает выход, при этом на индикаторе должен быть знак.
Вторая кнопка выключает выход, при этом на индикаторе должен быть другой знак.
Пробовал в Proteus, - все хорошо.
При включении питания на индикаторе видны заполненные прямоугольники первых 8 разрядов.
При нажатии на кнопки выход работает правильно, индикатор не работает.
1. Существует ли способ проверки работоспособности индикатора?
2. Существует ли способ проверки выхода контроллера на индикатор?
3.Существует ли предпочтительный тип ЖКИ для Atmega?
Большое спасибо.
Скорее всего неправильно инициализируете. Проверьте достаточен ли интервал ожидания вначале, перед вводом управляющих комманд...