PDA

View Full Version : Need help with LCD number display.



Steve Matson
- 29th May 2007, 08:20
I am trying to find a way to display the number times a button is pushed on an LCD display. I can display strings such as 'Hello world', or 'Number = ' just fine but have trouble when I have a number stored in B10 (for example) and need to get it to the LCD.
I am using the Lab-X1 with a 16F877A chip, and I am basing my code on the sample program 'PICBASIC program to demonstrate operation of an LCD in 4-bit mode'. I program in PICbasic. Any help would be appreciated.
Thanks
Steve

skimask
- 29th May 2007, 14:37
I can display strings such as 'Hello world', or 'Number = ' just fine but have trouble when I have a number stored in B10 (for example) and need to get it to the LCD.
Thanks
Steve

Let's see the code you DO have and tell us what's wrong with it, so we can help you fix it.

mister_e
- 29th May 2007, 16:29
should be this one
http://www.melabs.com/resources/samples/x1/pbc/lcdx.bas

will check this latter today if someone didn't beat me to the punch... PBC is so WAY different of PBP. Too bad they don't have LCDOUT built-in :(

SteveB
- 29th May 2007, 18:41
My guess is that you are sending a simple byte out to the LCD, and it is then displaying the ASCII equivalent. For example, take the following:

Number1 VAR BYTE

Number1 = 123

When Number1 is sent directly to the LCD, it will cause the “{“ to display.

What you will need to do is enumerate each decimal place of the number and send that to the LCD. For example:


Number1 VAR BYTE
Temp VAR BYTE

Number1 = 123

‘Get Value of digit in 100’s place
Temp = Number1/100 ‘With Number1 = 123 then Temp = 1
Temp = Temp + 48 ‘Convert value to ASCII equivalent
‘Send temp to LCD

‘Get Value of digit in 10’s place
Temp = Number/10 ‘With Number1 = 123 then Temp = 12
Temp = Temp//10 ‘Get Remainder so with Number1 = 123 then Temp = 2
Temp = Temp + 48 ‘Convert value to ASCII equivalent
‘Send temp to LCD

‘Get Value of digit in 1’s place
Temp = Number1//10 ‘Get Remainder so…with Number1 = 123 then Temp = 3
Temp = Temp + 48 ‘Convert value to ASCII equivalent
‘Send temp to LCD


This will print out the leading "0"s, and will only enumerate a BYTE. It's just a simple code example, but it should help explain the concept and get you started on a more specific solution to met you needs.

Hope this helps, good luck.

SteveB

Steve Matson
- 30th May 2007, 03:41
' PICBASIC program to demonstrate operation of an LCD in 4-bit mode

Symbol PORTD = 8 ' PORTD is register 8
Symbol PORTE = 9 ' PORTD is register 9
Symbol TRISD = $88 ' PORTD data direction is register hexadecimal 88
Symbol TRISE = $89 ' PORTD data direction is register hexadecimal 89
Symbol ADCON1 = $9f ' ADCON1 is register hexadecimal 9f

Poke ADCON1, 7 ' Set analog pins to digital
Poke TRISD, 0 ' Set all PORTD lines to output
Poke TRISE, 0 ' Set all PORTE lines to output
Poke PORTE, 0 ' Start with enable low

Pause 100 ' Wait for LCD to power up

Gosub lcdinit ' Initialize the lcd

loop: Gosub lcdclr ' Clear lcd screen
For B4 = 0 To 4 ' Send string to lcd one letter at a time
Lookup B4, ("Hello"), B2 ' Get letter from string
Gosub lcddata ' Send letter in B2 to lcd
Next B4
Pause 500 ' Wait .5 second

Gosub lcdclr ' Clear lcd screen
For B4 = 0 To 4 ' Send string to lcd one letter at a time
Lookup B4, ("world"), B2 ' Get letter from string
Gosub lcddata ' Send letter in B2 to lcd
Next B4
Pause 500 ' Wait .5 second

Goto loop ' Do it forever


' Subroutine to initialize the lcd - uses B2 and B3
lcdinit: Pause 15 ' Wait at least 15ms

Poke PORTD, $33 ' Initialize the lcd
Gosub lcdtog ' Toggle the lcd enable line

Pause 5 ' Wait at least 4.1ms

Poke PORTD, $33 ' Initialize the lcd
Gosub lcdtog ' Toggle the lcd enable line

Pause 1 ' Wait at least 100us

Poke PORTD, $33 ' Initialize the lcd
Gosub lcdtog ' Toggle the lcd enable line

Pause 1 ' Wait once more for good luck

Poke PORTD, $22 ' Put lcd into 4 bit mode
Gosub lcdtog ' Toggle the lcd enable line

B2 = $28 ' 4 bit mode, 2 lines, 5x7 font
Gosub lcdcom ' Send B2 to lcd

B2 = $0c ' Lcd display on, no cursor, no blink
Gosub lcdcom ' Send B2 to lcd

B2 = $06 ' Lcd entry mode set, increment, no shift
Goto lcdcom ' Exit through send lcd command

' Subroutine to clear the lcd screen - uses B2 and B3
lcdclr: B2 = 1 ' Set B2 to clear command and fall through to lcdcom

' Subroutine to send a command to the lcd - uses B2 and B3
lcdcom: Poke PORTE, 0 ' Set RS to command
lcdcd: B3 = B2 & $f0 ' Isolate top 4 bits
Poke PORTD, B3 ' Send upper 4 bits to lcd
Gosub lcdtog ' Toggle the lcd enable line

B3 = B2 * 16 ' Shift botton 4 bits up to top 4 bits
Poke PORTD, B3 ' Send lower 4 bits to lcd
Gosub lcdtog ' Toggle the lcd enable line

Pause 2 ' Wait 2ms for write to complete
Return

' Subroutine to send data to the lcd - uses B2 and B3
lcddata: Poke PORTE, 1 ' Set RS to data
Goto lcdcd

' Subroutine to toggle the lcd enable line
lcdtog: Peek PORTE, B0 ' Get current PORTE value
B0 = B0 | %00000010 ' Set lcd enable line high
Poke PORTE, B0
B0 = B0 & %11111101 ' Set lcd enable line low
Poke PORTE, B0
Return

Steve Matson
- 30th May 2007, 05:55
I am begning to think that I should get PBP. I seems alot more powerful.
Also I am tempted to look into the 'Lookup' and 'Lookdown' functions.
Thanks for the tips.
STeve

P.S. Thanks to Steve B.
That looks like something I can work with.

T.Jackson
- 30th May 2007, 10:00
Yeah - like with the standard version of most things in this World, PIC Basic is only half of what you get in the PRO version. I throughly read between the lines before I made the decision to buy PBP, which at the time, almost twice the amount of the standard.

Steve Matson
- 31st May 2007, 06:05
adding 48 to my number in the register worked great. I am still going to get the pro version. I hope there isnt too much of a learning curve from Picbasic.
Steve

Steve Matson
- 27th June 2007, 00:07
I just purchased Pic Basic Pro because I heard alot of great things about it.
Again, Thanks for all the help.
Steve.
P.S. Just to let you know, Pics are often used in industry and it's good to mention on a resume if your going for any kind of technical job.