Оговорюсь: в программировании МК я понимаю не так уж много, но стремлюсь к знаниям.
Имеем:
Atmega8
LCD WH1602A
CodeVision AVR
Желание всё это запустить)
Собрал. Подключил D0-D7... Включил CVAVR... И началось. Воевал я с ним около двух недель... И вроде бы LCD даже инициализировался, только таблица символов пестрила повторениями и вообще не соответствовала действительности. Большинство управляющих кодов также воспринималось экраном не в соответствии с таблицей, а от балды.
Пробовал менять дисплей - не помогло. Такая же проблема.
Сегодня перепаял под передачу данных по 4 проводам. Не заработало. Вообще. Даже не видно инициализации. Случайно обнаружил установленный Bascom, немного поковырялся и вуаля! Через него всё прекрасно работает!
Помогите, пожалуйста, найти ошибку(Ошибки) в коде для CVAVR, чтобы заставить работать этот агрегат...
Да! Подключение:
D4=PD0
D5=PD1
D6=PD2
D7=PD3
E=PB6
RS=PB7
RW повесил на землю, т.к. всё равно ничего не считываю из LCD.
Прилагаю исходник Bascom и исходник CVAVR.
Оба наброска взяты с просторов Сети.
Спойлер
Код: Выделить всё
$regfile = "m8def.dat"
Config Lcdpin = Pin , Rs = Portb.7 , E = Portb.6 , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3
Config Lcd = 16 * 2
Cursor Off Noblink
Cls
Lcd "Hello! It work!"
Locate 2 , 2
Lcd "Really work!"
Cursor on, blink
End
Код: Выделить всё
#include <mega8.h> //#include <mega48.h>
#define RS PORTB.7 //0-запись команд, 1-запись данных
#define E PORTB.6 //Ввод данных по спадающему фронту
#define DB7 PORTD.3 //Определение линий 4-х битного интерфейса
#define DB6 PORTD.2
#define DB5 PORTD.1
#define DB4 PORTD.0
#define time 340 //Базовая задержка времени(~20 на 1МГц)
//#pragma rl-
//------------ФУНКЦИЯ ЗАДЕРЖКИ ВРЕМЕНИ-----------------------
void delay(unsigned int a)
{unsigned int cnt;
for (cnt=a; cnt>0; cnt--);
}
//------------------ФУНКЦИЯ ЗАПИСИ В ЖКИ--------------------
void lcd(unsigned char d)
{E=1;
DB7=(d&0x80)>>7; //Выводим старший ниббл
DB6=(d&0x40)>>6;
DB5=(d&0x20)>>5;
DB4=(d&0x10)>>4;
delay(time); //Задержка
E=0; //Запись
delay(time); //Задержка
E=1; //enable = 1
DB7=(d&0x08)>>3; //Выводим младший ниббл
DB6=(d&0x04)>>2;
DB5=(d&0x02)>>1;
DB4=(d&0x01);
delay(time); //Задержка
E=0; //Запись
delay(5*time); //Пауза для выполнения команды
}
//------------ФУНКЦИЯ ЗАПИСИ КОМАНДЫ В ЖКИ-------------------
void lcd_com(unsigned char c)
{RS=0; //Режим записи команд
lcd(c); //Запись
}
//---------- ЗАПИСИ ДАННЫХ В ЖКИ---------------------
void lcd_putchar(unsigned char d)
{RS=1; //Режим записи команд
lcd(d); //Запись
}
//-------------ФУНКЦИЯ ОЧИСТКИ ЖКИ---------------------------
void lcd_clear(void)
{lcd_com(0x01); delay(time*1000);//Очистка ЖКИ
}
//-----------ФУНКЦИЯ ИНИЦИАЛИЗАЦИИ ЖКИ-----------------------
void lcd_init(void)
{delay(time*100); //Предварительная задержка
lcd_com(0x33); delay(time*500); //Подготовка
lcd_com(0x32); lcd_com(0x28); //4 бита, 2 строки (см. Datasheet-s)
lcd_com(0x08); //Выключение ЖКИ
lcd_clear(); //Очистка ЖКИ
lcd_com(0x06); //Сдвиг курсора вправо
lcd_com(0x0D); //Включение без курсора
delay(time*5); //Пауза для выполнения команды
}
//---------- ВЫВОДА СТРОКИ НА ЖКИ---------------------
void lcd_puts(unsigned char *str)
{
char k;
while ((k=*str++)!= 0) lcd_putchar(k);
}
//--------ФУНКЦИЯ ПЕРЕХОДА В УКАЗАННУЮ ПОЗИЦИЮ--------------
void lcd_gotoxy(unsigned char x, unsigned char y)
{
lcd_com((0x80+y*64)+x); //Рассчет позиции. Ячейка 0х80 - лев. верхн. угол
}
void main (void)
{
lcd_init();
lcd_gotoxy(2,2);
}


