void lcd_command( uint16_t cmd ) { LCD_PORT_OUT= ( cmd & 0xf0 ); LCD_PORT_OUT|= LCD_ENABLE_BIT; nop( ); LCD_PORT_OUT&= ~LCD_ENABLE_BIT; // LCD_PORT_OUT= ( ( cmd << 4 ) & 0xf0 ); LCD_PORT_OUT|= LCD_ENABLE_BIT; nop( ); LCD_PORT_OUT&= ~LCD_ENABLE_BIT; nop( ); LCD_PORT_OUT= 0; brief_pause( 3000 ); }
int putchar( uint16_t in ) { LCD_PORT_OUT= ( in & 0xf0 ) | LCD_MODE_BIT; LCD_PORT_OUT|= LCD_ENABLE_BIT; nop( ); LCD_PORT_OUT&= ~LCD_ENABLE_BIT; // LCD_PORT_OUT= ( ( in << 4 ) & 0xf0 ) | LCD_MODE_BIT; LCD_PORT_OUT|= LCD_ENABLE_BIT; nop( ); LCD_PORT_OUT&= ~LCD_ENABLE_BIT; nop( ); LCD_PORT_OUT= 0; brief_pause( 200 ); return (0); }
void lcd_init( ) { //lcd LCD_PORT_OUT= 0; LCD_PORT_DIR|= LCD_DATA_MASK | LCD_CMD_MASK; //assume VCC+ > 20ms away //first init LCD_PORT_OUT= 0x30; LCD_PORT_OUT|= LCD_ENABLE_BIT; nop( ); LCD_PORT_OUT&= ~LCD_ENABLE_BIT; //pause should be set by mclk div, > 4.1ms brief_pause( 15000 ); //second init LCD_PORT_OUT|= LCD_ENABLE_BIT; nop( ); LCD_PORT_OUT&= ~LCD_ENABLE_BIT; //pause should be set by mclk div, > 100us brief_pause( 500 ); //four bit mode LCD_PORT_OUT= 0x20; LCD_PORT_OUT|= LCD_ENABLE_BIT; nop( ); LCD_PORT_OUT&= ~LCD_ENABLE_BIT; brief_pause( 1000 ); //from here 'lcd_command can be used //operational mode 5x8 1/16 duty( two lines ) lcd_command( 0x28 ); brief_pause( 1000 ); //display off lcd_command( 0x08 ); brief_pause( 1000 ); //display on, no cursor, no blink... lcd_command( 0x0c ); brief_pause( 1000 ); LCD_PORT_OUT= 0; }
void McuSystem<Speed::SPEED_16MHZ>::delayInUs(uint32_t time) { brief_pause(time << 2); }
void McuSystem<Speed::SPEED_8MHZ>::delayInUs(uint32_t time) { //return imediately for 1/2us delay brief_pause(time << 1); }