Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ЖК MT-10S1 +AtMega8535
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
impuls-v
Вот достался МЭЛТовский ЖК, написал по даташиту програмку, да вот чтото она не работает.
Пожалуйста подскажите что не так в программе.

#include <mega8535.h>
// частота кристалла [Гц]
#define xtal 16000000
// глобальные переменные
unsigned int F1;
//unsigned char RW;
init_LCD(); wait20m(); wait40(); writedata4(unsigned char data); writecode4(unsigned char code); wait1();

// основная программа
void main(void)
{
// локальные переменные
DDRB=0xff; //порт B как выход
PORTB=0X00;
DDRA=0xff; //порт A как выход тест
PORTA=0X00;//тест
#asm("sei"); // разрешение глобальных прерываний (установка бита 07 SREG)
PORTA.0=1; //тест
init_LCD(); // инициализация LCD
PORTA.5=1; //тест
writecode4(0x80+0x40);
PORTA.6=1; //тест
writedata4(0x32);
PORTA.7=1; //тест
while (1);
}

init_LCD(void)
{
PORTA.1=1; //тест
wait20m();
PORTB=0x03; // установить разрядность интерфейса
PORTB.6=1; // установить Е=1 - строб импульс
wait1();
PORTB.6=0; // установить Е=0
wait40();
PORTB=0x03; // установить разрядность интерфейса
PORTB.6=1; // установить Е=1 - строб импульс
wait1();
PORTB.6=0; // установить Е=0
wait40();
PORTA.2=1; //тест
PORTB=0x03; // установить разрядность интерфейса
PORTB.6=1; // установить Е=1 - строб импульс
wait1();
PORTB.6=0; // установить Е=0
wait40();
PORTB=0x02; // установить4-х разрядн интерфейс
PORTB.6=1; // установить Е=1 - строб импульс
wait1();
PORTB.6=0; // установить Е=0
wait40();
PORTA.3=1; //тест
PORTB=0x02; // установить4-х разрядн интерфейс и выбор второй кодовой страницы (Windows-1251)
PORTB.6=1; // установить Е=1 - строб импульс
wait1();
PORTB.6=0; // установить Е=0
PORTB=0x0A; // установить4-х разрядн интерфейс и выбор второй кодовой страницы (Windows-1251)
wait1();
PORTB.6=1; // установить Е=1 - строб импульс
wait1();
PORTB.6=0; // установить Е=0
wait40();
PORTB=0x00; // установка параметров индикатора
PORTB.6=1; // установить Е=1 - строб импульс
wait1();
PORTB.6=0; // установить Е=0
PORTB=0x08; // установка параметров индикатора
wait1();
PORTB.6=1; // установить Е=1 - строб импульс
wait1();
PORTB.6=0; // установить Е=0
wait40();
PORTB=0x00; // очистка дисплея
PORTB.6=1; // установить Е=1 - строб импульс
wait1();
PORTB.6=0; // установить Е=0
PORTB=0x01; // очистка дисплея
wait1();
PORTB.6=1; // установить Е=1 - строб импульс
wait1();
PORTB.6=0; // установить Е=0
wait40();
PORTA.4=1; //тест
//PORTB=0x00; // очистка дисплея
//PORTB.6=1; // установить Е=1 - строб импульс
//wait1();
//PORTB.6=0; // установить Е=0
//PORTB=0x01; // очистка дисплея
//PORTB.6=1; // установить Е=1 - строб импульс
wait1();
//PORTB.6=0; // установить Е=0
//wait40();
wait20m();
PORTB=0x00; // установка режима ввода данных
PORTB.6=1; // установить Е=1 - строб импульс
wait1();
PORTB.6=0; // установить Е=0
PORTB=0x06; // очистка дисплея
wait1();
PORTB.6=1; // установка режима ввода данных
wait1();
PORTB.6=0; // установить Е=0
wait40();
}

wait20m(void) //задержка на 20 мс
{
F1=0x49f0;
while (F1>0) {--F1;};
}


wait40(void)//задержка на 40 мс
{
F1=55;
while (F1>0) {--F1;};
}

writedata4(unsigned char data)
{
//data=(data>>4)|(data<<4);
#asm
LD R30,Y
SWAP R30
ST Y,R30
#endasm
PORTB=data&0xBF;//вывожу в порт данные, BF для того чтобы не трогать строб Е
PORTB.5=0; //устанавливаю R/W=0
PORTB.4=0;//устанавливаю A0=0
PORTB.6=1; // установить Е=1 - строб импульс
wait1();
PORTB.6=0; // установить Е=0
#asm
LD R30,Y
SWAP R30
ST Y,R30
#endasm
PORTB=data&0xBF;//вывожу в порт данные, BF для того чтобы не трогать строб Е
PORTB.5=0; //устанавливаю R/W=0
PORTB.4=0;//устанавливаю A0=0
wait1();
PORTB.6=1; // установить Е=1 - строб импульс
wait1();
PORTB.6=0; // установить Е=0
wait40();
/* Пример:

Правильное использование параметров
void change (int *x, int *y)
{ int k=*x;
*x=*y;
*y=k;
}

При вызове такой функции в качестве фактических параметров должны быть использованы не значения переменных, а их адреса

change (&a,&b);
*/

}

writecode4(unsigned char code)
{
#asm
LD R30,Y
SWAP R30
ST Y,R30
#endasm
PORTB=code&0xBF;//вывожу в порт данные, BF для того чтобы не трогать строб Е
PORTB.5=0; //устанавливаю R/W=0
PORTB.4=0;//устанавливаю A0=0
PORTB.6=1; // установить Е=1 - строб импульс
wait1();
PORTB.6=0; // установить Е=0
#asm
LD R30,Y
SWAP R30
ST Y,R30
#endasm
PORTB=code&0xBF;//вывожу в порт данные, BF для того чтобы не трогать строб Е
PORTB.5=0; //устанавливаю R/W=0
PORTB.4=0;//устанавливаю A0=0
wait1();
PORTB.6=1; // установить Е=1 - строб импульс
wait1();
PORTB.6=0; // установить Е=0
wait40();

}

wait1(void) //задержка на переключ
{
F1=0x04;
while (F1>0) {--F1;};
}
SergSit
Вы не в CODEVISION писали программу? Если в нем то там есть библиотека для управления LCD
impuls-v
Я конечно извиняюсь. Но смысл написать самому а не использовать готовое, кто муже библиотека сильно сьедает место.
ps1x
Цитата(impuls-v @ Jul 18 2006, 23:44) *
Я конечно извиняюсь. Но смысл написать самому а не использовать готовое, кто муже библиотека сильно сьедает место.

Кстати встроенная в СV библеотека не будет работать с МЭЛТовскими дисплеями ибо они не соответствуют по коммандам в 4 битном режиме, если надо вышлю Вам исправленный вариант.
impuls-v
Было бы очень неплоха. Пришли пожалуйста на filyakov_s(гав-гав)vmtp.ru
Коляй
Ды я вот тоже с отечественным ЖКИ возился-возился, а потом думаю, не просто так ребята в документацию на LCD торкают. Почитал, написал три функции пока. (запись команды, запись данных, инициализация). Пока вот с помощью их(точнее всего двух) толкаю в ЖК всякие знаки. В целях изучения так сказать. Если частота кварца увеличивается, просто задержки увеличиваю(в эмуляторе). А работает на железе уже. (Только сильно не смейтесь, я же учусь. )

#include <pindef.h>

void delay (long p) {p*=100;
while (p>0)
p--;}

void LCD_COM(char COM){
LCD_RS=0;
LCD_RW=0;
LCD_DIR=0xFF;
LCD_PORT=COM;
LCD_E=1;
delay(15);
LCD_E=0;
LCD_DIR=0x00;
LCD_PORT=0x00;
delay(40);}

void LCD_DATA (char DATA){
LCD_RS=1;
LCD_RW=0;
LCD_DIR=0xFF;
LCD_PORT=DATA;
LCD_E=1;
delay(15);
LCD_E=0;
LCD_DIR=0x00;
LCD_PORT=0x00;
delay(40);}

void LCD_INIT(void){
delay(30);
LCD_COM(0x30);
delay(40);
LCD_COM(0x30);
delay(40);
LCD_COM(0x30);
delay(40);
LCD_COM(0x3A);//8-bit and rusian
delay(10);
LCD_COM(0x08);
delay(20);
LCD_COM(1);
delay(20);
LCD_COM(0x06);
delay(20);}

}
ps1x
Цитата(impuls-v @ Jul 19 2006, 09:25) *
Было бы очень неплоха. Пришли пожалуйста на filyakov_s(гав-гав)vmtp.ru

Отправил smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.