text: NEW: Learning electronics? Ask your questions on the new Electronics Questions & Answers site hosted by CircuitLab.
  Project Help and Ideas » 4x40 LCD
  Did you ever need more room on your LCD display than the 4x20 provided with the NerdKit? Well I'll admit, I didn't really NEED more room, I just thought the idea would be nice. So when I came across a 4x40 LCD for under $3.00 US, I couldn't pass it up. The other good part of this display is that it's chipset is compatable with the HD44780 in the NerdKit LCD.
  Once I got my display, I had to solder in a 16 pin (2x8) Header connector so I could wire it up. That done, I simply made up a cable and was ready to start testing it out.
  Here is a breakdown of the pinout of this LCD Vs the Standard NerdKit LCD.
  As you can see, the pin callouts are very similar, there are a couple of differences though.
  1st Question, Why 2 enable lines? Because this display has two full chipsets to control all the screen positions. According to the datasheet for the HD44780, it has character ram for 80 characters. On the NK LCD, this is 4X20=80. This display however has 160 available characters so it needs 2 chipsets. To control them independantly, there is an enable for each chipset to designate whether you are writing to the upper half of the display or the lower half.
  To make the display work, I made a new library completely based on the NK original lcd.c library. I called the new library lcd_4x40.c
  Here is a photo of the LCD displaying our familiar initial load. (The offset is on purpose )
  To use this library, you will have to make a couple of changes. 1st you will have to change your makefile so it creates an object file for the library and includes it at compile time.
  Here is the makefile I12
  LINKOBJECTS=../libnerdkits/delay.o ../libnerdkits/lcd_4x40.o ../libnerdkits/uart.o
  all: initialload.hex
  initialload.hex: initialload.c
  make -C ../libnerdkits
  avr-gcc ${GCCFLAGS} -o ../libnerdkits/lcd_4x40.o -c ../libnerdkits/lcd_4x40.c
  program: initialload.hex
  avrdude ${AVRDUDEFLAGS} -U flash:w:initialload.hex:a
  clean:
  rm -f *.o
  rm -f *.hex
  rm -f ../libnerdkits/*.o
  Here is the library:
  // lcd_4x40.c
  // by Rick Shear
  // based on
  // lcd.c
  // for NerdKits
  // mrobbins@mit.edu
  //
  // PIN DEFINITIONS:
  //
  //
  // PD2-5 -- LCD DB4-7 (pins 11-14) (was PB3-6)
  // PD6 -- LCD E1 (pin 6) (was PA5)
  // PD7 -- LCD RS (pin 4) (was PA4)
  // PB1 -- LCD E2 (pin 15)
  #include <avr/io.h>
  #include <avr/pgmspace.h>
  #include <inttypes.h>
  #include <stdio.h>
  #include "lcd_4x40.h"
  #include "delay.h"
  // define a couple of global variables for the enable lines
  uint8_t E1 = 0;
  uint8_t E2 = 0;
  // lcd_set_type_data()
  void lcd_set_type_data() {
  PORTD |= (1<<PD7);
  }
  // lcd_set_type_command()
  void lcd_set_type_command() {
  PORTD &= ~(1<<PD7);
  }
  // lcd_write_nibble(...)
  void lcd_write_nibble(char c) {
  // NOTE: only 2 or 3 work in the delays here.
  // set data
  PORTD &= ~(0x0f << 2);
  PORTD |= (c&0x0f) << 2;
  // Toggle E1 if in 1st two rows
  if(E1){PORTD |= (1<<PD6); delay_us(1); PORTD &= ~(1<<PD6); delay_us(1);}
  // Toggle E2 if in 2nd two rows
  if(E2){PORTB |= (1<<PB1); delay_us(1); PORTB &= ~(1<<PB1); delay_us(1);}
  }
  void lcd_write_byte(char c) {
  lcd_write_nibble( (c >> 4) & 0x0f );
  lcd_write_nibble( c & 0x0f );
  delay_us(80);
  }
  void lcd_clear_and_home() {
  // Perform clear and home on both chipsets.
  E1=1;
  E2=1;
  lcd_set_type_command();
  lcd_write_byte(0x01);
  delay_ms(50);
  lcd_write_byte(0x02);
  delay_ms(50);
  // Cursor is at home position of both Chipsets, disable #2 so top set works unless otherwise
  // directed elswhere.
  E2 = 0;
  }
  void lcd_home() {
  // Perform clear and home on both chipsets.
  E1=1;
  E2=1;
  lcd_set_type_command();
  lcd_write_byte(0x02);
  delay_ms(50);
  // Cursor is at home position of both Chipsets, disable #2 so top set works unless otherwise
  // directed elswhere.
  E2 = 0;
  }
  void lcd_write_data(char c) {
  lcd_set_type_data();
  lcd_write_byte(c);
  }
  // lcd_write_int16
  void lcd_write_int16(int16_t in) {
  uint8_t started = 0;
  uint16_t pow = 10000;
  if(in < 0) {
  lcd_write_data('-');
  in = -in;
  }
  while(pow >= 1) {
  if(in / pow > 0 || started || pow==1) {
  lcd_write_data((uint8_t) (in/pow) + '0');
  started = 1;
  in = in % pow;
  }
  pow = pow / 10;
  }
  }
  // lcd_write_int16_centi
  // assumes that its measured in centi-whatevers
  void lcd_write_int16_centi(int16_t in) {
  uint8_t started = 0;
  uint16_t pow = 10000;
  if(in < 0) {
  lcd_write_data('-');
  in = -in;
  }
  while(pow >= 1) {
  if(in / pow > 0 || started || pow==1) {
  lcd_write_data((uint8_t) (in/pow) + '0');
  started = 1;
  in = in % pow;
  }
  if(pow == 100) {
  if(!started) {
  lcd_write_data('0');
  }
  lcd_write_data('.');
  started = 1;
  }
  pow = pow / 10;
  }
  }
  void lcd_write_string(const char *x) {
  // assumes x is in program memory
  while(pgm_read_byte(x) != 0x00)
  lcd_write_data(pgm_read_byte(x++));
  }
  void lcd_goto_position(uint8_t row, uint8_t col) {
  lcd_set_type_command();
  // 20x4 LCD: offsets 0, 0x40, 20, 0x40+20
  uint8_t row_offset = 0;
  switch(row) {
  case 0: row_offset = 0; E1=1; E2=0; break;
  case 1: row_offset = 0x40; E1=1; E2=0; break;
  case 2: row_offset = 0; E1=0; E2=1; break;
  case 3: row_offset = 0x40; E1=0; E2=1;); }
  // lcd_init()
  void lcd_init() {
  // set pin driver directions
  // (output on PD7,PD6, and PD3-6)
  DDRD |= 0xfc;
  DDRB |= (1<<PB1);
  // initialize both chipsets
  E1=1;
  E2=1;
  // wait 100msec
  delay_ms(100);
  lcd_set_type_command();
  // do reset
  lcd_write_nibble(0x03);
  delay_ms(6);
  lcd_write_nibble(0x03);
  delay_us(250);
  lcd_write_nibble(0x03);
  delay_us(250);
  // write 0010 (data length 4 bits)
  lcd_write_nibble(0x02);
  // set to 2 lines, font 5x8
  lcd_write_byte(0x28);
  // disable LCD
  //lcd_write_byte(0x08);
  // enable LCD
  lcd_write_byte(0x0c);
  // clear display
  lcd_write_byte(0x01);
  delay_ms(5);
  // enable LCD
  lcd_write_byte(0x0c);
  // set entry mode
  lcd_write_byte(0x06);
  // set cursor/display shift
  lcd_write_byte(0x14);
  // clear and home
  lcd_clear_and_home();
  }
  int lcd_putchar(char c, FILE *stream) {
  lcd_write_data(c);
  return 0;
  }
  For the .h file, simply copy the original NerdKit lcd.h file into a new file called lcd_4x40.h as no changes were necessary from the original.
  Here is a modified initialload.c that I used to test the display and some positioning.
  //_4x40.h"
  // PIN DEFINITIONS:
  //
  // PC4 -- LED anode
  int main() {
  uint8_t i=0;
  // fire up the LCD
  lcd_init();
  lcd_home();
  // print message to screen
  // 20 columns wide:
  // 01234567890123456789
  while(1){
  lcd_write_string(PSTR(" Congratulations! "));
  lcd_goto_position(1,7);
  lcd_write_string(PSTR("********************"));
  lcd_goto_position(2,14);
  lcd_write_string(PSTR(" Your USB NerdKit "));
  lcd_goto_position(3,20);
  lcd_write_string(PSTR(" is alive! "));
  delay_ms(2000);
  lcd_home();
  lcd_write_string(PSTR("Overwriting text from home position..."));
  delay_ms(2000);
  lcd_goto_position(2,5);
  lcd_write_string(PSTR("Printing text Row 3 Column 6"));
  delay_ms(2000);
  for(i=10;i>0;i--){
  lcd_goto_position(1,10);
  lcd_write_string(PSTR("Clearing Screen in "));
  lcd_goto_position(1,29);
  lcd_write_int16(i);
  delay_ms(999);
  }
  lcd_clear_and_home();
  delay_ms(1000);
  }
  return 0;
  }
  If you are interested in the display, I found them at a company called Prime Electronics Here is a link to them
  Happy Programming
  Rick
  One other note, if you do get one of these displays, let me know if you find any bugs.
  I forgot one detail, be careful when wiring the connector. If you do install a header connector like I did (from the back side) the pin order is opposite what would be standard.
  On a standard header the pins would be numbered like this:
  1 2
  3 4
  5 6
  7 8
  9 10
  11 12
  13 14
  15 16
  Since this is wired from the back side they are reversed like this:
  2 1
  4 3
  6 5
  8 7
  10 9
  12 11
  14 13
  16 15
  If you are used to standard header layouts, it's easy to get your mind turned around.
  I was just thinking as I was looking at the display on my desk. If anyone is interested, I could take the post from above and put it in the library so it doesn't get lost in the forum.
  If no-one responds, I'll take it that no-one is interested and leave it alone.
  Yeah Rick, I got four of the 4x40 LCD after you made your post.
  Please put this in the Nerdkits Community Library
  I do not know when I will ever get around to having the time to set them up but I sure like the 4x40 concept.
  Ralph
  Library article added HERE.
  Hey Rick, what will I have to do to use your I2C LCD backpack?
  I was thinking maybe I could use one of the unused pins for E2.
  But that is just off the top of my head without looking into it yet.
  I should have my 4x40 LCD running today.
  Electrically, you could probably tie into one of the unused outputs on the expander for E2. The library would also need modified to support the display similarly to how I did the standard library.
  Now in looking at your library I am really getting dangerous and wondering why there is a E1 and E2.
  Well I understand why there are two enables as you explain but they are doing the same functions in the code.
  There are a couple of places you turn E2 off but I haven't figured the exact reason why.
  So I am "thinking" about just using the E1 pin and splitting it to pin 9 and 15 on the 4x40 header.
  They would both be enabled at the same time what is the problem with that?
  Besides it is not conventional.
  If you re-read my first post in this thread, you'll see why there are two enable lines. The display is essentially two displays in one with the top two lines controlled by one controller and the bottom two lines controlled by another. The data lines for the two controllers are tied together and they are individually controlled by the separate enable lines. If you tie the enable lines together, the top two lines and the bottom two lines will display the same data.
  That would be "if you re-re-re-re-read my first post in this thread".
  It will all eventually sink in, oh well back to the unused pin idea which is to bad because then I'd actually have to do some programming.
  :D I have to re-re-re-re-read things often myself... takes a few times to fully sink in sometimes. If you usea an unused output on the expander, you'll have plenty of programming to do :)
  Yeah, and I am not a programmer but I play one on TV.
  Ok I am "trying" to do it your way.
  I have everything explicitly wired as you directed but my LCD does not light up.
  No blackbars no nothing.
  I compiled your initialload program and made a .hex so I guess it compiled but the make output was different than I expected.
  miniMac:4x40lcd Me$ make
  make -C ../libnerdkits
  make[1]: Nothing to be done for `all'.
  avr-gcc -g -Os -Wall -mmcu=atmega328p -o ../libnerdkits/lcd_4x40.o -c ../libnerdkits/lcd_4x40.c
  avr-gcc -g -Os -Wall -mmcu=atmega328p -Wl,-u,vfprintf -lprintf_flt -Wl,-u,vfscanf -lscanf_flt -lm -o initialload.o initialload.c ../libnerdkits/delay.o ../libnerdkits/lcd_4x40.o ../libnerdkits/uart.o
  avr-objcopy -j .text -O ihex initialload.o initialload.hex
  miniMac:4x40lcd Me$
  Of course your Makefile syntax is different than the standard Nerdkit Makefile so I am not surprised the make output is different.
  So why wouldn't the LCD light up?
  Ralph,
  I just e-mailed you my hex that worked on my display...
  Thanks, still trying to figure out why the LCD does not work. I would assume there ought to be black bars.
  There is no backlight I can not use that as a working indicator.
  Speaking of backlight the are A and K connection points.
  Sorry Ralph, I don't understand what you are asking. If you are asking about the A & K on the back of the display board, I think the board was designed to have a backlight but the version we have does not have one. Maybe double check your wiring, remember, header connectors like that have the odds on one side and evens on the other, they aren't like ic's they go:
  Also the pattern may be reversed depending on which side of the board you are on.
  I am asking why the LCD is blank, no black bars in programing mode.
  The backlight A K is just a curiosity.
  I haven't connected mine in a while so I can't validate, but I believe if everything is connected correctly and if the right contrast resistor is used, it should behave just like the NK display. If you ignore the 2nd enable and just wire it like the NK display, the 1st two lines should work with thier(NK Guys) library except lines 2 & 4 will be at the end of lines 1 & 2. I'm sure you've re-checked the wiring, next maybe you verify the power and contrast to make sure it's good. If I have time tomorrow I'll dig out my display and connect it and get you some close up photo's. How did you connect to the display? Did you modify a ribbon cable or solder directly into the display board? Do you have a photo?
  I soldered on a header and have jumper wires.
  My voltage regulator is really heating up and I only see 2+ volts across the rails so it acts like there is a short.
  I only have VDD (pin 13) and GND (pins 14 + 16) no other wiring.
  Weird... does sound like a short somewhere. Maybe time to get the magnifier out and check for solder bridges. Hopefully you didn't get a bum display.
  I did plug in my display this morning (power and ground in appropriate places and the contrast resistor installed) and confirmed it does display the two black bars,
  Rick, where did you get the pinout from?
  AVRfreaks and most of the Arduino code I have seen
  Pin no. Symbol Function
  1 DB7 Data bus line
  2 DB6 Data bus line
  3 DB5 Data bus line
  4 DB4 Data bus line
  5 DB3 Data bus line
  6 DB2 Data bus line
  7 DB1 Data bus line
  8 DB0 Data bus line
  9 E1 Enable 1
  10 R/W Data read / write
  11 RS Register select signal
  12 Vo Contrast Adjust
  13 Vss Power supply(GND)
  14 Vdd Power supply(+)
  15 E2 Enable 2
  16 Vee Negative voltage
  17 A Power supply for LED B/L (+)
  18 K Power supply for LED B/L (- )
  They list 4x40 Pin 13 as GND and Pin 14 as Vdd
  You show just the opposite.
  I just got back to playing with this.
  Ralph
  Yup, that did it!!
  It's working with 4x40 Pin 14 Vdd(+) Pin 13 Gnd(-).
  Now to test your library!!
  Your initialload.c program works great!!
  I could not load your .hex and could not load the .hex I compiled so I just used the Makefile from the Nerdkit's initialload program and the program compiled and loaded fine.
  Now to get my Graphic LCD working and then I like to do a touch screen but I probable will need a different mcu than the 328 or 168.
  Thanks, I really appreciate your great projects.
  Good catch Ralph, Sorry for that. I'll fix that on my blog right away. If you have any problems with the display because of this let me know...
  I've updated the library post here with the proper pinout chart. Thanks again Ralph. I'm also deleting the image that is incorrect so the pinout chart above in this thread will be missing.
  Now this is strange, I tried modifying your 4x40 initialload but only lines 1 and 2 displays text!
  So I went back to your original code and still only got lines 1 and 2.
  Then I noticed the MakeFile was for an atmega328p but the initialload.c program is for a ATmega168, there is no
  #include "../libnerdkits/io_328p.h"
  which isn't strictly required for 328 code to run as long as you do not make any calls for io_328p.h components.
  Any way I set everything up for a 168 and only get two rows of faint black boxes with the box in position 1, on line 1 and 3, blinking.
  For the 328 I get text in line 1 and two with black boxes on line three, not sure if the position one box is blinking, I do not believe it is.
  So once agin something strange is happening that I can not restore the original program.
  I hate all of the wires so I made up the ribbon cable.
  I forgot how easy it is to break the IDC (insulation displacement connector) if you do not have the proper tools so I ordered IDC compression tool off ebay and still managed to break a couple of connectors before figured out how to use it (two steps don't use compressor for final piece).
  I "believe" the wiring is correct as it did work once.
  Check the 2nd enable line. If it isn't connected properly, the lower half won't initialize. You are using the 4x40 library right?? As for the io_328p.h stuff, I added those definitions to the main libraries a long time ago, so I don't always think of using that include.
  Now this is interesting.
  I connected my scope to E1 and definitely can see when E1 is enabled but when looking at E2 I do not see the enable!
  Wish I knew how to take a picture with my scope also it would be nice to get the PC interface working.
  Darn now the enable on E2 is showing up on my scope so the E2 enable is firing.
  I switched LCD's to make sure I didn't have a bad LCD, both show the same result.
  Well now line three is flickering and showing:
  fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
  33333333333333333333333333333333333333
  box box box box box box box box box box box box
  and line four will occasionally have characters.
  I don't know what is causing that, maybe an intermittant connection??
  You're trying to just run with the unmodified library right?
  "unmodified library"??
  This is with your lcd_4x40.c library from above with the renamed NerdKit lcd.h.
  That's all I was using. I don't know why it isn't working there?? This may be another of your mysteries.
  Seriously though, maybe there is an intermittant connection somewhere. Have you tried it without the ZIF socket just plugging the micro into your board? I know you are a big proponent of the disassemble/re-assemble so I'm sure you've tried that. I'm at a loss and just grasping at straws.
  Sorry I can't help more, I'd really like to see it going again.
  Rick
  Darn, I got it working using your initialload.hex that you sent me!!
  I loaded it using AVRStudio on my Windows 7 machine and it runs correctly!!
  Now I'll need to figure out how to use your MakeFile on my Mac or figure out how to use my MakeFile, geesch my beard hair has really turned white since I started learning microprocessor programming.
  Reading another thread made me think. Did you change the compiler optimizations in the make file? The Macs have been having issues unless you change the -Os to -O0 (Dash Letter O number Zero) to turn off optimizations. If you haven't done that, give it a shot. That might fix the erratic behavior.
  Ok, I have not done any programming for the past 6 months so I m not thinking as a programmer.
  My problem was I am not including your lcd_4x40.c Library!!
  You say:
  For the .h file, simply copy the original NerdKit lcd.h file into a new file called lcd_4x40.h as no changes were necessary from the original.
  Which I did, but how is your Library included?
  I cannot call it lcd_4x40.h if the Nerdkit lcd.h file wants to be included as lcd_4x40.h.
  Of course I could give it any name but I was not thinking as a programmer so that fact escaped me :-)
  I have never had a problem with the compiler optimizations.
  lcd_4x40.c is compiled into an object file and linked in the makefile. That is how the same header file can call functions in a different 'c' file. As for the optimizations, it was just a thought seeing how many people seem to have issue with them. I haven't really done any programming on my mac mini... Actually haven't even turned it on in a couple of months so I don't know if the optimizations would effect me or not.
  lcd_4x40.c is compiled into an object file and linked in the makefile
  lcd_4x40.c is compiled into an object file and linked in the makefile
  Strange the compiler didn't complain about not finding lcd_4x40.o.
  Of course I wasn't thinking as a progrmmer (I have been doing my brick path for the past six months) so I need to be reminded to actually compile lcd_4x40.c into an object file.
  So once agin thank you for your great projects and exceptional help.
  It probably wouldn't complain because with the standard NK makefile, lcd.c is linked and it has the same function names. So the program was satisfied. Using lcd.c though would give you only the top two lines being functional. The first half of line 1 being line 1, the second half being line 3. The first half of line 2 would be line 2 and the second half line 4. That would explain the "gibberish" you were seeing.
  How's the brick path coming?
  Yeah, that probable explains it, ha. Oh well I consider myself to be a second year student in a electronics/microprocessor class so it is not surprising.
  The brick path is reaaally unbelievable. People say it has a lot of character, it certainly isn't your typical brick path installed by a professional that knoew what they were doing. But I love it and being outdoors at lest 4 hours a day is so good for me. I spent the last 20 years sitting at my desk for 12 to 2o hours a day and sometimes more acting like I was a network administrator/webmaster.
  I haven't updated the website lately I have laid most of the brick path and have one lamp post working plus I have been doing a lot of restoring the landscaping that got torn up in the excvation work.
  And for those of you wondering wht the heck a brick path has to do with Nerdkits, well I do need a light controller for the path lights that will be controlled by a Nerdkit mcu :-).
  Lamp Post Controller.
  You have some beautiful property there Ralph. Someday I'd like to move to a coastal area and get out of the middle here where I am. I'm figuring further south than you are. I'm hopeful that if all goes as planned, by the time I get around to retirement age, I'll have my home paid off and be able to sell and buy outright with little to no mortgage for my silver years. That's the goal anyway.
  Rick I am trying to compile your lcd_4x40.c, yes I changed the name.
  The pin defines are not being found.
  4x40LCD.c: In function 'lcd_set_type_data':
  4x40LCD.c:31: error: 'PD7' undeclared (first use in this function)
  4x40LCD.c:31: error: (Each undeclared identifier is reported only once
  4x40LCD.c:31: error: for each function it appears in.)
  4x40LCD.c: In function 'lcd_set_type_command':
  4x40LCD.c:36: error: 'PD7' undeclared (first use in this function)
  4x40LCD.c: In function 'lcd_write_nibble':
  4x40LCD.c:49: error: 'PD6' undeclared (first use in this function)
  4x40LCD.c:51: error: 'PB1' undeclared (first use in this function)
  4x40LCD.c: In function 'lcd_init':
  4x40LCD.c:178: error: 'PB1' undeclared (first use in this function)
  make.exe: *** [4x40LCD.hex] Error 1
  I am using Programmers NotePad in Window 7 (as long as it doesn't crash, geesch Windows 7 is worse that XP for getting "BSD" (Blue Screen ofDeath).
  I have not used Windows 7 for development enviroment for a long time so I do not know if there is something I hven't done after the last Windows 7 rebuild.
  I modified my pin definition files in the avr-gcc install to include the missing definitions. If you haven't done that, you'll need to include the io_328p.h you mentioned earlier. That should fix the undefined pin callouts.
  Rick said:
  If you haven't done that,
  If you haven't done that,
  (That's a quote in case you haven't read the stupid Markdown manual)
  And why would I want to do that??
  Just to not have to:
  Darn making the object file is not that straight forward.
  I've done it in the past just using a Nerdkit MakeFile but I think I need your MakeFile or your lcd_4x40.o file.
  Here are my latest errors:
  ../libnerdkits/lcd.o: In function `lcd_set_type_data':
  D:\Nerdkits\Code\libnerdkits/lcd.c:22: multiple definition of `lcd_set_type_data'
  C:\Users\Ralphxyz\AppData\Local\Temp/ccUGYt0g.o:D:\Nerdkits\Code\LCD4x40/4x40LCD.c:32: first defined here
  ../libnerdkits/lcd.o: In function `lcd_set_type_command':
  D:\Nerdkits\Code\libnerdkits/lcd.c:27: multiple definition of `lcd_set_type_command'
  C:\Users\Ralphxyz\AppData\Local\Temp/ccUGYt0g.o:D:\Nerdkits\Code\LCD4x40/4x40LCD.c:37: first defined here
  etc. etc.
  D:\Nerdkits\Code\libnerdkits/lcd.c:27: multiple definition of `lcd_clear_and_home'
  C:\Users\Ralphxyz\AppData\Local\Temp/ccUGYt0g.o:D:\Nerdkits\Code\LCD4x40/4x40LCD.c:63: first defined here
  ../libnerdkits/lcd.o: In function `lcd_init':
  D:\Nerdkits\Code\libnerdkits/lcd.c:160: multiple definition of `lcd_init'
  C:\Users\Ralphxyz\AppData\Local\Temp/ccUGYt0g.o:D:\Nerdkits\Code\LCD4x40/4x40LCD.c:178: first defined here
  c:/winavr-20090313/bin/../lib/gcc/avr/4.3.2/../../../../avr/lib/avr5/crtm328p.o:(.init9+0x0): undefined reference to `main'
  make.exe: *** [4x40LCD.hex] Error 1
  Of course I do not believe I have ever seen a step by step instruction on making a .o file so I am winging it and you know the trouble that means.
  Did you get these errors with my makefile? I had the program file with the makfile in their own folder. lcd_4x40.c and lcd_4x40.h in libnerdkits.
  The line in the makefile that creates the object file is:
  avr-gcc ${GCCFLAGS} -o ../libnerdkits/lcd_4x40.o -c ../libnerdkits/lcd_4x40.c
  You should be able to type that in the command line(substituting the value for GCCFLAGS) to manually creat the .o file.
  All right I'll try with your MakeFile that would make sense.
  See I can do it, I have the lcd_4x40.o and a new lcd_4x40.hex using your MakeFile!!
  Now to get into trouble making changes to your initialload.c.
  I have a muti-sensor ground temperature project in mind that I'll use the 4x40 LCD for. At $3.00 apiece I will not mind dedicating a LCD to a project.
  Thanks again for your projects and your faithful help.
  No problem Ralph, glad it all worked out. My latest thing is playing with tube guitar amps. Kinda fun playing with 500 - 600VAC transformers. :D
  Kinda fun playing with 500 - 600VAC transformers.
  Kinda fun playing with 500 - 600VAC transformers.
  Is that where you always keep your other hand in your pocket?
  Now, are you learning to play the guitar and learning how to build a tube amplifier at the same time?
  I am able to change your initialload.c program and compile the changes, this is great.
  Haven't started formal lessons yet, but am having fun building amps. I finished my 1st amp head using an old fender schematic with different tubes. As for the hand in the pocket, I don't do that but I do have a very real respect for the high voltage.
  Glad to hear the compiling is going smoothly now.
  I had a electrician (the crew boss) get across a couple of hundred volt 3 phase, he sure wished he had kept his other hand in his pocket.
  That's the first thing I was taught working on high voltage, of course that was power busses that I was learning on.
  Yeah, at work with the 440V 3 Phase electrical cabinets for the machines, I always keep one hand behind my back. It's important also to overcome the natural tendancy to touch what you are pointing at when discussing something in the cabinet as well.
  Don't worry though, I plan to be around for a while to keep pestering you guys
  Hi Rick,
  Thanks for fixing up the library to handle the 40x4 display. I purchased a couple of these 40x4 and the 40x2's. The 40x2's connect like the LCD that came with the kit. The 40x4's, on the other hand, needed to be toned out while looking at your chart and the KS0066 PDF file.
  I also had issues with E2 not firing correctly...odd. I ended up swapping E1 & E2 at the LCD and the bottom half worked. Then I swapped them back and I was in business.
  Pin - function
  1 - Ground (Vss)
  2 - +5 (Vcc)
  3 - LCD Contrast (Vee)
  4 - RS
  5 - R/W
  6 - E1
  7 - E2
  8 - DB0
  9 - DB1
  10 - DB2
  11 - DB3
  12 - DB4
  13 - DB5
  14 - DB6
  15 - DB7
  16 - Unused?
  Pins 1 thru 6 are compatible with the NerdKit, E2 causes the data lines to be shifted over one to make them odd for wiring. But, who cares....I got 40x4 now...WooHoo!!!
  Thanks again to you and the rest of the gang.
  Kevin
  No problem, glad it worked out for you. It's good to know it works with a different diplay. Does that display have a backlight?
  The 40x4 doesn't have a back light, the 40x2 does though.
  The 40x4 I got didn't have backlight either. I was just curious whether the one you got did since it didn't say in the listing.
  Please log in to post a reply.