Дисплей и AVR (HD44780)

Обсуждаем контроллеры компании Atmel.
Ответить
Встал на лапы
Сообщения: 146
Зарегистрирован: Вс сен 16, 2012 22:00:40

Сообщение foton6 »

Имеется дисплейчик на контролере HD44780 и мега 8

Как с ним работать ВРОДЕ БЫ понял.

С чужих библиотек вроде запускается, но это не интересно.
Хочу научится "ручками" запускать и работать.
Спойлер

Код: Выделить всё

#include <avr/io.h>
#include <util/delay.h>
unsigned int INIT[]={0x03, 0x03, 0x03, 0x02, 0x02, 0x08, 0x00, 0x01, 0x00, 0x06 };
unsigned int IN[]={0x00, 0x0D, 0x00, 0x01, 0x14, 0x11};	
void init (void)
{
	DDRC|=0x3f;
	DDRB|=1<<0;
	

	for(int i=0;i<16;i++)
	{
		
		PORTB|=0x03;
		PORTC&=0xC0;
		PORTC|=INIT[i];
		PORTB^=0x03;
		_delay_us(450);
		
	}
}
void out (void)
{		
	for(int i=0;i<8;i++)
	{
		
		PORTB|=0x03;
		PORTC&=0xC0;
		PORTC|=IN[i];
		PORTB^=0x03;
		_delay_us(450);
		
	}
}
int main(void)
{
	_delay_ms(20);
	init();
	out();
    while(1)
    {
    }
}
Код конечно мягко говоря сырой)))))
Но он создается исключительно для игры с дисплеем, да и находится в стадии пуско-дописок.

Подключение:
4 бита данных.
Е (строб)- B0
R/W - C5
A0 (RS) - C4
DB7- C3
DB6- C2
DB6- C1
DB4- C0

По идее после запуска проги дисплей должен выдать букву "А" и после должен мигать кусор в виде черного квадратика.
Но он почему то мигает на месте 2 символа, а при попытке вывести хоть 1 символ случается всякая ересь.


Подскажите расскажите что и как?
Реклама
Встал на лапы
Сообщения: 146
Зарегистрирован: Вс сен 16, 2012 22:00:40

Сообщение foton6 »

Разобрался))))

PORTC&=0xC0; 0b11000000
из-за этого обнуления программа и не хотела работать))))
PORTC&=0xf0; а так сразу заработало все)

Подскажите как резать слова на буквы?
А лучше алгоритм вывода на диспей слов и цифр, учитывая что я использую 4 битный способ записи.
Хотя разберусь и по 8 битным алгоритмам.
Реклама
pcb
Опытный кот
Сообщения: 833
Зарегистрирован: Пт авг 12, 2011 09:14:27
Откуда: Млечный путь/Земля/РФ/Екатеринбург

Сообщение pcb »

foton6 писал(а):Разобрался))))

PORTC&=0xC0; 0b11000000
из-за этого обнуления программа и не хотела работать))))
PORTC&=0xf0; а так сразу заработало все)

Подскажите как резать слова на буквы?
А лучше алгоритм вывода на диспей слов и цифр, учитывая что я использую 4 битный способ записи.
Хотя разберусь и по 8 битным алгоритмам.
Восемь бит делиш пополам и кидаешь в порт, не забывая дергать нужные ножки.
Также нужно помнить что нужно перевести дисплей в 4 битный интерфейс.

Есть на асме как раз для меги от ком проекта, но лень искать :hunger:

Изображение

Инициализация на макросах, тут главное команды:

Код: Выделить всё

        rcall   d10ms
        rcall   d10ms
	SENDCMD8 0x30
	SENDCMD8 0x30
	SENDCMD8 0x30
	SENDCMD8 0x20
	SENDCMD 0x28
	SENDCMD 0x0C
	SENDCMD 0x06
	SENDCMD 0x01
	rcall	d10ms
	ret
Разработал:
-BLDC
-ФУОЗ/МПСЗ
-SMART BMS
-ECU/EDC на STM32F4(43%)+CPLD(57%)
-Моноинжектор на ATSAMD20G16
-контроллер эффектов для RGB LED ленты
-умные часы/обратный счет/секундомер
-устройство измерения емкости АКБ
Встал на лапы
Сообщения: 146
Зарегистрирован: Вс сен 16, 2012 22:00:40

Сообщение foton6 »

Cпасибо, инициализация это как "2 пальца обо асфальт" оказалось и дальнейшая запись или чтение.
У меня непонятные затыки:
включил вывел букву А.
Тыкал "ресет", выключал питание все норм.
На след день запустил и все....
Никаких изменений не вносил ничего не менял(((

Ну да ладно разберусь.

Подскажите что происходит в данной строке:

char *str // я так понимаю указатель на переменную типа чар? а точнее на массив(строку?)

*str++ указывает на 0+1 элемент массива? (никогда раньше не работал с указателями)

и еще вопрос:

char rr[] = " ololooo !!! " при подобной записи строка автоматом разбивается на символы и не надо заморачиваться?
Реклама
Эиком - электронные компоненты и радиодетали
pcb
Опытный кот
Сообщения: 833
Зарегистрирован: Пт авг 12, 2011 09:14:27
Откуда: Млечный путь/Земля/РФ/Екатеринбург

Сообщение pcb »

foton6 писал(а):Cпасибо, инициализация это как "2 пальца обо асфальт" оказалось и дальнейшая запись или чтение.
Важно посылать 0ч30 три раза что бы из любого режима в в нужный переставить.
foton6 писал(а):har rr[] = " ololooo !!! " при подобной записи строка автоматом разбивается на символы и не надо заморачиваться?
да.
foton6 писал(а):char *str // я так понимаю указатель на переменную типа чар? а точнее на массив(строку?)

*str++ указывает на 0+1 элемент массива? (никогда раньше не работал с указателями)
Да.

char rr[]="ololo"
char *str;

str = &rr[0]; //так удобнее из строки вытаскивать нужные слова
str = rr; тоже самое

char b = rr[1] вернет "l"

Есть хорошие старые книжки издательства бином, 90х годов в них про указатели хорошо написано. Язык с/с++.
Разработал:
-BLDC
-ФУОЗ/МПСЗ
-SMART BMS
-ECU/EDC на STM32F4(43%)+CPLD(57%)
-Моноинжектор на ATSAMD20G16
-контроллер эффектов для RGB LED ленты
-умные часы/обратный счет/секундомер
-устройство измерения емкости АКБ
Реклама
vek
Вымогатель припоя
Аватара пользователя
Сообщения: 563
Зарегистрирован: Чт апр 16, 2009 04:53:41

Сообщение vek »

Подмогните с инициализацией пожалуйста


hd44780_init:
ldi XH,high(5*DELAY) ;формируем задержку времени
ldi XL,low(5*DELAY)
rcall pause
ldi R16,0x33 ;записываем необходимую для инициализации ----------------ЗАЧЕМ ТАК???
rcall write_com ;холостую команду
ldi XH,high(5*DELAY) ;формируем задержку времени
ldi XL,low(5*DELAY)
rcall pause
ldi R16,0x32 ;записываем необходимую для инициализации ------------------ЗАЧЕМ ТАК???
rcall write_com ;холостую команду
ldi R16,0x28 ;выбираем разрядность шины 4 бита и 2 строки
; ldi R16,0x38;выбираем разрядность шины 8 бит и 2 строки
rcall write_com ;на дисплее
ldi XH,high(5*DELAY) ;формируем задержку времени
ldi XL,low(5*DELAY)
rcall pause
ldi R16,0x08 ;записываем команду выключения дисплея
rcall write_com
ldi R16,0x01 ;записываем команду начального сброса
rcall write_com
ldi XH,high(5*DELAY) ;формируем задержку времени
ldi XL,low(5*DELAY)
rcall pause
ldi R16,0x06 ;записываем команду, задающую направление
rcall write_com ;сдвига курсора вправо
ldi R16,0x0C ;записываем команду включения дисплея
rcall write_com
ret

от сюда взял http://cxem.net/mc/book52.php
В первый раз меня ударило током - и я подумал что ни черта не соображаю в электричестве. Во второй раз был аккуратнее и меня не ударило - теперь я возомнил из себя крутого микроэлектронщика.
Реклама
vek
Вымогатель припоя
Аватара пользователя
Сообщения: 563
Зарегистрирован: Чт апр 16, 2009 04:53:41

Сообщение vek »

Или это нужно для конкретной модели дисплея?
В первый раз меня ударило током - и я подумал что ни черта не соображаю в электричестве. Во второй раз был аккуратнее и меня не ударило - теперь я возомнил из себя крутого микроэлектронщика.
Ответить

Вернуться в «AVR»