Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: mega16+hd44780
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
Lyt
в учебных целях решил написать свою бибилиотеку для работу с hd44780. При симуляции в протеусе выдаются сообщения про конфликт уровней
logic contention detected on net #00000
logic contention detected on net #00001
logic contention detected on net #00002
logic contention detected on net #00003
ЧЯДНТ?

пока написал только начальную инициализацию дисплея.
Код:
CODE
/* Вывод на lcd hd44780. для AtMega16*/
#define F_CPU 8000000L
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/delay.h>
//Порт А - шина данных/адреса lcd
#define LCD_PORT_OUT PORTA
#define LCD_PORT_IN PINA
#define LCD_PORT_pullup PORTA
#define pullup_on 0xff
#define pullup_of 0x00
#define LCD_PORT_DIRECTION DDRA
#define write 0xff
#define read 0x00
#define busy_flag (LCD_PORT_IN&&0x01) //busy_flag - значение 0 бита порта контроллера (7 бита lcd)
//Порт С - управление lcd. PC5-E,PC6-RW,PC7-RS
#define LCD_CONTROL PORTC
#define LCD_RS PC7
#define LCD_RW PC6
#define LCD_E PC5
#define data 0xff
#define command 0x00
/* Ф-я ожидания сброса флага занятости lcd */
void check_busy_flag()
{
LCD_CONTROL=LCD_CONTROL|(1<<LCD_RW);
LCD_CONTROL=LCD_CONTROL&(~(1<<LCD_RS));
LCD_PORT_OUT=0x00; //очистка содержимого порта перед чтением флага
LCD_PORT_DIRECTION=read; //переключение шины адреса/данных lcd на ввод
LCD_PORT_pullup=pullup_on;
volatile unsigned char temp;
temp=0x00;
while(busy_flag==1) //ожидание сброса флага занятости
{
if (temp==0xff)
break;
else
temp++;
}
LCD_PORT_pullup=pullup_of;
}
/** Ф-я передачи в lcd байта комманды/данных ***
*** Входные параметры: rs - тип передаваемой информации (0x00=команда/0xff=данные), ***
*** information - передаваемая информация ***/
void send_byte_to_lcd(unsigned char rs,unsigned char information)
{
LCD_CONTROL=LCD_CONTROL&(~(1<<LCD_RW)); //направление - на дисплей
if (rs==command)
LCD_CONTROL=LCD_CONTROL&(~(1<<LCD_RS)); //тип передаваемых данных-команда
else if (rs==data)
LCD_CONTROL=LCD_CONTROL|(1<<LCD_RS); //тип передаваемых данных-данные
check_busy_flag(); //ожидание готовности lcd
LCD_PORT_DIRECTION=write;
LCD_CONTROL=LCD_CONTROL|(1<<LCD_E);
LCD_PORT_OUT=information;
_delay_ms(5);
LCD_CONTROL=LCD_CONTROL&(~(1<<LCD_E)); //формирование отрицательного фронта для передачи данных
}
/** Ф-я начальной инициализации lcd. Устанавливается режим 8-битной шины, также по ***
*** умолчанию настраивается: число строк-1, размер символа-5*8, курсор выключен ***/
void lcd_inicialization()
{

// PC5-PC7 - управление LCD: PC5-E,PC6-RW,PC7-RS.
DDRC=DDRC|((1<<LCD_RS)|(1<<LCD_RW)|(1<<LCD_E)); //PC5-PC7 - на выход
volatile unsigned char byte;
byte=0b00110000; //шина в 8 бит
_delay_ms(50); //задержка для роста Vcc lcd до 5 вольт
LCD_CONTROL=LCD_CONTROL&(~(1<<LCD_RW)); //направление - на дисплей
LCD_CONTROL=LCD_CONTROL&(~(1<<LCD_RS)); //тип передаваемых данных-команда
LCD_PORT_DIRECTION=write;
LCD_CONTROL=LCD_CONTROL|(1<<LCD_E);
LCD_PORT_OUT=byte; //шина 8 бит
_delay_us(1); //задержка для импульса Е
LCD_CONTROL=LCD_CONTROL&(~(1<<LCD_E)); //формирование отрицательного фронта для приема lcd данных
_delay_us(4100); //ожидание готовности (Busy flag не мождет быть проверен)
LCD_CONTROL=LCD_CONTROL|(1<<LCD_E);
LCD_PORT_OUT=byte; //шина в 8 бит
_delay_us(1); //задержка для импульса Е
LCD_CONTROL=LCD_CONTROL&(~(1<<LCD_E)); //формирование отрицательного фронта для приема lcd данных
_delay_us(100);
LCD_CONTROL=LCD_CONTROL|(1<<LCD_E);
LCD_PORT_OUT=byte; //шина в 8 бит
_delay_us(1); //задержка для импульса Е
LCD_CONTROL=LCD_CONTROL&(~(1<<LCD_E)); //формирование отрицательного фронта для приема lcd данных
// Начальная инициализация завершена - шина 8 бит,1строка,символ 5*8.
// Для записи последующих команд может быть проверен флаг Busy flag
volatile unsigned char rs;
rs=command;
byte=0b00000001; //очистка экрана
send_byte_to_lcd(rs,byte);
byte=0b00000110; //инкремент счетчика адреса, экран не двигается
send_byte_to_lcd(rs,byte);
byte=0b00001110; //включение дисплея, курсор не виден
send_byte_to_lcd(rs,byte);
}
void main(void)
{
lcd_inicialization();
while(1)
{
sei();
};
}
= ';

Нажмите для просмотра прикрепленного файла
Нажмите для просмотра прикрепленного файла
Vetal-Soft
КО: Надо сначала переключить порт микроконтроллера подключенный к DB0...DB7 как вход, а потом выставлять сигнал RW.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.