NEWBIE: how to get text onto 2 lines on a 16x2 lcd display

Rhodri James rhodri at kynesim.co.uk
Thu Sep 26 07:55:50 EDT 2019


On 26/09/2019 11:58, RobH wrote:
> Thanks, but was is Python REPR.

DL was referring to the interactive program you get when you type 
"python" at a Linux or Windows command prompt.  Here's an example, 
copied from my Linux box:

rhodri at scrote:~$ python
Python 2.7.15+ (default, Jul  9 2019, 16:51:35)
[GCC 7.4.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
 >>> import cgi
 >>> help(cgi)
[[screeds of documentation for the cgi module cut]]
 >>> [[type control-D to get out]]
rhodri at scrote:~$

(The bits in [[double square brackets]] are my comments, not something 
either I or Python typed!)

> This my adaptation of non working code. Bodged from the char_lcd.py code:
> 
>    GNU nano 2.7.4                          File: char_lcd.py
> 
> #!/usr/bin/python
> # Example using a character LCD connected to a Raspberry Pi or 
> BeagleBone Black.
> import time
> 
> import Adafruit_CharLCD as LCD

Aha, that's the critical information we were lacking earlier.  I found 
the Adafruit_CharLCD library after a little googling.  It's marked as 
deprecated (the author now uses something else), but if it works for you 
you might as well keep on using it.

[[Much set-up for the Pi cut for brevity]]

> # Initialize the LCD using the pins above.
> lcd = LCD.Adafruit_CharLCD(lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7,
>                             lcd_columns, lcd_rows, lcd_backlight)
> 
> # Print a two line message
> # lcd.message('Hello\nworld!')
> lcd.message( "Hello" 1)

It looks like lcd.message() takes a text string and displays on the LCD, 
starting at the current cursor position (I'll get back to that).  You 
optimistically added an extra argument, the line number to start at 
(you're missing a comma, but that's an easy typo to make and I assume 
you already caught it).  Unfortunately lcd.message() only takes the one 
argument, the text string.  This is where that error message comes from: 
"TypeError: message() takes exactly 2 arguments (3 given)" means that 
you gave the function more arguments than it knew what to do with.

(Why 2 and 3 instead of 1 and 2?  "lcd" itself is an argument to 
message(), telling it which lcd to send the message to if you had more 
than one.  When you look at the function definition, you'll see that it 
start with "def message(self, text):" which makes that a bit more 
explicit.  Anyway, that's beside the point.)

So how do you control where you start your message on the LCD?  It looks 
like the answer is the lcd.set_cursor() function.  The cursor is the 
point from which your printing starts.  In your text editor it's 
probably a blinking vertical line (or underscore, or blob... editors 
vary).  On your LCD display it's probably invisible, though it looks 
like there's another function to change that.

Anyway, you give set_cursor() a column number and a row number in that 
order.  I think they start from 0, so to write "Hello" to the second 
line of your display you would write:

   lcd.set_cursor(0, 1)
   lcd.message("Hello")

The gotcha here is that message() is only going to write the characters 
you tell it to, and won't overwrite anything else.  If for example you 
followed up the two lines above with:

   lcd.set_cursor(0, 1)  # Back to the start of the line
   lcd.message("Bye")

you would end up with "Byelo" displayed on the LCD.  You would need to 
put extra spaces on the end of your message to overwrite the characters 
you don't want any more, but not so many that you overwrite what you 
want to keep.  Working out how many spaces that is for any given message 
could be quite tedious.  You may well find it easier to lcd.clear() the 
whole display and rewrite everything when you want to change anything.

Anyway, I hope that helps.

-- 
Rhodri James *-* Kynesim Ltd



More information about the Python-list mailing list