Using Nokia LCD


Closed Thread
Results 1 to 40 of 301

Thread: Using Nokia LCD

Hybrid View

  1. #1
    Join Date
    Dec 2008
    Location
    Ploiesti, ROMANIA
    Posts
    582


    Did you find this post helpful? Yes | No

    Default Great job, indeed !

    ... but, please, on my code for simple thermometer, can You tell me how re-define the characters and how to display ? Just with BIG characters ! Thanks in advance, even for a little clue ...
    Code:
    '*********************************************
    '               Thermometer 
    '          with Nokia 3310 display
    @ DEVICE pic16F628A, XT_OSC, WDT_OFF, PWRT_OFF, BOD_OFF, MCLR_OFF, LVP_OFF, CPD_OFF, PROTECT_OFF       
    
    DEFINE  NO_CLRWDT 1
    DEFINE  OSC 4                            
    
            TRISB = %00001110        'portB configuration  ; 0=out 1=in
            TRISA = %10100010        'portA configuration
    
            PortA = %11100010        
            CMCON = 7                
            VRCON = 0                
            INTCON = 0              
            OPTION_REG = %00000111   '
                        
    RST         var  PortA.4         'pin 3   Output   reset display
    SDIN        var  PortA.3         'pin 2   Output   master data out        
    SCK         var  PortA.2         'pin 1   Output   Spi clock
    DQ          var  PortA.1         'pin 18  I/O      DQ DS18b20    
    D_C         var  PortB.0         'pin 6   Output   command/data sel. register
    
                
                temperature     var  Word	
                tref            var  word
                TempC           var  Byte
                Float           var  Byte
                Dummy           var  Byte
                Flag            var  Byte          
                SignBit         var  Flag.0
                Minus           var  Byte                   
                LcdReg          var  Byte        
                x               var  Byte
                y               var  Byte
                Offset          var  Byte
                Char            var  Byte
                a               var  Byte
                PosX            var  Byte
                PosY            var  Byte
                Chr             var  Byte
                LcdData         var  Byte
                V               var  Word		 
                Sign            var  Byte
                Busy            VAR  BIT         ' Busy Status-Bit
    
    DS18B20_12bit 	CON %01111111                  ' 750ms,   0.0625°C  
    
    
    '====================================================================           
                    
         DATA @10,$7E,$91,$89,$85,$7E,_       ';// 0        
                  $00,$82,$FF,$80,$00,_       ';// 1    
                  $82,$C1,$A1,$91,$8E,_       ';// 2     
                  $42,$81,$89,$89,$76,_       ';// 3    
                  $18,$14,$12,$FF,$10,_       ';// 4    
                  $4F,$89,$89,$89,$71,_       ';// 5    
                  $7E,$89,$89,$89,$72,_       ';// 6    
                  $01,$E1,$11,$09,$07,_       ';// 7    
                  $76,$89,$89,$89,$76,_       ';// 8    
                  $46,$89,$89,$89,$7E,_       ';// 9 
                  $08,$08,$3E,$08,$08,_       ';// +   10
                  $08,$08,$08,$08,$08,_       ';// -   11
                  $00,$C0,$C0,$00,$00         ';// .   12
    
    '====================================================================           
                  pause 100
                  RST = 1
                  PortB = 0                      
                  LcdReg  =  %00100001        'LCD Extended Commands.
                  call    PrintCtrlLcd
                  LcdReg  =  $C8              'Set LCD Vop (Contrast)
                  call    PrintCtrlLcd
                  LcdReg  =  %00000110        'Set Temp coefficent.
                  call    PrintCtrlLcd
                  LcdReg  =  %00010011        'LCD bias mode 1:48.
                  call    PrintCtrlLcd
                  LcdReg  =  %00100000        'LCD Standard Commands, Horizontal addressing mode.
                  call    PrintCtrlLcd
                  LcdReg  =  $0C              'LCD in normal mode.  $0D inverse
    
    Call  PrintCtrlLcd                 
    Call 	CursorHome               
    Gosub LCD_Clear
    
    '====================================================================
    
    OWOut DQ, 1, [$CC, $4E, 0, 0, DS18B20_12bit]
     Output DQ             			            ' Make Pin Output
     DQ=0					                          ' OneWire line Low
     PauseUs 480                            ' Keep down for 480 µS  
     Input DQ                               ' Make Pin Input
     PauseUs 70                             ' Wait 70 µS
    
    OPTION_REG.7=1
    TMR0=0
    INTCON.2=0
    
    
    W1: 
        OWIN DQ,4,[busy]                     'Check for still busy converting
        IF busy = 0 THEN W1                  'Still busy?, then loop
    
    
    CALL BorderLine
    
    
    '====================================================================
    
    Main:  
    ClockLoop: IF INTCON.2=0 THEN ClockLoop
    INTCON.2=0
    CALL BorderLine
    
    
     OWOut DQ, 1, [$CC, $44] 
     OWOut DQ, 1, [$CC, $BE]
     OWIn DQ, 2, [temperature.byte0, temperature.byte1]         
                    SignBit = 0
                    if  temperature.15 then  
                        temperature  = ~ temperature + 1 
                        SignBit = 1 
                    endif  
                    
    Dummy = 625 * Temperature
    TempC = DIV32 10
    TempC = (Temperature & $7FF) >> 4
    Float = ((Temperature.Lowbyte & $0F ) * 25 )>>2
    Temperature=TempC*100 + Float         
     	If SignBit then
      		V= 10000 - Temperature   	' 25'C=12500  0'C=10000  -10'C=9000 
      		SignBit = 0
     	   else
      		V= 10000 + Temperature
     	EndIf
     
    	If V >= 10000 then             	' Above 0 C.      
      		Temperature=V-10000                   
     	   else                                   
      		Temperature=10000-V      	' Below 0 C. 
     	EndIf
     
     GoSub SelectSign                    	' +/blank/- Sign 
    
    '================= setting cursor for display the temperature 
         LcdReg  =  %10001000                 ' cursor  X
            call    PrintCtrlLcd
         LcdReg  =  %01000010 + 1             ' cursor  Y
            call    PrintCtrlLcd
    '================= now display temperature 
                        if Tempc > 99 then 
                            Char = 3                
                            call    PrintChar
                        else    
                            Char = 12                        ' + plus
                            if SignBit = 1 then Char = 13    ' - minus
                            call    PrintChar
                        endif                  
                    
                    Char = (temperature dig 3) + 2            
                    call    PrintChar
                    Char = (temperature dig 2) + 2           
                    call    PrintChar
                    Char = 14                       
                    call    PrintChar
                    Char = (temperature dig 1) + 2      
                    Call    PrintChar 
                    Char = (temperature dig 0) + 2      
                    Call    PrintChar
    
    goto Main
    
    
    '================== S U B R O U T I N E S ===========================   
               
    '========================== L C D ===================================             
    
    CursorHome:     LcdReg  =  %10000000      ' cursor Home
                    call    PrintCtrlLcd
                    LcdReg  =  %01000000      ' cursor Home
                    call    PrintCtrlLcd
                    return
    
    PrintChar:   offset = Char * 5          
                 
                    for a = 1 to 5                
                        read offset, LcdReg
                        call  PrintDataLcd
                        offset = offset + 1
                    next a
                    LcdReg = 0
                    call    PrintDataLcd
                    return
                                        
    PrintCtrlLcd:   D_C = 0                             
    
    PrintDataLcd:   for x = 1 to 8                
                        SDIN = LcdReg.7              
                        SCK = 1
                        LcdReg = LcdReg << 1
                        SCK = 0
                    next x               
                    D_C = 1
                    return               
                    
    LCD_Clear:
      PosX=0:PosY=0:GOSUB LCD_GotoXY
      HIGH D_C
      FOR Chr=1 TO 252
          LcdData=0:GOSUB LCD_ByteOut
          LcdData=0:GOSUB LCD_ByteOut
      NEXT Chr
    RETURN
    
    LCD_GotoXY:
      LOW D_C
      LcdData=%01000000 | PosY :GOSUB LCD_ByteOut
      LcdData=%10000000 | PosX :GOSUB LCD_ByteOut
    RETURN
    
    LCD_ByteOut:
      SHIFTOUT SDIN,SCK,1,[LcdData]
    RETURN         
    
    '====================================================================
    SelectSign:
     If v = 10000 then                      	' Temperature = 0 C.
      	Sign=" " 				      ' No sign
         Else 
      		If v < 10000 then             ' <> 0
       			Sign="-"			    ' Temperature below 0 C.	
      		    Else
       			Sign="+"			    ' Temperature above 0 C.
      		EndIf
     EndIf
    Return
    
    
    BorderLine: 
    ' Raw 0
    ' Raw 1             
    ' no space for post code here 
    Return                          
    
    '=================================== 
    End        'of program

  2. #2
    Join Date
    Feb 2006
    Location
    Gilroy, CA
    Posts
    1,530


    Did you find this post helpful? Yes | No

    Default

    You might try something like this. The characters you show as an example could be simplified to fit into half the space, but this allows you to smooth the characters if you like. I did not smooth them, just kept to your example font, so hopefully you can see what I am trying to do. Each hex data point of the character is basically a binary image of the column. It starts at the base of the character, but since our character is going to take 4 character positions, our zero starts at half of the 16 pixels high. So the left column of the top of the zero is 11111100 (or $FC) all the 1's are black. As you can see, it takes a long time to make the characters. There may be a tool out there somewhere to make this easier for you. Hopefully you just need numbers!

    The building of the characters are shown on the data sheet for the display on pages 8-9, and 22-23.
    Code:
    FA VAR BYTE[5] 'upper left of character
    FB VAR BYTE[5] 'upper right of character
    FC VAR BYTE[5] 'lower left of character
    FD VAR BYTE[5] 'lower right of character
    
    '-------------------------------------------------------------------------------    
    ' This part demonstrates how to write to LCD
    Lcd_SendChar:
        lookdown Lcd_data,[" !\#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"],CharNum
        Lcd_data = CharNum +32
        
        SELECT CASE lcd_data
    
        Case 48 ' a zero                   
        	FA(0)=$FC:FA(1)=$FC:FA(2)=$3:FA(3)=$3:FA(4)=$C3 ' // 0
        	FB(0)=$C3:FB(1)=$33:FB(2)=$33:FB(3)=$FC:FB(4)=$FC ' // 0  
        	FC(0)=$0F:FC(1)=$0F:FC(2)=$33:FC(3)=$33:FC(4)=$30 ' // 0
        	FD(0)=$30:FD(1)=$30:FD(2)=$30:FD(3)=$0F:FD(4)=$0F ' // 0  
        Case 49 ' a one                  
    
        
        end SELECT
    Write_LCD:
        High Lcd_DC
        SHiftOUT Lcd_SDO , Lcd_CLK , MSBFIRST, [ FA(0),FA(1),FA(2),FA(3),FA(4)] 'upper left
    'need to point to next position here
        SHiftOUT Lcd_SDO , Lcd_CLK , MSBFIRST, [ FB(0),FB(1),FB(2),FB(3),FB(4),$00,$00] 'upper right
    'need to add code to change location to lower left position for bottom of character here!
        SHiftOUT Lcd_SDO , Lcd_CLK , MSBFIRST, [ FC(0),FC(1),FC(2),FC(3),FC(4)] 'lower left
    'need to add code to change to next position
        SHiftOUT Lcd_SDO , Lcd_CLK , MSBFIRST, [ FD(0),FD(1),FD(2),FD(3),FD(4),$00,$00] 'lower right
    'need to add code to move back to upper level (and shift right) for beginning of next character
        Low Lcd_DC
        Return
    Attached Images Attached Images  
    Last edited by ScaleRobotics; - 7th April 2010 at 03:05.

  3. #3
    Join Date
    Feb 2006
    Location
    Gilroy, CA
    Posts
    1,530


    Did you find this post helpful? Yes | No

    Default font and bitmap tool

    The attached program fastLCD.zip will help you with text, as well as graphics. It will let you create characters, and it will create hex for them.

    Attached Images Attached Images  
    Attached Files Attached Files

  4. #4
    Join Date
    Dec 2008
    Location
    Ploiesti, ROMANIA
    Posts
    582


    Did you find this post helpful? Yes | No

    Default Thank You !

    Nice program, but I use already Excel (bin2hex) for those big characters...Unfortunately, I need to understand the codes You and HJota propose and modify all my code; the procedures for define and display the characters are different...Per aspera ad astra ...

  5. #5
    Join Date
    Dec 2008
    Location
    Ploiesti, ROMANIA
    Posts
    582


    Did you find this post helpful? Yes | No

    Default First step !

    I succeded to display "23.56" ! it's a step, don't ?!
    Now, assuming that I succed to write the code for reading DS18B20, how display temperature instead "23.56" ?
    It's correct so : " lookup i, [temperature DIG 3, temperature DIG 2, temperature DIG 1], j" or how ? Thanks !
    Attached Images Attached Images  
    Attached Files Attached Files

  6. #6
    Join Date
    Feb 2006
    Location
    Gilroy, CA
    Posts
    1,530


    Did you find this post helpful? Yes | No

    Default

    How about changing from this:
    Code:
    for i=0 to 4
    lookup i,["23.56"],j
    lcdstr(i)=j
    next i
    to something like this:
    Code:
    lcdstr(4) = 48 + temperature dig 3
    lcdstr(3) = 48 + temperature dig 2
    lcdstr(2) = "."
    lcdstr(1) = 48 + temperature dig 1
    lcdstr(0) = 48 + temperature dig 0
    You would have to do something when your temperature goes to single digits though.

  7. #7
    Join Date
    Dec 2008
    Location
    Ploiesti, ROMANIA
    Posts
    582


    Did you find this post helpful? Yes | No

    Default

    What I put here ?
    Code:
    lcdstr(4) = 48 + temperature dig 3
    lcdstr(3) = 48 + temperature dig 2
    lcdstr(2) = "."
    lcdstr(1) = 48 + temperature dig 1
    lcdstr(0) = 48 + temperature dig 0
    
    Tc=2
    for i=0 to 4
    lookup i,["??????"],j
    lcdstr(i)=j
    next i
    nC=5

Similar Threads

  1. Nokia COLOR LCD PicBasicPro 2.50a example code
    By skimask in forum Code Examples
    Replies: 49
    Last Post: - 28th September 2011, 01:43
  2. 16f688 LCD what have I done wrong
    By spitfiredriver in forum mel PIC BASIC Pro
    Replies: 6
    Last Post: - 8th August 2009, 19:54
  3. Play with LCD on PICDEM
    By The IceMan in forum mel PIC BASIC
    Replies: 5
    Last Post: - 22nd August 2008, 16:56
  4. Need help with LCD number display.
    By Steve Matson in forum mel PIC BASIC
    Replies: 8
    Last Post: - 26th June 2007, 23:07
  5. LCD will not start
    By btaylor in forum mel PIC BASIC Pro
    Replies: 49
    Last Post: - 24th May 2007, 02:30

Members who have read this thread : 0

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts