u08 glcdDataRead(u08 dummy) { register u08 data; register u08 controller = (GrLcdState.lcdXAddr/GLCD_CONTROLLER_XPIXELS); glcdBusyWait(controller); // wait until LCD not busy outb(GLCD_DATA_PORT, 0x00); // no pullups outb(GLCD_DATA_DDR, 0x00); // don't drive data lines GLCD_CTRL_PORT |= _BV(GLCD_CTRL_RS) | _BV(GLCD_CTRL_RW) | _BV(GLCD_CTRL_E); NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; data = inb(GLCD_DATA_PIN); GLCD_CTRL_PORT &= ~(_BV(GLCD_CTRL_RS) | _BV(GLCD_CTRL_RW) | _BV(GLCD_CTRL_E)); if(!dummy) { // increment our local address counter, not done for dummy reads GrLcdState.ctrlr[controller].xAddr++; GrLcdState.lcdXAddr++; if(GrLcdState.lcdXAddr >= GLCD_XPIXELS) { glcdSetYAddress(GrLcdState.lcdYAddr+1); glcdSetXAddress(0); } } return data; }
void glcdDataWrite(u08 data) { register u08 controller = (GrLcdState.lcdXAddr/GLCD_CONTROLLER_XPIXELS); glcdBusyWait(controller); // wait until LCD not busy outb(GLCD_DATA_DDR, 0xFF); outb(GLCD_DATA_PORT, data); sbi(GLCD_CTRL_PORT, GLCD_CTRL_RS); cbi(GLCD_CTRL_PORT, GLCD_CTRL_RW); sbi(GLCD_CTRL_PORT, GLCD_CTRL_E); NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; cbi(GLCD_CTRL_PORT, GLCD_CTRL_E); // increment our local address counter GrLcdState.ctrlr[controller].xAddr++; GrLcdState.lcdXAddr++; if(GrLcdState.lcdXAddr >= GLCD_XPIXELS) { glcdSetYAddress(GrLcdState.lcdYAddr+1); glcdSetXAddress(0); } }
void glcdDataWrite(uint8_t data) { register uint8_t controller = (GrLcdState.lcdXAddr/GLCD_CONTROLLER_XPIXELS); #ifdef GLCD_PORT_INTERFACE cli(); glcdBusyWait(controller); // wait until LCD not busy sbi(GLCD_CTRL_PORT, GLCD_CTRL_RS); cbi(GLCD_CTRL_PORT, GLCD_CTRL_RW); sbi(GLCD_CTRL_PORT, GLCD_CTRL_E); outb(GLCD_DATA_DDR, 0xFF); outb(GLCD_DATA_PORT, data); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); cbi(GLCD_CTRL_PORT, GLCD_CTRL_E); sei(); #else //sbi(MCUCR, SRW); // enable RAM waitstate glcdBusyWait(controller); // wait until LCD not busy *(volatile unsigned char *) (GLCD_CONTROLLER0_CTRL_ADDR + GLCD_CONTROLLER_ADDR_OFFSET*controller) = data; //cbi(MCUCR, SRW); // disable RAM waitstate #endif // increment our local address counter GrLcdState.ctrlr[controller].xAddr++; GrLcdState.lcdXAddr++; if(GrLcdState.lcdXAddr >= GLCD_XPIXELS) { GrLcdState.lcdYAddr++; glcdSetYAddress(GrLcdState.lcdYAddr); glcdSetXAddress(0); } }
void glcdSetAddress(u08 x, u08 yLine) { // set addresses glcdSetYAddress(yLine); glcdSetXAddress(x); }
void glcdSetAddress(uint8_t x, uint8_t yLine) { // set addresses glcdSetYAddress(yLine); glcdSetXAddress(x); }