вот код, мб в нем что не так?
Код: Выделить всё
#include <avr/interrupt.h>
#include <util/delay.h>
#include <avr/eeprom.h>
#define RS 6 //RS=PA6 - сигнал управления ЖКИ
#define E 5 //E=PA5 - строб-сигнал
//а0-а3 дата,
void lcd_pre_init(void);
void lcd_com (unsigned char lcd);
void lcd_dat (unsigned char lcd);
void lcd_show(void);
void lcd_init (void);
//----------
int main (void)
{
DDRA = 0xEF; // порт А работает как выход
DDRB = 0x00; // порт В работает как вход
lcd_pre_init();
lcd_show();
sei();
}
//----------
//программа перевода дисплея в 4-битный режим
void lcd_pre_init(void)
{
/*
троекратная команда установки 8-битного режима для раздупления дисплея. Вместо 0x30 подается
0x03, т.к. у меня выводам D5-D8 дисплея соответствуют выводы D0-D3 МК
*/
PORTA = ((0x03)&~(1<<RS))|(1<<E);
_delay_us(50);
PORTA = ((0x03)&~(1<<RS))&~(1<<E);
_delay_ms(20);
PORTA = ((0x03)&~(1<<RS))|(1<<E);
_delay_us(50);
PORTA = ((0x03)&~(1<<RS))&~(1<<E);
_delay_ms(2);
PORTA = ((0x03)&~(1<<RS))|(1<<E);
_delay_us(50);
PORTA = ((0x03)&~(1<<RS))&~(1<<E);
_delay_ms(2);
PORTA = ((0x02)&~(1<<RS))|(1<<E); // установка 4-битного режима, далее дисплей работает в нем
_delay_us(50);
PORTA = ((0x02)&~(1<<RS))&~(1<<E);
_delay_ms(2);
lcd_init();
}
//----------
// программа обработки команд для ЖКИ
void lcd_com (unsigned char lcd)
{
unsigned char temp;
temp = ((lcd >> 4)&~(1<<RS))|(1<<E); // RS=0 – это команда
PORTA = temp; // Выводим на portА старшую тетраду команды, сигналы RS, E
_delay_us(50); // Небольшая задержка для стабилизации
PORTA = temp&~(1<<E); // Сигнал записи команды
_delay_us(50); // задержка между циклами записи
temp=(((lcd<<4)>>4)&~(1<<RS))|(1<<E);// RS=0 – это команда
PORTA=temp; // Выводим на portА младшую тетраду команды, сигналы RS, E
_delay_us(50); // Небольшая задержка для стабилизации
PORTA = temp&~(1<<E); // Сигнал записи команды
_delay_us(50); //Пауза для выполнения команды
}
//----------
// программа записи данных в ЖКИ
void lcd_dat (unsigned char lcd)
{
unsigned char temp;
temp=((lcd>>4)|(1<<RS))|(1<<E); //RS=1 – это данные
PORTA=temp; //Выводим на portА старшую тетраду данных, сигналы RS, E
_delay_us(50); //Небольшая задержка для стабилизации
PORTA = temp&~(1<<E); //Сигнал записи данных
_delay_us(50); // задержка между циклами записи
temp=(((lcd<<4)>>4)|(1<<RS))|(1<<E); //RS=1 – это данные
PORTA=temp; //Выводим на portА младшую тетраду данных, сигналы RS, E
_delay_us(50); //Небольшая задержка для стабилизации
PORTA = temp&~(1<<E); //Сигнал записи данных
_delay_us(50); //Пауза для вывода данных
}
//----------
// программа обработки данных для вывода
void lcd_show(void)
{
lcd_com(0x80); //Ставим курсор на начало 1-й строки ЖКИ
lcd_dat('0')
lcd_com(0xC0); //Ставим курсор на начало 2-й строки ЖКИ
lcd_dat('1')
}
//----------
// программа инициализации
void lcd_init (void)
{
lcd_com(0x28); // 4-проводный интерфейс, 2 строки, 5х8 символ
_delay_us(200);
lcd_com(0x01); // Очистить DDRAM и установить курсор на 0x00
_delay_us(200);
lcd_com(0x06); // инкремент адреса, сдвиг экрана отключен
_delay_us(200);
lcd_com(0x0C); // Показать изображение, курсор не показывать
_delay_us(200);
}
//----------