Go Down

Topic: 16x2 LCD displays all single digit integers as 'x0' rather than '0x' (Read 1 time) previous topic - next topic


Hi guys, I'm playing around with an LCD module, and I've got it working all fine, except for one little thing: when it should be displaying numbers from 1-9, it displays 10-90 rather than 01-09. What is the best way to solve this problem?

Here is my code:
Code: [Select]

[// include the library code:
#include <LiquidCrystal.h>

int des = 0;

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  lcd.print("des");  // Print a message to the LCD.

void loop() {
des =  (analogRead(1)/34.14);

  lcd.setCursor(0, 1);


The hardware is all working fine, it's just the software. Also, when I start the project  up, if the value of des is less than 2 digits, it reads correctly, that is, 1,2,3,4 etc. Once the value goes above 2 digits however, if des returns to a one digit number, a zero is tacked onto the back.

Thanks for your help.


You would seem to need to define des as a floating point # for the math involved
analogRead, which is 0 to 1023, divided by 34.14

Instead, use the mapping function to map 0-1023 into 1-30.

basically does this:
if analogRead is 0-30, des  = 1
31-60, des = 2
61-90, des = 3
Designing & building electrical circuits for over 25 years. Check out the ATMega1284P based Bobuino and other '328P & '1284P creations & offerings at  www.crossroadsfencing.com/BobuinoRev17.
Arduino for Teens available at Amazon.com.


Unfortunately that didn't work. It seems like once the LCD has displayed two digits, it doesn't want to get rid of the second and so just displays a 0.


I solved it, I forced the Arduino to 'print' a blank square to the LCD if des <=9. Kind of annoying, but it worked.


I solved it, I forced the Arduino to 'print' a blank square to the LCD if des <=9. Kind of annoying, but it worked.
You have discovered that once you display a character on the LCD it stays there until overwritten.   A more generic way to handle this situation when you have to update some data periodically is to:
(1) set the cursor to the position of the first character.
(2) display as many spaces as the largest number of characters that could possibly be displayed.
(3) reset the cursor back to the position of the first character.
(4) display your new data.



I changed my code to your suggestion, thanks for that. You learn something new every day, hey?


Here is what I do if I need some well-defined texts,
Code: [Select]

char msg[];
int x;

The above way eliminate the need to print out blank spaces, it always outputs up to 4 digits for the analog read and has left blank padding if input is less than 4 digits. It also eliminates the overloaded method of lcd.print(int) or lcd.print(float), which are very expensive on the FLASH. In most of my programs, I never use lcd.print(any data type) except for lcd.print(string).
You can do %04d if you want zero padding

Go Up