LCD.print vs LCD.write

Can someone explain the differences here? The docs don't really say, except that lcd.print allows you to specify the number base used. Since you don't have to specify the base, is there a point to ever using LCD.write?

The LCD class derives from the Print class. The Print class has both print and write methods. The print methods convert all the input values to strings for "printing". The write methods do not.

When "printing" to the serial port, the difference is significant.

"write" to the LCD doesn't appear to make sense, since it can only display text. But, there are LCDs that take commands to trigger blinking and stuff like that. The command is a byte or two in length. In those cases, the write method is appropriate.

For making text appear on the LCD, the write method is (typically) not.

lcd.print calls lcd.write to output a single character. A certain amount of overhead is avoided by calling lcd.write directly, but this is small compared to the time for the LCD to handle the character. I would stick with lcd.print.

I use write() when I need to send a sequence that contains custom characters. If you've defined zero as one of your custom characters then you can't use print() to show it because zero is the string terminator in C/C++.

      lcd.clear();
      
      //======define charset
      uint8_t bell[8] = {0x4,0xe,0xe,0xe,0x1f,0x0,0x4};
      uint8_t note[8] = {0x2,0x3,0x2,0xe,0x1e,0xc,0x0};
      uint8_t clock[8] = {0x0,0xe,0x15,0x17,0x11,0xe,0x0};
      uint8_t heart[8] = {0x0,0xa,0x1f,0x1f,0xe,0x4,0x0};
      uint8_t duck[8] = {0x0,0xc,0x1d,0xf,0xf,0x6,0x0};
      uint8_t check[8] = {0x0,0x1,0x3,0x16,0x1c,0x8,0x0};
      uint8_t cross[8] = {0x0,0x1b,0xe,0x4,0xe,0x1b,0x0};
      uint8_t retarrow[8] = { 0x1,0x1,0x5,0x9,0x1f,0x8,0x4};
      
      
      lcd.createChar(0, bell);
      lcd.createChar(1, note);
      lcd.createChar(2, clock);
      lcd.createChar(3, heart);
      lcd.createChar(4, duck);
      lcd.createChar(5, check);
      lcd.createChar(6, cross);
      lcd.createChar(7, retarrow);
      lcd.home();
      
      i = 0;
      lcd.clear();
      while (i<nRows) {
            lcd.setCursor(0,i);
            lcd.print("user:");
            for (int j=0; j<7; j++) {
                  lcd.print(j, BYTE);
            }
            
            i++;
      }