Skocz do zawartości

Odwrotne pdłączenie portów uc z portami LCD


sobal44

Pomocna odpowiedź

Witam

mam podłączony wyświetlacz lcd do lini portów uC w taki sposób:

LCD | uC

--------------

DB0 | PORTC7

DB1 | PORTC6

DB2 | PORTC5

DB3 | PORTC4

DB4 | PORTC3

DB5 | PORTC2

DB6 | PORTC1

DB7 | PORTC0

w normalnym podłączeniu po prostu to co bym chciał wysłać wrzucał bym na linie portu, a w tym przypadku co mam zrobić??

zrobiłem coś takiego

PORTC |= (data & 0x01) << 7;

PORTC |= (data & 0x02) << 6;

PORTC |= (data & 0x04) << 5;

PORTC |= (data & 0x08) << 4;

PORTC |= (data & 0x10) << 3;

PORTC |= (data & 0x20) << 2;

PORTC |= (data & 0x40) << 1;

PORTC |= (data & 0x80) << 0; // wystawienie na port danej

ale nie za bardzo działa, może to powinno działać ale mam błąd gdzieś indziej?

pomóżcie 🙁

[ Dodano: 14-08-2011, 17:53 ]

PORTC |= (x & 0x01) << 7;

PORTC |= (x & 0x02) << 5;

PORTC |= (x & 0x04) << 3;

PORTC |= (x & 0x08) << 1;

PORTC |= (x & 0x10) >> 1;

PORTC |= (x & 0x20) >> 3;

PORTC |= (x & 0x40) >> 5;

PORTC |= (x & 0x80) >> 7;

takie cos tez nie działa:/

Link do komentarza
Share on other sites

Spróbuj na ifach, tak jak tu .

 
  if(v&0x01) SET_LCD_D4; else CLR_LCD_D4;
   if(v&0x02) SET_LCD_D5; else CLR_LCD_D5;
   if(v&0x04) SET_LCD_D6; else CLR_LCD_D6;
   if(v&0x08) SET_LCD_D7; else CLR_LCD_D7;
   if(v&0x10) SET_LCD_D4; else CLR_LCD_D4;
   if(v&0x20) SET_LCD_D5; else CLR_LCD_D5;
   if(v&0x40) SET_LCD_D6; else CLR_LCD_D6;
   if(v&0x80) SET_LCD_D7; else CLR_LCD_D7
Link do komentarza
Share on other sites

sobal44 ta druga wersja powinna działać. Sprawdź ustawienia rejestrów DDR. Ponadto sprawdź czy faktycznie na liniach portu pojawia się to co zadajesz. Czy na tych liniach nie masz ustawionych jakiś alternatywnych funkcji portu? (często zapomina się np. o wyłączeniu JTAGa w atmedze16,32 i innych na porcie C), ale powyższy test powinien odpowiedzieć na to pytanie.

Link do komentarza
Share on other sites

Mam inny problem i nie mam pojęcia czym on może być spowodowany.

Mam program do obsługi wyświetlacza lcd graficznego

lcdgraf.h

#include <avr/io.h>
#include <util/delay.h>
#include <avr/pgmspace.h>
#include "font5x7.h"

unsigned char lcd_x, lcd_y;


#define setbit(zmienna, bit)   zmienna |= (1 << bit)               // Ustawia 'bit' w 'zmiennej'
#define clrbit(zmienna, bit)   zmienna &= ~(1 << bit)               // Kasuje 'bit' w 'zmiennej'
#define invbit(zmienna, bit)   zmienna ^= (1 << bit)               // Zmienia stan 'bit'-u na przeciwny


#define DISPLAY_STATUS_BUSY    0x80
#define DISPLAY_SET_X 0xB8
#define DISPLAY_SET_Y 0x40
#define DISPLAY_START_LINE 0xC0
#define DISPLAY_ON_CMD        0x3E
 #define ON    0x01
 #define OFF    0x00



// port szyny danych
#define LCD_DATA_PORT PORTD
#define LCD_DATA_PIN PIND
#define LCD_DATA_DDR DDRD
// port sygnałów sterujących
#define LCD_CTRL_PORT PORTB
#define LCD_CTRL_PIN PINB
#define LCD_CTRL_DDR DDRB
// sygnały sterujące
#define LCD_CS1P PB0
#define LCD_CS2P PB1
#define LCD_EN PB5
#define LCD_RW PB3
#define LCD_RS PB4
#define LCD_RST PB2


// makroinstrukcje ustawienia stanu na linii CS1
#define SET_CS1() (LCD_CTRL_PORT |= (1 << LCD_CS1P))
#define CLR_CS1() (LCD_CTRL_PORT &= ~(1 << LCD_CS1P))
// makroinstrukcje ustawienia stanu na linii CS2
#define SET_CS2() (LCD_CTRL_PORT |= (1 << LCD_CS2P))
#define CLR_CS2() (LCD_CTRL_PORT &= ~(1 << LCD_CS2P))



// makroinstrukcje ustawienia stanu na linii EN
#define SET_EN() (LCD_CTRL_PORT |= (1 << LCD_EN))
#define CLR_EN() (LCD_CTRL_PORT &= ~(1 << LCD_EN))
// makroinstrukcje ustawienia stanu na linii RW
#define SET_RW() (LCD_CTRL_PORT |= (1 << LCD_RW))
#define CLR_RW() (LCD_CTRL_PORT &= ~(1 << LCD_RW))
// makroinstrukcje ustawienia stanu na linii RS
#define SET_RS() (LCD_CTRL_PORT |= (1 << LCD_RS))
#define CLR_RS() (LCD_CTRL_PORT &= ~(1 << LCD_RS))
// makroinstrukcje ustawiajace odpowiednią kombinację sygnałów CS1 i CS2



#define LCD_CS0() SET_CS2();CLR_CS1();
#define LCD_CS1() CLR_CS2();SET_CS1();


#define LCD_NOCS() SET_CS1();SET_CS2();

void lcdInit(void)
{
LCD_DATA_DDR = 0xFF;
LCD_CTRL_DDR = 0xFF;
}

void delay(void)
{
asm("nop");asm("nop");asm("nop");
}

void lcdWait(void)
{

LCD_DATA_DDR = 0x00; // ustawienie portu danych w tryb wejściowy
CLR_RS(); // niski stan na linii RS -> odczyt rejestru statusu
SET_RW(); // wysoki stan na linii RW -> odczyt z wyświetlacza
do { //pętla
//invbit(PORTB,PB5);_delay_ms(100);invbit(PORTB,PB5);_delay_ms(100);
delay(); // opóźnienie
SET_EN(); // ustaw linię EN
delay(); // opóźnienie
CLR_EN(); // wyzeruj linię EN
} while((LCD_DATA_PIN & DISPLAY_STATUS_BUSY)); // powtarzaj do wyzerowania flagi BUSY

}


void lcdWriteCmd(unsigned char x)
{

//
lcdWait();
CLR_RS();
CLR_RW();
LCD_DATA_DDR = 0xFF;
LCD_DATA_PORT = x;
SET_EN();
delay();
CLR_EN();
}

void lcdWriteData(unsigned char data)
{
if(lcd_x < 64) // jeśli współrzędna x wyświetlacza < 64
{LCD_CS0()} // to zapisujemy do pierwszego kontrolera
else // w przeciwnym razie
{LCD_CS1()} // zapisujemy do drugiego kontrolera
//_delay_ms(5);//
lcdWait(); // oczekiwanie na gotowość kontrolera
SET_RS(); // wysoki stan na linii RS -> dane
CLR_RW(); // niski stan na linii RW -> zapis
LCD_DATA_DDR = 0xFF; // port danych -> wyjście
LCD_DATA_PORT = data; // wystawienie na port danej
SET_EN(); // wysoki stan na linii EN
delay(); // opóźnienie
CLR_EN(); // niski stan na linii EN
lcd_x++; // zwiększenie współrzędnej x wyświetlacza (pomocniczej)
if(lcd_x > 127) // jesli koniec ekranu
lcd_x = 0; // to wyzeruj współrzędną x
LCD_NOCS();
}

unsigned char lcdReadData(void)
{
unsigned char data;
if(lcd_x < 64) // jeśli współrzędna x wyświetlacza < 64
{LCD_CS0()} // to odczytujemy z pierwszego kontrolera
else // w przeciwnym razie
{LCD_CS1()} // odczytujemy z drugiego kontrolera
//_delay_ms(5);//
lcdWait(); // oczekiwanie na gotowość kontrolera
SET_RS(); // wysoki stan na linii RS -> dane
SET_RW(); // wysoki stan na linii RW -> odczyt
SET_EN(); // wysoki stan na linii EN
delay(); // opóźnienie
LCD_DATA_DDR = 0x00; // ustawienie portu danych w tryb wejsciowy
data = LCD_DATA_PIN; // odczyt danych z portu
CLR_EN(); // niski stan na linii EN
lcd_x++; // zwiększenie współrzędnej x wyświetlacza
if(lcd_x > 127) // jesli koniec ekranu
lcd_x = 0; // to wyzeruj współrzędną x
LCD_NOCS();
return data;
}

void lcdGoTo(unsigned char x, unsigned char y)
{
lcd_x = x; // przypisanie współrzędym globalnym nowych wartości
lcd_y = y;
if(lcd_x > 63) // jeśli współrzędna pozioma jest większa od 64 to
{
LCD_CS1(); // uaktywnienie drugiego kontrolera
lcdWriteCmd(DISPLAY_SET_X | lcd_y); // zapis współrzędnej pionowej
lcdWriteCmd(DISPLAY_SET_Y | (lcd_x - 64)); // zapis współrzędnej poziomej
}
else // w przeciwnym razie
{
LCD_CS0(); // uatywnienie pierwszego kontrolera
lcdWriteCmd(DISPLAY_SET_X | lcd_y); // zapis współrzędnej pionowej
lcdWriteCmd(DISPLAY_SET_Y | lcd_x); // zapis współrzędnej poziomej
LCD_CS1(); // uaktywnienie drugiego kontrolera
lcdWriteCmd(DISPLAY_SET_X | lcd_y); // zapis współrzędnej pionowej // <----tu staje program
lcdWriteCmd(DISPLAY_SET_Y | 0 ); // wyzerowanie współrzędnej poziomej
}
LCD_CS0(); // uaktywnienie pierwszego kontrolera
lcdWriteCmd(DISPLAY_START_LINE | 0); //
LCD_CS1(); // uaktywnienie drugiego kontrolera
lcdWriteCmd(DISPLAY_START_LINE | 0);
LCD_NOCS();


}


void lcdOn(void)
{
LCD_CS0(); // aktywny pierwszy kontroler
lcdWriteCmd(DISPLAY_ON_CMD | ON); // włączenie wyświetlania danych
LCD_CS1(); // aktywny drugi kontroler
lcdWriteCmd(DISPLAY_ON_CMD | ON); // włączenie wyświetlania danych
LCD_NOCS(); //
}


void lcdOff(void)
{
LCD_CS0(); // aktywny pierwszy kontroler
lcdWriteCmd(DISPLAY_ON_CMD | OFF); // wyłączenie wyświetlania danych
LCD_CS1(); // aktywny drugi kontroler
lcdWriteCmd(DISPLAY_ON_CMD | OFF); // wyłączenie wyświetlania danych
LCD_NOCS(); //
}

void lcdCls(void)
{
unsigned char x, y; // pomocnicze zmienne
for (y = 0; y < 8; y++) // 8-krotne powtórzenie pętli
{
lcdGoTo(0,y); // ustawienie współrzędnej y wyświetlacza
for (x = 0; x < 128; x++) // 128-krotne powtórzenie pętli
lcdWriteData(0x00); // zapis do wyświetlacza
}
lcdGoTo(0,0); // ustawienie początkowych współrzędnych
}

void lcdWriteChar(char x)
{
char i;
x -= 32; // konwersja kodu znaku
for(i = 0; i < 5; i++)
lcdWriteData(pgm_read_byte(Font5x7 + (5 * x) + i)); // zapis do wyświetlacza
//5 kolejnych bajtów tworzących znak
lcdWriteData(0); // odstęp między znakami
}

void lcdWriteString(char * s)
{
while(*s) // dopóki znak wskazywany przez s jest różny od zera
lcdWriteChar(*s++); // zapis znaku
}

void lcdWriteStringPgm(prog_char * s)
{
char c; // pomocnicza zmienna
while(c = pgm_read_byte(s++)) // dopóki znak wskazywany przez s jest różny od
// zera
lcdWriteChar(c); // zapis znaku
}

który działa bardzo dobrze na atmega16, atmega32 a na atmega128 nie chce w ogóle działać program się zawiesza na pierwszej instrukcji która chce wykonać(pozostałe również nie działają) lcdOn();, program zawiesza się od razu po wskoczeniu do instrukcji lcdWriteCmd()

ma ktoś pojecie co jest z tym nie tak,
wyświetlacz podłączony jest dobrze.

[ Dodano: 15-08-2011, 12:23 ]

Już któryś raz mam problem z atmega128 co z nią jest nie tak ?? wyłączyłem kompatybilność z atmega103, program po przeniesieniu mi w ogólne nie chce działać.

muszę się odwoływać inaczej do rejestrów tego mikrokontrolera czy co ??

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.