void glcdBusyWait(uint8_t controller) { #ifdef GLCD_PORT_INTERFACE cli(); // wait until LCD busy bit goes to zero // select the controller chip glcdControllerSelect(controller); // do a read from control register outb(GLCD_DATA_PORT, 0xFF); cbi(GLCD_CTRL_PORT, GLCD_CTRL_RS); outb(GLCD_DATA_DDR, 0x00); sbi(GLCD_CTRL_PORT, GLCD_CTRL_RW); sbi(GLCD_CTRL_PORT, GLCD_CTRL_E); asm volatile ("nop"); asm volatile ("nop"); while(inb(GLCD_DATA_PIN) & GLCD_STATUS_BUSY) { cbi(GLCD_CTRL_PORT, GLCD_CTRL_E); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); sbi(GLCD_CTRL_PORT, GLCD_CTRL_E); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); } cbi(GLCD_CTRL_PORT, GLCD_CTRL_E); cbi(GLCD_CTRL_PORT, GLCD_CTRL_RW); outb(GLCD_DATA_DDR, 0xFF); sei(); #else // sbi(MCUCR, SRW); // enable RAM waitstate // wait until LCD busy bit goes to zero while(*(volatile unsigned char *) (GLCD_CONTROLLER0_CTRL_ADDR + GLCD_CONTROLLER_ADDR_OFFSET*controller) & GLCD_STATUS_BUSY); // cbi(MCUCR, SRW); // disable RAM waitstate #endif }
void glcdBusyWait(u08 controller) { // wait until LCD busy bit goes to zero // select the controller chip glcdControllerSelect(controller); // do a read from control register outb(GLCD_DATA_PORT, 0x00); // no pullups outb(GLCD_DATA_DDR, 0x00); sbi(GLCD_CTRL_PORT, GLCD_CTRL_RW); cbi(GLCD_CTRL_PORT, GLCD_CTRL_RS); sbi(GLCD_CTRL_PORT, GLCD_CTRL_E); NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; while(inb(GLCD_DATA_PIN) & (GLCD_STATUS_BUSY | GLCD_STATUS_RESET)); cbi(GLCD_CTRL_PORT, GLCD_CTRL_E); cbi(GLCD_CTRL_PORT, GLCD_CTRL_RW); outb(GLCD_DATA_DDR, 0xFF); // output }