/* udcLCD8-8_C.c ATmega328/P on Arduino R3 board */ /* create user defined characters */ #include #define MCU atmega328p #define F_CPU 16000000UL #include /* LCD connections */ /* Redefine if other pins are used */ #define RS_pin PB4 #define RS_DDR DDRB #define RS_PORT PORTB #define EN_pin PB3 #define EN_DDR DDRB #define EN_PORT PORTB #define D7_pin PD2 #define D7_DDR DDRD #define D7_PORT PORTD #define D6_pin PD3 #define D6_DDR DDRD #define D6_PORT PORTD #define D5_pin PD4 #define D5_DDR DDRD #define D5_PORT PORTD #define D4_pin PD5 #define D4_DDR DDRD #define D4_PORT PORTD void _delay_ms (double); void lcd_init( void ); void lcd_put_byte( char ); int main(void) { _delay_ms( 2000 ); lcd_init(); /* Pixel definitions of up to 8 user defined characters */ RS_PORT &= ~( 1 << RS_pin ); // LCD in command-mode lcd_put_byte(0b01000000); // Move Cursor into CGRAM RS_PORT |= ( 1 << RS_pin ); // LCD in character/data-mode // Pixel definition of user defined Character 0 // end of string charcter \0 is now used, overrides normal C string format lcd_put_byte(0b00100); // . . * . . lcd_put_byte(0b00000); // . . . . . lcd_put_byte(0b01110); // . * * * . lcd_put_byte(0b00001); // . . . . * lcd_put_byte(0b01111); // . * * * * lcd_put_byte(0b10001); // * . . . * lcd_put_byte(0b01110); // . * * * . lcd_put_byte(0b00000); // . . . . . // Pixel definition of user defined Character 1 lcd_put_byte(0b01010); // . * . * . lcd_put_byte(0b00000); // . . . . . lcd_put_byte(0b01110); // . * * * . lcd_put_byte(0b00001); // . . . . * lcd_put_byte(0b01111); // . * * * * lcd_put_byte(0b10001); // * . . . * lcd_put_byte(0b01110); // . * * * . lcd_put_byte(0b00000); // . . . . . // Pixel definitions of Character 2 ... 7 may follow here RS_PORT &= ~( 1 << RS_pin ); // LCD in command-mode lcd_put_byte(0b10000000); // DDRAM adress /* End of Pixel definitions */ RS_PORT |= ( 1 << RS_pin ); // LCD in character-mode // display the first 8 chars "Hall* v*" lcd_put_byte('H'); lcd_put_byte('a'); lcd_put_byte('l'); lcd_put_byte('l'); lcd_put_byte( 0 ); // user defined Character 0 lcd_put_byte(' '); lcd_put_byte('v'); lcd_put_byte( 1 ); // user defined Character 1 // reposition to "line 2" (the next 8 chars) RS_PORT &= ~( 1 << RS_pin ); // LCD in command-mode lcd_put_byte( 0b11000000 ); RS_PORT |= ( 1 << RS_pin ); // LCD in character-mode // display the last 6 chars "rlden!" lcd_put_byte('r'); lcd_put_byte('l'); lcd_put_byte('d'); lcd_put_byte('e'); lcd_put_byte('n'); lcd_put_byte('!'); while(1); } /* *********************************** */ /* FUNCTIONS */ /* *********************************** */ void lcd_init( void ) // must be run once before using the display { RS_DDR |= ( 1 << RS_pin ); // "1" RS-pin direction is output (Register Select) EN_DDR |= ( 1 << EN_pin ); // "1" EN-pin direction is output (Enable) EN_PORT &= ~( 1 << EN_pin ); // EN = "0" LCD now disabled D7_DDR |= ( 1 << D7_pin ); // "1" D7-pin direction is output D6_DDR |= ( 1 << D6_pin ); // "1" D6-pin direction is output D5_DDR |= ( 1 << D5_pin ); // "1" D5-pin direction is output D4_DDR |= ( 1 << D4_pin ); // "1" D4-pin direction is output _delay_ms(50); // give LCD time to settle RS_PORT &= ~( 1 << RS_pin ); // RS = "0" LCD now in command-mode lcd_put_byte(0b00110011); /* LCD starts in 8 bit mode 0011---- */ lcd_put_byte(0b00110010); /* 0011 change to 4 bit mode */ lcd_put_byte(0b00101000); /* two line (8+8 chars in the row) */ lcd_put_byte(0b00001100); /* display on, cursor off, blink off */ lcd_put_byte(0b00000001); /* display clear */ lcd_put_byte(0b00000110); /* increment mode, shift off */ RS_PORT |= ( 1 << RS_pin ); // RS = "1" LCD now in character-mode // initialization is done! } void lcd_put_byte( char data ) { // must set the LCD-mode before calling this function! // RS_PORT |= ( 1 << RS_pin ); // LCD in character-mode // RS_PORT &= ~( 1 << RS_pin ); // LCD in command-mode // upper Nibble if( ( data & ( 1 << 7 ))==0 ) D7_PORT &= ~( 1 << D7_pin ); /* "0" */ else D7_PORT |= ( 1 << D7_pin ); /* "1" */ if( ( data & ( 1 << 6 ))==0 ) D6_PORT &= ~( 1 << D6_pin ); /* "0" */ else D6_PORT |= ( 1 << D6_pin ); /* "1" */ if( ( data & ( 1 << 5 ))==0 ) D5_PORT &= ~( 1 << D5_pin ); /* "0" */ else D5_PORT |= ( 1 << D5_pin ); /* "1" */ if( ( data & ( 1 << 4 ))==0 ) D4_PORT &= ~( 1 << D4_pin ); /* "0" */ else D4_PORT |= ( 1 << D4_pin ); /* "1" */ EN_PORT &= ~( 1 << EN_pin ); // EN = "0" _delay_ms(1); EN_PORT |= ( 1 << EN_pin ); // EN = "1" _delay_ms(5); // lower Nibble if( ( data & ( 1 << 3 ))==0 ) D7_PORT &= ~( 1 << D7_pin ); /* "0" */ else D7_PORT |= ( 1 << D7_pin ); /* "1" */ if( ( data & ( 1 << 2 ))==0 ) D6_PORT &= ~( 1 << D6_pin ); /* "0" */ else D6_PORT |= ( 1 << D6_pin ); /* "1" */ if( ( data & ( 1 << 1 ))==0 ) D5_PORT &= ~( 1 << D5_pin ); /* "0" */ else D5_PORT |= ( 1 << D5_pin ); /* "1" */ if( ( data & ( 1 << 0 ))==0 ) D4_PORT &= ~( 1 << D4_pin ); /* "0" */ else D4_PORT |= ( 1 << D4_pin ); /* "1" */ EN_PORT &= ~( 1 << EN_pin ); // EN = "0" _delay_ms(1); EN_PORT |= ( 1 << EN_pin ); // EN = "1" _delay_ms(5); } /* *********************************** */ /* HARDWARE */ /* *********************************** */ /* Chip ATMega328 Arduino Uno R3 stackable header _______ Digital: _____/ \__ Analog: ______________ ______________ txd ->-|D00 >RXD A5|- | \/ | rxd -<-|D01 -(D01)-|03 PD1/TXD PC3 26|-(A3)- D5 -<-|D04 A1|- D7 -<-(D02)-|04 PD2/INT0 PC2 25|-(A2)- D4 -<-|D05~ A0|- D6 -<-(D03)-|05 PD3/INT1/PWM PC1 24|-(A1)- -|D06~ | Power: D5 -<-(D04)-|06 PD4 PC0 23|-(A0)- -|D07 Vin|- +5V ---|07 VCC GND 22|--- Gnd | GND|--- GND Gnd ---|08 GND AREF 21|--- Vin -|D08 GND|- Xtal |X|--|09 PB6/OSC1 AVCC 20|--- +5V -|D09~ +5V|--- +5V 16MHz |X|--|10 PB7/OSC2 SCK/PB5 19|-(D13)- -|D10~ +3.3V|- D4 -<-(D05)-|11 PD5/PWM MISO/PB4 18|-(D12)->- RS EN -<-|D11~ Res|- -(D06)-|12 PD6/PWM PWM/MOSI/PB3 17|-(D11)->- EN RS -<-|D12 IOREF|- -(D07)-|13 PD7 PWM/SS'/PB2 16|-(D10)- -|D13 LED --- | -(D08)-|14 PB0 PWM/PB1 15|-(D09)- -|GND | |______________________________| -|AREF | -|SCL | -|SDA | |________________| */ /* LCD one line length 8+8 characters Internal ic: HD44780A00 _______________ | | | Vss 1|--- GND | Vdd 2|--- +5V | Contrast 3|-<- Pot | RS 4|-<- PB4 | RD/!WR 5|--- 0, GND | EN 6|-<- PB3 | D0 7| | D1 8| | D2 9| | D3 10| | D4 11|-<- PD5 | D5 12|-<- PD4 | D6 13|-<- PD3 | D7 14|-<- PD2 | Back + 15|--- 220 Ohm +5V (if backlight) | Light Gnd 16|--- GND |_______________| */