Вот достался МЭЛТовский ЖК, написал по даташиту програмку, да вот чтото она не работает. Пожалуйста подскажите что не так в программе.
#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;}; }
|