tak, tak, już sobie z tym poradziłem, było trochę więcej do zmieniania niż dwie linie, ale dało rade, wystarczyło mi rozdzielić obsługę Portu DATA na dwa porty.
Dla potomnych umieszczam rozwiązanie:
Definicje:
#define KS0108_DATA_PORT1 PORTA
#define KS0108_DATA_DIR1 DDRA
#define KS0108_DATA_PIN1 PINA
#define KS0108_DATA_DB0 (1 << PA0)
#define KS0108_DATA_DB1 (1 << PA1)
#define KS0108_DATA_DB2 (1 << PA2)
#define KS0108_DATA_DB3 (1 << PA3)
#define KS0108_DATA_PORT2 PORTC
#define KS0108_DATA_DIR2 DDRC
#define KS0108_DATA_PIN2 PINC
#define KS0108_DATA_DB4 (1 << PC0)
#define KS0108_DATA_DB5 (1 << PC1)
#define KS0108_DATA_DB6 (1 << PC2)
#define KS0108_DATA_DB7 (1 << PC3)
w szystkie przeróbki funkcji tak:
void _LCD_OutNibble(unsigned char nibbleToWrite)
{
if(nibbleToWrite & 0x01)
KS0108_DATA_PORT1 |= KS0108_DATA_DB0;
else
KS0108_DATA_PORT1 &= ~KS0108_DATA_DB0;
if(nibbleToWrite & 0x02)
KS0108_DATA_PORT1 |= KS0108_DATA_DB1;
else
KS0108_DATA_PORT1 &= ~KS0108_DATA_DB1;
if(nibbleToWrite & 0x04)
KS0108_DATA_PORT1 |= KS0108_DATA_DB2;
else
KS0108_DATA_PORT1 &= ~KS0108_DATA_DB2;
if(nibbleToWrite & 0x08)
KS0108_DATA_PORT1 |= KS0108_DATA_DB3;
else
KS0108_DATA_PORT1 &= ~KS0108_DATA_DB3;
if(nibbleToWrite & 0x10)
KS0108_DATA_PORT2 |= KS0108_DATA_DB4;
else
KS0108_DATA_PORT2 &= ~KS0108_DATA_DB4;
if(nibbleToWrite & 0x20)
KS0108_DATA_PORT2 |= KS0108_DATA_DB5;
else
KS0108_DATA_PORT2 &= ~KS0108_DATA_DB5;
if(nibbleToWrite & 0x40)
KS0108_DATA_PORT2 |= KS0108_DATA_DB6;
else
KS0108_DATA_PORT2 &= ~KS0108_DATA_DB6;
if(nibbleToWrite & 0x80)
KS0108_DATA_PORT2 |= KS0108_DATA_DB7;
else
KS0108_DATA_PORT2 &= ~KS0108_DATA_DB7;
}
unsigned char _LCD_InNibble(void)
{
unsigned char tmp = 0;
if(KS0108_DATA_PIN1 & KS0108_DATA_DB0)
tmp |= (1 << 0);
if(KS0108_DATA_PIN1 & KS0108_DATA_DB1)
tmp |= (1 << 1);
if(KS0108_DATA_PIN1 & KS0108_DATA_DB2)
tmp |= (1 << 2);
if(KS0108_DATA_PIN1 & KS0108_DATA_DB3)
tmp |= (1 << 3);
if(KS0108_DATA_PIN2 & KS0108_DATA_DB4)
tmp |= (1 << 4);
if(KS0108_DATA_PIN2 & KS0108_DATA_DB5)
tmp |= (1 << 5);
if(KS0108_DATA_PIN2 & KS0108_DATA_DB6)
tmp |= (1 << 6);
if(KS0108_DATA_PIN2 & KS0108_DATA_DB7)
tmp |= (1 << 7);
return tmp;
}
unsigned char GLCD_ReadStatus(unsigned char controller)
{
unsigned char status;
KS0108_DATA_DIR1 &= ~(KS0108_DATA_DB0|KS0108_DATA_DB1|KS0108_DATA_DB2|KS0108_DATA_DB3);
KS0108_DATA_DIR2 &= ~(KS0108_DATA_DB4|KS0108_DATA_DB5|KS0108_DATA_DB6|KS0108_DATA_DB7);
KS0108_CTRL_PORT |= KS0108_RW;
KS0108_CTRL_PORT &= ~KS0108_RS;
GLCD_EnableController(controller);
KS0108_CTRL_PORT |= KS0108_EN;
GLCD_Delay();
status = _LCD_InNibble();
KS0108_CTRL_PORT &= ~KS0108_EN;
GLCD_DisableController(controller);
return status;
}
void GLCD_WriteCommand(unsigned char commandToWrite, unsigned char controller)
{
while(GLCD_ReadStatus(controller)&DISPLAY_STATUS_BUSY);
KS0108_DATA_DIR1 |= (KS0108_DATA_DB0|KS0108_DATA_DB1|KS0108_DATA_DB2|KS0108_DATA_DB3);
KS0108_DATA_DIR2 |= (KS0108_DATA_DB4|KS0108_DATA_DB5|KS0108_DATA_DB6|KS0108_DATA_DB7);
KS0108_CTRL_PORT &= ~(KS0108_RW | KS0108_RS);
GLCD_EnableController(controller);
_LCD_OutNibble(commandToWrite) ;
KS0108_CTRL_PORT |= KS0108_EN;
GLCD_Delay();
KS0108_CTRL_PORT &= ~KS0108_EN;
GLCD_DisableController(controller);
}
unsigned char GLCD_ReadData(void)
{
unsigned char data;
while(GLCD_ReadStatus(screen_x / 64)&DISPLAY_STATUS_BUSY);
KS0108_DATA_DIR1 &= ~(KS0108_DATA_DB0|KS0108_DATA_DB1|KS0108_DATA_DB2|KS0108_DATA_DB3);
KS0108_DATA_DIR2 &= ~(KS0108_DATA_DB4|KS0108_DATA_DB5|KS0108_DATA_DB6|KS0108_DATA_DB7);
KS0108_CTRL_PORT |= (KS0108_RW | KS0108_RS);
GLCD_EnableController(screen_x / 64);
KS0108_CTRL_PORT |= KS0108_EN;
GLCD_Delay();
data = _LCD_InNibble();
KS0108_CTRL_PORT &= ~KS0108_EN;
GLCD_DisableController(screen_x / 64);
screen_x++;
return data;
}
void GLCD_WriteData(unsigned char dataToWrite)
{
while(GLCD_ReadStatus(screen_x / 64)&DISPLAY_STATUS_BUSY);
KS0108_DATA_DIR1 |= (KS0108_DATA_DB0|KS0108_DATA_DB1|KS0108_DATA_DB2|KS0108_DATA_DB3);
KS0108_DATA_DIR2 |= (KS0108_DATA_DB4|KS0108_DATA_DB5|KS0108_DATA_DB6|KS0108_DATA_DB7);
KS0108_CTRL_PORT &= ~KS0108_RW;
KS0108_CTRL_PORT |= KS0108_RS;
_LCD_OutNibble(dataToWrite);
GLCD_EnableController(screen_x / 64);
KS0108_CTRL_PORT |= KS0108_EN;
GLCD_Delay();
KS0108_CTRL_PORT &= ~KS0108_EN;
GLCD_DisableController(screen_x / 64);
screen_x++;
}
Wszystkie te funkcje są autorstwa:
//-------------------------------------------------------------------------------------------------
// Universal KS0108 driver library
// Atmel AVR MCU low-level driver.
// (c) Radosław Kwiecień, radek@dxp.pl
//-------------------------------------------------------------------------------------------------
ja je tylko pozmieniałem.
temat zostawię parę dni otwarty jak by były jakieś pytania bądź uwagi.tadzik85 dostajesz "pomógł"
