Menu

GCB Basic Locate 1,0 no second row. RESOLVED. Incorrect chip selected.

Romtek
2023-02-08
2023-02-12
1 2 > >> (Page 1 of 2)
  • Romtek

    Romtek - 2023-02-08

    Hi, I found this problem with using the PCF8574 i2c interface, where the "locate 1.0" command doesn't work properly.
    Let me explain using the 1602 display together with the pcf8574 it doesn't write anything on the second line and likewise for the other lines.
    I solved it like this:
    locate 0,0 ' 1 row
    PRINT "DISPLAY ON 1 row"
    locate 0,40 ' 2 row
    PRINT "DISPLAY ON 2 row"
    locate 0,16 ' 3 row
    PRINT "DISPLAY ON 3 row"
    locate 0,80 ' 4 row
    PRINT "DISPLAY ON 4 row"

    using both a 4 line and a two line display and trying also with more PCF8574 and also on pic16f88.
    I hope I was helpful, sorry for my english.

     
    • Romtek

      Romtek - 2023-02-09

      I state that I'm using 16x2 and 16x4 displays with PCF8574 interface.
      Sorry but in the previous post I had put MY solution to get around the problem, in fact if one loads the prog as I wrote it it displays on the second line, while if one uses "locate1,0" it doesn't display on the second line.

       
  • Romtek

    Romtek - 2023-02-08

    I add that I also tested it on MEGA8515

     
  • Anobium

    Anobium - 2023-02-08

    Hello Romtek,

    What version of the compiler? If you are using GCStudio -it is shown in the About. Knowing this is very important.

     
    • Romtek

      Romtek - 2023-02-08

      Hi the version I used are two.
      0.99.01 2022-01-27 (Windows 64-bit) : Build 1073
      and the version
      Version: 1.73.1
      Release: 22314

      Date: 2022-11-10T18:28:26.414Z
      Electron: 19.0.17
      Chromium: 102.0.5005.167
      Node.js: 16.14.2
      V8: 10.2.154.15-electron.0
      OS: Windows_NT ia32 10.0.19045
      Sandboxed: No

      thank you for answering me.
      I hope this GCB project becomes more popular, I'm passing the word to my friends, Cheers.

       
      • Anobium

        Anobium - 2023-02-08

        That is an old version of the toolchain. Upgrade when you can.

        But, I think we need to see you program.

        Make a program that the absolute minimum line of code to reproduce the error, So, #chip;lcd set up; and the locate and print. Post the small program and the associated ASM file.

        I have a PCF8574 setup here on the bench so I can look when I get this example program.

         
        • Romtek

          Romtek - 2023-02-08
          the program is the following compiled with the latest version
          Note that the locate 0,40 command for positioning the second line, unlike in the manual, locate 1,0 does not work

          1.73.1
          Release: 22314
          Commit: 14f2d26367b7e8f03ff2352516ba27d6302dd7b1
          Data: 2022-11-10T18:28:26.414Z
          Electron: 19.0.17
          Chromium: 102.0.5005.167
          Node.js: 16.14.2
          V8: 10.2.154.15-electron.0

          ''********

          /*
          Locate 0,40

          locate 0,0
          PRINT "DISPLAY ON 1 row"
          locate 0,40 '
          PRINT "DISPLAY ON 2 row"
          locate 0,16  '
          PRINT "DISPLAY ON 3 row"
          locate 0,80 '
          PRINT "DISPLAY ON 4 row"
          
          */
          '******************************************************
          
          ;Chip Settings
          #chip 16F88,4
          
          #include <pcf8574.h>
          '#option explicit
          
          
          ; ----- Define Hardware settings
             ' THIS CONFIG OF THE SERIAL PORT TO A PC TERMINAL via a TTL Converter
             ' USART settings
             #define USART_BAUD_RATE 19200 '!!!!!error speed 9600
             Dir PORTA.3 Out
             Dir PORTA.4 In
             #define USART_DELAY 10 ms
             #define USART_BLOCKING
          
          
             #define led PortA.2 '
             Dir led Out ' out
          
            ; ----- Define Hardware settings
            ' Define I2C settings - CHANGE PORTS
             #define I2C_MODE Master
             #define I2C_DATA PORTB.0 'pin
             #define I2C_CLOCK PORTB.1 'pin
             #define I2C_DISABLE_INTERRUPTS ON
             #define I2C_BIT_DELAY 0 us     '0
             #define I2C_CLOCK_DELAY 1 us   '1
             #define I2C_END_DELAY 0 us     '0
          
             #define LCD_IO 10
             '#define LCD_I2C_Address_ 0x4E
             #define LCD_I2C_Address_1 0x4E
             '#define LCD_I2C_Address_1 0x27
          
            '''Set up LCD
             'You may need to use SLOW or MEDIUM if your LCD is a slower device.
             #define LCD_SPEED SLOW 'FAST
          
             #define LCD_Backlight_On_State  1
             #define LCD_Backlight_Off_State 0
          
          
          ; ----- Quick Command Reference:
          
           '''Set LCD_10 to 10 for the YwRobot LCD1602 IIC V1 or the Sainsmart LCD_PIC I2C adapter
           '''Set LCD_10 to 12 for the Ywmjkdz I2C adapter with pot bent over top of chip
          
          ' variabili
          Dim yy As byte   '
          Dim xx As byte  '
          'i =0
          
          ; ----- Main body of program commences here.
          Inittimer1 OSC, PS_64
          Starttimer 1
          Settimer 1, 50 ;Preload Timer
          On Interrupt Timer1Overflow Call Flash_LED
          
          Sub Flash_LED
          Settimer 1, 50 'Preload timer
             led=!led '
             'pulseout led, 100 ms
          End Sub
              HSerPrint "Locate 0,40"
              HSerSend 13
              HSerSend 10
          
              'lampeggio
              LCDBacklight OFF
              WAIT 500 ms
              LCDBacklight ON
              WAIT 500 ms
          /*  LOCATE 1,0
              CLS
              PRINT "Address ": LCDHex(  LCD_I2C_Address_Current, 2)
              wait 3 s
          */
          /*
          
          */
           Do Forever
           wait 1 s
              cls
              locate 0,0
              PRINT "DISPLAY ON 1 row"
              locate 0,40 '2 row
              PRINT "DISPLAY ON 2 row"
              locate 0,16  '3 row
              PRINT "DISPLAY ON 3 row"
              locate 0,80 '4 row
              PRINT "DISPLAY ON 4 row"
              wait 3 s
          
              cls
              locate 0,0
              PRINT "     x 1 "
              print 1
          
              locate 0,40 '
              PRINT "   3  2 " 
              print 2
          
              locate 0,16  '
              PRINT "  2    3 " 
              print 3
          
              locate 0,80 '
              PRINT "      6 ON 4 "
              print 4
          
              wait 5 s
          
          
          
              loop
          
          
          end
          

          thank you for the reply

           

          Last edit: Anobium 2023-02-09
          • Romtek

            Romtek - 2023-02-08

            This problem occurs on both pic16f88 and mega8515

             
  • Romtek

    Romtek - 2023-02-08

    this is the listing in asm
    thank you for the reply

    ;Program compiled by Great Cow BASIC (1.00.00 2023-01-01 (Windows 64 bit) : Build 1213) for Microchip MPASM/MPLAB-X Assembler using FreeBASIC 1.07.1/2023-01-02 CRC64
    ;Need help?
    ; See the GCBASIC forums at http://sourceforge.net/projects/gcbasic/forums,
    ; Check the documentation and Help at http://gcbasic.sourceforge.net/help/,
    ;or, email us:
    ; w_cholmondeley at users dot sourceforge dot net
    ; evanvennn at users dot sourceforge dot net

    ;**************

    ;Set up the assembler options (Chip type, clock source, other bits and pieces)
    LIST p=16F88, r=DEC

    include <p16f88.inc></p16f88.inc>

    __CONFIG _CONFIG1, _CP_OFF & _WRT_OFF & _CPD_OFF & _LVP_OFF & _MCLRE_OFF & _WDTE_OFF & _INTRC_IO
    __CONFIG _CONFIG2, _FCMEN_ON

    ;**************

    ;Set aside memory locations for variables
    COMPORT EQU 32 ; 0x20
    DELAYTEMP EQU 112 ; 0x70
    DELAYTEMP2 EQU 113 ; 0x71
    I2CACK EQU 33 ; 0x21
    I2CACKPOLLSTATE EQU 34 ; 0x22
    I2CBYTE EQU 35 ; 0x23
    I2CMATCH EQU 36 ; 0x24
    I2CSTATE EQU 37 ; 0x25
    I2C_LCD_BYTE EQU 38 ; 0x26
    LCDBYTE EQU 39 ; 0x27
    LCDCOLUMN EQU 40 ; 0x28
    LCDLINE EQU 41 ; 0x29
    LCDTEMP EQU 42 ; 0x2A
    LCDVALUE EQU 43 ; 0x2B
    LCDVALUETEMP EQU 44 ; 0x2C
    LCD_BACKLIGHT EQU 45 ; 0x2D
    LCD_I2C_ADDRESS_CURRENT EQU 46 ; 0x2E
    LCD_STATE EQU 47 ; 0x2F
    PRINTLEN EQU 48 ; 0x30
    SAVEPCLATH EQU 49 ; 0x31
    SAVESYSTEMP1 EQU 50 ; 0x32
    SERDATA EQU 51 ; 0x33
    STRINGPOINTER EQU 52 ; 0x34
    SYSBYTETEMPA EQU 117 ; 0x75
    SYSBYTETEMPB EQU 121 ; 0x79
    SYSBYTETEMPX EQU 112 ; 0x70
    SYSCALCTEMPA EQU 117 ; 0x75
    SYSCALCTEMPX EQU 112 ; 0x70
    SYSDIVLOOP EQU 116 ; 0x74
    SYSLCDTEMP EQU 53 ; 0x35
    SYSPRINTDATAHANDLER EQU 54 ; 0x36
    SYSPRINTDATAHANDLER_H EQU 55 ; 0x37
    SYSPRINTTEMP EQU 56 ; 0x38
    SYSREPEATTEMP1 EQU 57 ; 0x39
    SYSREPEATTEMP2 EQU 58 ; 0x3A
    SYSSTATUS EQU 127 ; 0x7F
    SYSSTRINGA EQU 119 ; 0x77
    SYSSTRINGA_H EQU 120 ; 0x78
    SYSSTRINGB EQU 114 ; 0x72
    SYSSTRINGB_H EQU 115 ; 0x73
    SYSSTRINGLENGTH EQU 118 ; 0x76
    SYSSTRINGPARAM1 EQU 479 ; 0x1DF
    SYSTEMP1 EQU 59 ; 0x3B
    SYSTEMP2 EQU 60 ; 0x3C
    SYSW EQU 126 ; 0x7E
    SYSWAITTEMP10US EQU 117 ; 0x75
    SYSWAITTEMPMS EQU 114 ; 0x72
    SYSWAITTEMPMS_H EQU 115 ; 0x73
    SYSWAITTEMPS EQU 116 ; 0x74
    SYSWAITTEMPUS EQU 117 ; 0x75
    SYSWAITTEMPUS_H EQU 118 ; 0x76
    TMRNUMBER EQU 61 ; 0x3D
    TMRPRES EQU 62 ; 0x3E
    TMRSOURCE EQU 63 ; 0x3F
    TMRVALUE EQU 64 ; 0x40
    TMRVALUE_H EQU 65 ; 0x41

    ;**************

    ;Vectors
    ORG 0
    pagesel BASPROGRAMSTART
    goto BASPROGRAMSTART
    ORG 4
    INTERRUPT

    ;**************

    ;Save Context
    movwf SysW
    swapf STATUS,W
    movwf SysSTATUS
    banksel STATUS
    ;Store system variables
    movf SysTemp1,W
    movwf SaveSysTemp1
    movf PCLATH,W
    movwf SavePCLATH
    clrf PCLATH
    ;On Interrupt handlers
    banksel PIE1
    btfss PIE1,TMR1IE
    goto NotTMR1IF
    banksel PIR1
    btfss PIR1,TMR1IF
    goto NotTMR1IF
    call FLASH_LED
    bcf PIR1,TMR1IF
    goto INTERRUPTDONE
    NotTMR1IF
    ;User Interrupt routine
    INTERRUPTDONE
    ;Restore Context
    ;Restore system variables
    banksel SAVESYSTEMP1
    movf SaveSysTemp1,W
    movwf SysTemp1
    movf SavePCLATH,W
    movwf PCLATH
    swapf SysSTATUS,W
    movwf STATUS
    swapf SysW,F
    swapf SysW,W
    retfie

    ;**************

    ;Start of program memory page 0
    ORG 37
    BASPROGRAMSTART
    ;Call initialisation routines
    call INITSYS
    call INITUSART
    call INITI2C
    call INITLCD
    ;Enable interrupts
    bsf INTCON,GIE
    bsf INTCON,PEIE

    ;Start of the main program
    banksel TRISA
    bcf TRISA,3
    bsf TRISA,4
    bcf TRISA,2
    movlw 1
    banksel TMRSOURCE
    movwf TMRSOURCE
    movlw 3
    movwf TMRPRES
    call INITTIMER1
    movlw 1
    movwf TMRNUMBER
    call STARTTIMER
    movlw 1
    movwf TMRNUMBER
    movlw 50
    movwf TMRVALUE
    clrf TMRVALUE_H
    call SETTIMER176
    banksel PIE1
    bsf PIE1,TMR1IE
    movlw low SYSSTRINGPARAM1
    movwf SysStringB
    movlw high SYSSTRINGPARAM1
    movwf SysStringB_H
    movlw low StringTable1
    movwf SysStringA
    movlw high StringTable1
    movwf SysStringA_H
    banksel STATUS
    call SYSREADSTRING
    movlw low SYSSTRINGPARAM1
    movwf SysPRINTDATAHandler
    movlw high SYSSTRINGPARAM1
    movwf SysPRINTDATAHandler_H
    movlw 1
    movwf COMPORT
    call HSERPRINT306
    movlw 13
    movwf SERDATA
    call HSERSEND295
    movlw 10
    movwf SERDATA
    call HSERSEND295
    clrf LCDTEMP
    call LCDBACKLIGHT
    movlw 244
    movwf SysWaitTempMS
    movlw 1
    movwf SysWaitTempMS_H
    call Delay_MS
    movlw 1
    movwf LCDTEMP
    call LCDBACKLIGHT
    movlw 244
    movwf SysWaitTempMS
    movlw 1
    movwf SysWaitTempMS_H
    call Delay_MS
    SysDoLoop_S1
    movlw 1
    movwf SysWaitTempS
    call Delay_S
    call CLS
    clrf LCDLINE
    clrf LCDCOLUMN
    call LOCATE
    movlw low SYSSTRINGPARAM1
    movwf SysStringB
    movlw high SYSSTRINGPARAM1
    movwf SysStringB_H
    movlw low StringTable2
    movwf SysStringA
    movlw high StringTable2
    movwf SysStringA_H
    call SYSREADSTRING
    movlw low SYSSTRINGPARAM1
    movwf SysPRINTDATAHandler
    movlw high SYSSTRINGPARAM1
    movwf SysPRINTDATAHandler_H
    call PRINT109
    clrf LCDLINE
    movlw 40
    movwf LCDCOLUMN
    call LOCATE
    movlw low SYSSTRINGPARAM1
    movwf SysStringB
    movlw high SYSSTRINGPARAM1
    movwf SysStringB_H
    movlw low StringTable3
    movwf SysStringA
    movlw high StringTable3
    movwf SysStringA_H
    call SYSREADSTRING
    movlw low SYSSTRINGPARAM1
    movwf SysPRINTDATAHandler
    movlw high SYSSTRINGPARAM1
    movwf SysPRINTDATAHandler_H
    call PRINT109
    clrf LCDLINE
    movlw 16
    movwf LCDCOLUMN
    call LOCATE
    movlw low SYSSTRINGPARAM1
    movwf SysStringB
    movlw high SYSSTRINGPARAM1
    movwf SysStringB_H
    movlw low StringTable4
    movwf SysStringA
    movlw high StringTable4
    movwf SysStringA_H
    call SYSREADSTRING
    movlw low SYSSTRINGPARAM1
    movwf SysPRINTDATAHandler
    movlw high SYSSTRINGPARAM1
    movwf SysPRINTDATAHandler_H
    call PRINT109
    clrf LCDLINE
    movlw 80
    movwf LCDCOLUMN
    call LOCATE
    movlw low SYSSTRINGPARAM1
    movwf SysStringB
    movlw high SYSSTRINGPARAM1
    movwf SysStringB_H
    movlw low StringTable5
    movwf SysStringA
    movlw high StringTable5
    movwf SysStringA_H
    call SYSREADSTRING
    movlw low SYSSTRINGPARAM1
    movwf SysPRINTDATAHandler
    movlw high SYSSTRINGPARAM1
    movwf SysPRINTDATAHandler_H
    call PRINT109
    movlw 3
    movwf SysWaitTempS
    call Delay_S
    call CLS
    clrf LCDLINE
    clrf LCDCOLUMN
    call LOCATE
    movlw low SYSSTRINGPARAM1
    movwf SysStringB
    movlw high SYSSTRINGPARAM1
    movwf SysStringB_H
    movlw low StringTable6
    movwf SysStringA
    movlw high StringTable6
    movwf SysStringA_H
    call SYSREADSTRING
    movlw low SYSSTRINGPARAM1
    movwf SysPRINTDATAHandler
    movlw high SYSSTRINGPARAM1
    movwf SysPRINTDATAHandler_H
    call PRINT109
    movlw 1
    movwf LCDVALUE
    call PRINT110
    clrf LCDLINE
    movlw 40
    movwf LCDCOLUMN
    call LOCATE
    movlw low SYSSTRINGPARAM1
    movwf SysStringB
    movlw high SYSSTRINGPARAM1
    movwf SysStringB_H
    movlw low StringTable7
    movwf SysStringA
    movlw high StringTable7
    movwf SysStringA_H
    call SYSREADSTRING
    movlw low SYSSTRINGPARAM1
    movwf SysPRINTDATAHandler
    movlw high SYSSTRINGPARAM1
    movwf SysPRINTDATAHandler_H
    call PRINT109
    movlw 2
    movwf LCDVALUE
    call PRINT110
    clrf LCDLINE
    movlw 16
    movwf LCDCOLUMN
    call LOCATE
    movlw low SYSSTRINGPARAM1
    movwf SysStringB
    movlw high SYSSTRINGPARAM1
    movwf SysStringB_H
    movlw low StringTable8
    movwf SysStringA
    movlw high StringTable8
    movwf SysStringA_H
    call SYSREADSTRING
    movlw low SYSSTRINGPARAM1
    movwf SysPRINTDATAHandler
    movlw high SYSSTRINGPARAM1
    movwf SysPRINTDATAHandler_H
    call PRINT109
    movlw 3
    movwf LCDVALUE
    call PRINT110
    clrf LCDLINE
    movlw 80
    movwf LCDCOLUMN
    call LOCATE
    movlw low SYSSTRINGPARAM1
    movwf SysStringB
    movlw high SYSSTRINGPARAM1
    movwf SysStringB_H
    movlw low StringTable9
    movwf SysStringA
    movlw high StringTable9
    movwf SysStringA_H
    call SYSREADSTRING
    movlw low SYSSTRINGPARAM1
    movwf SysPRINTDATAHandler
    movlw high SYSSTRINGPARAM1
    movwf SysPRINTDATAHandler_H
    call PRINT109
    movlw 4
    movwf LCDVALUE
    call PRINT110
    movlw 5
    movwf SysWaitTempS
    call Delay_S
    goto SysDoLoop_S1
    SysDoLoop_E1
    goto BASPROGRAMEND
    BASPROGRAMEND
    sleep
    goto BASPROGRAMEND

    ;**************

    CLS
    bcf SYSLCDTEMP,1
    movlw 1
    movwf LCDBYTE
    call LCDNORMALWRITEBYTE
    movlw 4
    movwf SysWaitTempMS
    clrf SysWaitTempMS_H
    call Delay_MS
    movlw 128
    movwf LCDBYTE
    call LCDNORMALWRITEBYTE
    movlw 16
    movwf DELAYTEMP
    DelayUS1
    decfsz DELAYTEMP,F
    goto DelayUS1
    nop
    return

    ;**************

    Delay_10US
    D10US_START
    movlw 2
    movwf DELAYTEMP
    DelayUS0
    decfsz DELAYTEMP,F
    goto DelayUS0
    decfsz SysWaitTemp10US, F
    goto D10US_START
    return

    ;**************

    Delay_MS
    incf SysWaitTempMS_H, F
    DMS_START
    movlw 142
    movwf DELAYTEMP2
    DMS_OUTER
    movlw 1
    movwf DELAYTEMP
    DMS_INNER
    decfsz DELAYTEMP, F
    goto DMS_INNER
    decfsz DELAYTEMP2, F
    goto DMS_OUTER
    decfsz SysWaitTempMS, F
    goto DMS_START
    decfsz SysWaitTempMS_H, F
    goto DMS_START
    return

    ;**************

    Delay_S
    DS_START
    movlw 232
    movwf SysWaitTempMS
    movlw 3
    movwf SysWaitTempMS_H
    call Delay_MS
    decfsz SysWaitTempS, F
    goto DS_START
    return

    ;**************

    FLASH_LED
    movlw 1
    movwf TMRNUMBER
    movlw 50
    movwf TMRVALUE
    clrf TMRVALUE_H
    call SETTIMER176
    clrf SysTemp1
    btfsc PORTA,2
    incf SysTemp1,F
    comf SysTemp1,F
    bcf PORTA,2
    btfsc SysTemp1,0
    bsf PORTA,2
    return

    ;**************

    HSERPRINT306
    movf SysPRINTDATAHandler,W
    movwf FSR
    bcf STATUS, IRP
    btfsc SysPRINTDATAHandler_H,0
    bsf STATUS, IRP
    movf INDF,W
    movwf PRINTLEN
    movf PRINTLEN,F
    btfsc STATUS, Z
    goto ENDIF37
    movlw 1
    movwf SYSPRINTTEMP
    SysForLoop2
    movf SYSPRINTTEMP,W
    addwf SysPRINTDATAHandler,W
    movwf FSR
    bcf STATUS, IRP
    btfsc SysPRINTDATAHandler_H,0
    bsf STATUS, IRP
    movf INDF,W
    movwf SERDATA
    call HSERSEND296
    movf SYSPRINTTEMP,W
    subwf PRINTLEN,W
    movwf SysTemp1
    movwf SysBYTETempA
    clrf SysBYTETempB
    call SYSCOMPEQUAL
    comf SysByteTempX,F
    btfss SysByteTempX,0
    goto ENDIF38
    incf SYSPRINTTEMP,F
    goto SysForLoop2
    ENDIF38
    SysForLoopEnd2
    ENDIF37
    return

    ;**************

    HSERSEND295
    SysWaitLoop1
    btfss PIR1,TXIF
    goto SysWaitLoop1
    SysWaitLoop2
    banksel TXSTA
    btfss TXSTA,TRMT
    goto SysWaitLoop2
    banksel SERDATA
    movf SERDATA,W
    movwf TXREG
    movlw 10
    movwf SysWaitTempMS
    clrf SysWaitTempMS_H
    goto Delay_MS

    ;**************

    HSERSEND296
    HSERSENDUSART1HANDLER
    SysWaitLoop5
    btfss PIR1,TXIF
    goto SysWaitLoop5
    SysWaitLoop6
    banksel TXSTA
    btfss TXSTA,TRMT
    goto SysWaitLoop6
    banksel SERDATA
    movf SERDATA,W
    movwf TXREG
    movlw 10
    movwf SysWaitTempMS
    clrf SysWaitTempMS_H
    goto Delay_MS

    ;**************

    I2CRESTART
    goto I2CSTART

    ;**************

    I2CSEND
    banksel TRISB
    bcf TRISB,1
    banksel PORTB
    bcf PORTB,1
    movlw 8
    movwf SysRepeatTemp2
    SysRepeatLoop2
    btfss I2CBYTE,7
    goto ELSE39_1
    banksel TRISB
    bsf TRISB,0
    goto ENDIF39
    ELSE39_1
    banksel TRISB
    bcf TRISB,0
    banksel PORTB
    bcf PORTB,0
    ENDIF39
    banksel I2CBYTE
    rlf I2CBYTE,F
    banksel TRISB
    bsf TRISB,1
    SysWaitLoop3
    banksel PORTB
    btfss PORTB,1
    goto SysWaitLoop3
    nop
    banksel TRISB
    bcf TRISB,1
    banksel PORTB
    bcf PORTB,1
    decfsz SysRepeatTemp2,F
    goto SysRepeatLoop2
    SysRepeatLoopEnd2
    banksel TRISB
    bsf TRISB,0
    bsf TRISB,1
    SysWaitLoop4
    banksel PORTB
    btfss PORTB,1
    goto SysWaitLoop4
    btfss PORTB,0
    goto ELSE40_1
    clrf I2CACK
    clrf I2CACKPOLLSTATE
    goto ENDIF40
    ELSE40_1
    movlw 255
    movwf I2CACK
    movlw 255
    movwf I2CACKPOLLSTATE
    ENDIF40
    banksel TRISB
    bcf TRISB,1
    banksel PORTB
    bcf PORTB,1
    banksel TRISB
    bcf TRISB,0
    banksel PORTB
    bcf PORTB,0
    return

    ;**************

    I2CSTART
    banksel TRISB
    bsf TRISB,0
    bsf TRISB,1
    bcf TRISB,0
    banksel PORTB
    bcf PORTB,0
    nop
    banksel TRISB
    bcf TRISB,1
    banksel PORTB
    bcf PORTB,1
    return

    ;**************

    I2CSTOP
    banksel TRISB
    bcf TRISB,1
    banksel PORTB
    bcf PORTB,1
    banksel TRISB
    bcf TRISB,0
    banksel PORTB
    bcf PORTB,0
    banksel TRISB
    bsf TRISB,1
    nop
    bsf TRISB,0
    banksel STATUS
    return

    ;**************

    INITI2C
    banksel TRISB
    bsf TRISB,0
    bsf TRISB,1
    banksel I2CMATCH
    clrf I2CMATCH
    return

    ;**************

    INITI2CLCD
    movlw 15
    movwf SysWaitTempMS
    clrf SysWaitTempMS_H
    call Delay_MS
    clrf I2C_LCD_BYTE
    movlw 3
    movwf LCDBYTE
    call LCDNORMALWRITEBYTE
    movlw 5
    movwf SysWaitTempMS
    clrf SysWaitTempMS_H
    call Delay_MS
    movlw 3
    movwf LCDBYTE
    call LCDNORMALWRITEBYTE
    movlw 1
    movwf SysWaitTempMS
    clrf SysWaitTempMS_H
    call Delay_MS
    movlw 3
    movwf LCDBYTE
    call LCDNORMALWRITEBYTE
    movlw 1
    movwf SysWaitTempMS
    clrf SysWaitTempMS_H
    call Delay_MS
    movlw 3
    movwf LCDBYTE
    call LCDNORMALWRITEBYTE
    movlw 1
    movwf SysWaitTempMS
    clrf SysWaitTempMS_H
    call Delay_MS
    movlw 2
    movwf LCDBYTE
    call LCDNORMALWRITEBYTE
    movlw 1
    movwf SysWaitTempMS
    clrf SysWaitTempMS_H
    call Delay_MS
    movlw 40
    movwf LCDBYTE
    call LCDNORMALWRITEBYTE
    movlw 1
    movwf SysWaitTempMS
    clrf SysWaitTempMS_H
    call Delay_MS
    movlw 12
    movwf LCDBYTE
    call LCDNORMALWRITEBYTE
    movlw 1
    movwf SysWaitTempMS
    clrf SysWaitTempMS_H
    call Delay_MS
    movlw 1
    movwf LCDBYTE
    call LCDNORMALWRITEBYTE
    movlw 15
    movwf SysWaitTempMS
    clrf SysWaitTempMS_H
    call Delay_MS
    movlw 6
    movwf LCDBYTE
    call LCDNORMALWRITEBYTE
    movlw 1
    movwf SysWaitTempMS
    clrf SysWaitTempMS_H
    call Delay_MS
    goto CLS

    ;**************

    INITLCD
    ;asm showdebug LCD_IO selected is LCD_IO
    ;asm showdebug LCD_Speed is SLOW
    ;asm showdebug OPTIMAL is set to OPTIMAL
    ;asm showdebug LCD_Speed is set to LCD_Speed
    call INITI2C
    movlw 1
    movwf LCD_BACKLIGHT
    movlw 2
    movwf SysWaitTempMS
    clrf SysWaitTempMS_H
    call Delay_MS
    movlw 2
    movwf SysRepeatTemp1
    SysRepeatLoop1
    movlw 78
    movwf LCD_I2C_ADDRESS_CURRENT
    call INITI2CLCD
    decfsz SysRepeatTemp1,F
    goto SysRepeatLoop1
    SysRepeatLoopEnd1
    movlw 12
    movwf LCD_STATE
    return

    ;**************

    INITSYS
    ;asm showdebug This code block sets the internal oscillator to ChipMHz
    ;asm showdebug OSCCON type is 104' NoBit(SPLLEN) And NoBit(IRCF3) Or Bit(INTSRC)) and ifdef Bit(HFIOFS)
    movlw 143
    banksel OSCCON
    andwf OSCCON,F
    bsf OSCCON,IRCF2
    bsf OSCCON,IRCF1
    bcf OSCCON,IRCF0
    ;asm showdebug _Complete_the_chip_setup_of_BSR,ADCs,ANSEL_and_other_key_setup_registers_or_register_bits
    bcf ADCON1,ADFM
    banksel ADCON0
    bcf ADCON0,ADON
    banksel ANSEL
    clrf ANSEL
    movlw 7
    movwf CMCON
    banksel PORTA
    clrf PORTA
    clrf PORTB
    return

    ;**************

    INITTIMER1
    movf TMRPRES,F
    btfsc STATUS, Z
    goto ENDIF28
    movlw 16
    subwf TMRPRES,W
    btfsc STATUS, Z
    goto ENDIF34
    movlw 32
    subwf TMRPRES,W
    btfsc STATUS, Z
    goto ENDIF35
    movlw 48
    subwf TMRPRES,W
    btfss STATUS, Z
    clrf TMRPRES
    ENDIF35
    ENDIF34
    ENDIF28
    btfsc T1CON,TMR1ON
    bsf TMRPRES,0
    decf TMRSOURCE,W
    btfss STATUS, Z
    goto ENDIF30
    bcf TMRPRES,1
    bcf TMRPRES,3
    ENDIF30
    movlw 2
    subwf TMRSOURCE,W
    btfss STATUS, Z
    goto ENDIF31
    bsf TMRPRES,1
    bcf TMRPRES,3
    ENDIF31
    movlw 3
    subwf TMRSOURCE,W
    btfss STATUS, Z
    goto ENDIF32
    bsf TMRPRES,1
    bsf TMRPRES,3
    ENDIF32
    movlw 4
    subwf TMRSOURCE,W
    btfsc STATUS, Z
    bcf TMRPRES,3
    movf TMRPRES,W
    movwf T1CON
    return

    ;**************

    INITUSART
    movlw 12
    banksel SPBRG
    movwf SPBRG
    bsf TXSTA,BRGH
    bcf TXSTA,SYNC
    bsf TXSTA,TXEN
    banksel RCSTA
    bsf RCSTA,SPEN
    bsf RCSTA,CREN
    return

    ;**************

    LCDBACKLIGHT
    movf LCDTEMP,F
    btfsc STATUS, Z
    clrf LCD_BACKLIGHT
    decf LCDTEMP,W
    btfss STATUS, Z
    goto ENDIF22
    movlw 1
    movwf LCD_BACKLIGHT
    ENDIF22
    bcf SYSLCDTEMP,1
    clrf LCDBYTE
    goto LCDNORMALWRITEBYTE

    ;**************

    LCDNORMALWRITEBYTE
    btfss SYSLCDTEMP,1
    goto ELSE8_1
    bsf I2C_LCD_BYTE,0
    goto ENDIF8
    ELSE8_1
    bcf I2C_LCD_BYTE,0
    ENDIF8
    bcf I2C_LCD_BYTE,1
    bcf I2C_LCD_BYTE,3
    btfsc LCD_BACKLIGHT,0
    bsf I2C_LCD_BYTE,3
    call I2CRESTART
    movf LCD_I2C_ADDRESS_CURRENT,W
    movwf I2CBYTE
    call I2CSEND
    bcf I2C_LCD_BYTE,7
    btfsc LCDBYTE,7
    bsf I2C_LCD_BYTE,7
    bcf I2C_LCD_BYTE,6
    btfsc LCDBYTE,6
    bsf I2C_LCD_BYTE,6
    bcf I2C_LCD_BYTE,5
    btfsc LCDBYTE,5
    bsf I2C_LCD_BYTE,5
    bcf I2C_LCD_BYTE,4
    btfsc LCDBYTE,4
    bsf I2C_LCD_BYTE,4
    bsf I2C_LCD_BYTE,2
    movf I2C_LCD_BYTE,W
    movwf I2CBYTE
    call I2CSEND
    bcf I2C_LCD_BYTE,2
    movf I2C_LCD_BYTE,W
    movwf I2CBYTE
    call I2CSEND
    bcf I2C_LCD_BYTE,7
    btfsc LCDBYTE,3
    bsf I2C_LCD_BYTE,7
    bcf I2C_LCD_BYTE,6
    btfsc LCDBYTE,2
    bsf I2C_LCD_BYTE,6
    bcf I2C_LCD_BYTE,5
    btfsc LCDBYTE,1
    bsf I2C_LCD_BYTE,5
    bcf I2C_LCD_BYTE,4
    btfsc LCDBYTE,0
    bsf I2C_LCD_BYTE,4
    bsf I2C_LCD_BYTE,2
    movf I2C_LCD_BYTE,W
    movwf I2CBYTE
    call I2CSEND
    bcf I2C_LCD_BYTE,2
    movf I2C_LCD_BYTE,W
    movwf I2CBYTE
    call I2CSEND
    call I2CSTOP
    movlw 12
    movwf LCD_STATE
    movlw 13
    movwf DELAYTEMP
    DelayUS2
    decfsz DELAYTEMP,F
    goto DelayUS2
    btfsc SYSLCDTEMP,1
    goto ENDIF9
    movlw 16
    subwf LCDBYTE,W
    btfsc STATUS, C
    goto ENDIF10
    movf LCDBYTE,W
    sublw 7
    btfsc STATUS, C
    goto ENDIF11
    movf LCDBYTE,W
    movwf LCD_STATE
    ENDIF11
    ENDIF10
    ENDIF9
    return

    ;**************

    LOCATE
    bcf SYSLCDTEMP,1
    movf LCDLINE,W
    sublw 1
    btfsc STATUS, C
    goto ENDIF3
    movlw 2
    subwf LCDLINE,F
    movlw 20
    addwf LCDCOLUMN,F
    ENDIF3
    movf LCDLINE,W
    movwf SysBYTETempA
    movlw 64
    movwf SysBYTETempB
    call SYSMULTSUB
    movf LCDCOLUMN,W
    addwf SysBYTETempX,W
    movwf SysTemp1
    movlw 128
    iorwf SysTemp1,W
    movwf LCDBYTE
    call LCDNORMALWRITEBYTE
    movlw 5
    movwf SysWaitTemp10US
    goto Delay_10US

    ;**************

    PRINT109
    movf SysPRINTDATAHandler,W
    movwf FSR
    bcf STATUS, IRP
    btfsc SysPRINTDATAHandler_H,0
    bsf STATUS, IRP
    movf INDF,W
    movwf PRINTLEN
    movf PRINTLEN,F
    btfsc STATUS, Z
    return
    bsf SYSLCDTEMP,1
    movlw 1
    movwf SYSPRINTTEMP
    SysForLoop1
    movf SYSPRINTTEMP,W
    addwf SysPRINTDATAHandler,W
    movwf FSR
    bcf STATUS, IRP
    btfsc SysPRINTDATAHandler_H,0
    bsf STATUS, IRP
    movf INDF,W
    movwf LCDBYTE
    call LCDNORMALWRITEBYTE
    movf SYSPRINTTEMP,W
    subwf PRINTLEN,W
    movwf SysTemp1
    movwf SysBYTETempA
    clrf SysBYTETempB
    call SYSCOMPEQUAL
    comf SysByteTempX,F
    btfss SysByteTempX,0
    goto ENDIF5
    incf SYSPRINTTEMP,F
    goto SysForLoop1
    ENDIF5
    SysForLoopEnd1
    return

    ;**************

    PRINT110
    clrf LCDVALUETEMP
    bsf SYSLCDTEMP,1
    movlw 100
    subwf LCDVALUE,W
    btfss STATUS, C
    goto ENDIF6
    movf LCDVALUE,W
    movwf SysBYTETempA
    movlw 100
    movwf SysBYTETempB
    call SYSDIVSUB
    movf SysBYTETempA,W
    movwf LCDVALUETEMP
    movf SYSCALCTEMPX,W
    movwf LCDVALUE
    movlw 48
    addwf LCDVALUETEMP,W
    movwf LCDBYTE
    call LCDNORMALWRITEBYTE
    ENDIF6
    movf LCDVALUETEMP,W
    movwf SysBYTETempB
    clrf SysBYTETempA
    call SYSCOMPLESSTHAN
    movf SysByteTempX,W
    movwf SysTemp1
    movf LCDVALUE,W
    movwf SysBYTETempA
    movlw 10
    movwf SysBYTETempB
    call SYSCOMPLESSTHAN
    comf SysByteTempX,F
    movf SysTemp1,W
    iorwf SysByteTempX,W
    movwf SysTemp2
    btfss SysTemp2,0
    goto ENDIF7
    movf LCDVALUE,W
    movwf SysBYTETempA
    movlw 10
    movwf SysBYTETempB
    call SYSDIVSUB
    movf SysBYTETempA,W
    movwf LCDVALUETEMP
    movf SYSCALCTEMPX,W
    movwf LCDVALUE
    movlw 48
    addwf LCDVALUETEMP,W
    movwf LCDBYTE
    call LCDNORMALWRITEBYTE
    ENDIF7
    movlw 48
    addwf LCDVALUE,W
    movwf LCDBYTE
    goto LCDNORMALWRITEBYTE

    ;**************

    SETTIMER176
    goto SETTIMER177

    ;**************

    SETTIMER177
    movf TMRNUMBER,F
    btfss STATUS, Z
    goto ENDIF25
    movf TMRVALUE,W
    movwf TMR0
    return
    ENDIF25
    decf TMRNUMBER,W
    btfss STATUS, Z
    goto ENDIF26
    movf TMRVALUE_H,W
    movwf TMR1H
    movf TMRVALUE,W
    movwf TMR1L
    ENDIF26
    movlw 2
    subwf TMRNUMBER,W
    btfss STATUS, Z
    goto ENDIF27
    movf TMRVALUE,W
    movwf TMR2
    ENDIF27
    return

    ;**************

    STARTTIMER
    decf TMRNUMBER,W
    btfsc STATUS, Z
    bsf T1CON,TMR1ON
    movlw 2
    subwf TMRNUMBER,W
    btfsc STATUS, Z
    bsf T2CON,TMR2ON
    return

    ;**************

    SYSCOMPEQUAL
    clrf SYSBYTETEMPX
    movf SYSBYTETEMPA, W
    subwf SYSBYTETEMPB, W
    btfsc STATUS, Z
    comf SYSBYTETEMPX,F
    return

    ;**************

    SYSCOMPLESSTHAN
    clrf SYSBYTETEMPX
    bsf STATUS, C
    movf SYSBYTETEMPB, W
    subwf SYSBYTETEMPA, W
    btfss STATUS, C
    comf SYSBYTETEMPX,F
    return

    ;**************

    SYSDIVSUB
    movf SYSBYTETEMPB, F
    btfsc STATUS, Z
    return
    clrf SYSBYTETEMPX
    movlw 8
    movwf SYSDIVLOOP
    SYSDIV8START
    bcf STATUS, C
    rlf SYSBYTETEMPA, F
    rlf SYSBYTETEMPX, F
    movf SYSBYTETEMPB, W
    subwf SYSBYTETEMPX, F
    bsf SYSBYTETEMPA, 0
    btfsc STATUS, C
    goto DIV8NOTNEG
    bcf SYSBYTETEMPA, 0
    movf SYSBYTETEMPB, W
    addwf SYSBYTETEMPX, F
    DIV8NOTNEG
    decfsz SYSDIVLOOP, F
    goto SYSDIV8START
    return

    ;**************

    SYSMULTSUB
    clrf SYSBYTETEMPX
    MUL8LOOP
    movf SYSBYTETEMPA, W
    btfsc SYSBYTETEMPB, 0
    addwf SYSBYTETEMPX, F
    bcf STATUS, C
    rrf SYSBYTETEMPB, F
    bcf STATUS, C
    rlf SYSBYTETEMPA, F
    movf SYSBYTETEMPB, F
    btfss STATUS, Z
    goto MUL8LOOP
    return

    ;**************

    SYSREADSTRING
    movf SYSSTRINGB, W
    movwf FSR
    bcf STATUS, IRP
    btfsc SYSSTRINGB_H, 0
    bsf STATUS, IRP
    call SYSSTRINGTABLES
    movwf SYSCALCTEMPA
    movwf INDF
    addwf SYSSTRINGB, F
    goto SYSSTRINGREADCHECK
    SYSREADSTRINGPART
    movf SYSSTRINGB, W
    movwf FSR
    bcf STATUS, IRP
    btfsc SYSSTRINGB_H, 0
    bsf STATUS, IRP
    call SYSSTRINGTABLES
    movwf SYSCALCTEMPA
    addwf SYSSTRINGLENGTH,F
    addwf SYSSTRINGB,F
    SYSSTRINGREADCHECK
    movf SYSCALCTEMPA,F
    btfsc STATUS,Z
    return
    SYSSTRINGREAD
    call SYSSTRINGTABLES
    incf FSR, F
    movwf INDF
    decfsz SYSCALCTEMPA, F
    goto SYSSTRINGREAD
    return

    ;**************

    SysStringTables
    movf SysStringA_H,W
    movwf PCLATH
    movf SysStringA,W
    incf SysStringA,F
    btfsc STATUS,Z
    incf SysStringA_H,F
    movwf PCL

    StringTable1
    retlw 11
    retlw 76 ;L
    retlw 111 ;o
    retlw 99 ;c
    retlw 97 ;a
    retlw 116 ;t
    retlw 101 ;e
    retlw 32 ;
    retlw 48 ;0
    retlw 44 ;,
    retlw 52 ;4
    retlw 48 ;0

    StringTable2
    retlw 16
    retlw 68 ;D
    retlw 73 ;I
    retlw 83 ;S
    retlw 80 ;P
    retlw 76 ;L
    retlw 65 ;A
    retlw 89 ;Y
    retlw 32 ;
    retlw 79 ;O
    retlw 78 ;N
    retlw 32 ;
    retlw 49 ;1
    retlw 32 ;
    retlw 114 ;r
    retlw 111 ;o
    retlw 119 ;w

    StringTable3
    retlw 16
    retlw 68 ;D
    retlw 73 ;I
    retlw 83 ;S
    retlw 80 ;P
    retlw 76 ;L
    retlw 65 ;A
    retlw 89 ;Y
    retlw 32 ;
    retlw 79 ;O
    retlw 78 ;N
    retlw 32 ;
    retlw 50 ;2
    retlw 32 ;
    retlw 114 ;r
    retlw 111 ;o
    retlw 119 ;w

    StringTable4
    retlw 16
    retlw 68 ;D
    retlw 73 ;I
    retlw 83 ;S
    retlw 80 ;P
    retlw 76 ;L
    retlw 65 ;A
    retlw 89 ;Y
    retlw 32 ;
    retlw 79 ;O
    retlw 78 ;N
    retlw 32 ;
    retlw 51 ;3
    retlw 32 ;
    retlw 114 ;r
    retlw 111 ;o
    retlw 119 ;w

    StringTable5
    retlw 16
    retlw 68 ;D
    retlw 73 ;I
    retlw 83 ;S
    retlw 80 ;P
    retlw 76 ;L
    retlw 65 ;A
    retlw 89 ;Y
    retlw 32 ;
    retlw 79 ;O
    retlw 78 ;N
    retlw 32 ;
    retlw 52 ;4
    retlw 32 ;
    retlw 114 ;r
    retlw 111 ;o
    retlw 119 ;w

    StringTable6
    retlw 9
    retlw 32 ;
    retlw 32 ;
    retlw 32 ;
    retlw 32 ;
    retlw 32 ;
    retlw 120 ;x
    retlw 32 ;
    retlw 49 ;1
    retlw 32 ;

    StringTable7
    retlw 8
    retlw 32 ;
    retlw 32 ;
    retlw 32 ;
    retlw 51 ;3
    retlw 32 ;
    retlw 32 ;
    retlw 50 ;2
    retlw 32 ;

    StringTable8
    retlw 9
    retlw 32 ;
    retlw 32 ;
    retlw 50 ;2
    retlw 32 ;
    retlw 32 ;
    retlw 32 ;
    retlw 32 ;
    retlw 51 ;3
    retlw 32 ;

    StringTable9
    retlw 13
    retlw 32 ;
    retlw 32 ;
    retlw 32 ;
    retlw 32 ;
    retlw 32 ;
    retlw 32 ;
    retlw 54 ;6
    retlw 32 ;
    retlw 79 ;O
    retlw 78 ;N
    retlw 32 ;
    retlw 52 ;4
    retlw 32 ;

    ;**************

    ;Start of program memory page 1
    ORG 2048

    END

     
    • Anobium

      Anobium - 2023-02-09

      @RomTek... attach next time. Please.

       
  • Anobium

    Anobium - 2023-02-08

    Please remove the interrupt, before I investigate. What happens?

     
    • Romtek

      Romtek - 2023-02-09

      Hi, I modified the program (removing the serial and interrupt) but the result changed slightly.
      Let me explain: the same listing on avr8515 does not display correctly and is missing on the second line, both with 2-line and 4-line display.
      On pic16f88 it writes correctly on the display, but not on the 4-line display.
      thanks for now

      ;Chip Settings
       #chip mega8515, 4
      #include <pcf8574.h>
      
        ; ----- Define Hardware settings
        ' Define I2C settings - CHANGE PORTS
         #define I2C_MODE Master
         #define I2C_DATA PORTC.4 'pin 25
         #define I2C_CLOCK PORTC.3 'pin 24
         #define I2C_DISABLE_INTERRUPTS ON
         'Optionally, you can reduce the I2C timings.
         #define I2C_BIT_DELAY 0 us
         #define I2C_CLOCK_DELAY 1 us
         #define I2C_END_DELAY 0 us
      
        '''Set up LCD
         #define LCD_IO 10
         #define LCD_SPEED FAST
         #define LCD_Backlight_On_State  1
         #define LCD_Backlight_Off_State 0
      
      wait 1 s
      
          Do Forever
              cls
              locate 0,0
              PRINT "DISPLAY ON 1 row"
      
              locate 1,0 '2 row
              PRINT "DISPLAY ON 2 row"
      
              locate 2,0  '3 row
              PRINT "DISPLAY ON 3 row"
      
              locate 3,0 '4 row
              PRINT "DISPLAY ON 4 row"
      
              wait 3 s
      
          loop
      end 'end prog
      

      file asm

      ;Program compiled by Great Cow BASIC (1.00.00 2023-01-01 (Windows 64 bit) : Build 1213) for Microchip AVR Assembler using FreeBASIC 1.07.1/2023-01-02 CRC64
      ;Need help? 
      ;  See the GCBASIC forums at http://sourceforge.net/projects/gcbasic/forums,
      ;  Check the documentation and Help at http://gcbasic.sourceforge.net/help/,
      ;or, email us:
      ;   w_cholmondeley at users dot sourceforge dot net
      ;   evanvennn at users dot sourceforge dot net
      
      ;********************************************************************************
      
      ;Chip Model: MEGA8515
      ;Assembler header file
      .INCLUDE "m8515def.inc"
      
      ;SREG bit names (for AVR Assembler compatibility, GCBASIC uses different names)
      #define C 0
      #define H 5
      #define I 7
      #define N 2
      #define S 4
      #define T 6
      #define V 3
      #define Z 1
      
      ;********************************************************************************
      
      ;Set aside memory locations for variables
      .EQU    I2CACK=113           ; 0x71
      .EQU    I2CACKPOLLSTATE=114          ; 0x72
      .EQU    I2CBYTE=115          ; 0x73
      .EQU    I2CMATCH=116             ; 0x74
      .EQU    I2CSTATE=117             ; 0x75
      .EQU    I2C_LCD_BYTE=118             ; 0x76
      .EQU    LCDBYTE=119          ; 0x77
      .EQU    LCDCOLUMN=120            ; 0x78
      .EQU    LCDLINE=121          ; 0x79
      .EQU    LCD_BACKLIGHT=122            ; 0x7A
      .EQU    LCD_I2C_ADDRESS_CURRENT=123          ; 0x7B
      .EQU    LCD_STATE=124            ; 0x7C
      .EQU    PRINTLEN=125             ; 0x7D
      .EQU    STRINGPOINTER=126            ; 0x7E
      .EQU    SYSLCDTEMP=127           ; 0x7F
      .EQU    SYSPRINTDATAHANDLER=128          ; 0x80
      .EQU    SYSPRINTDATAHANDLER_H=129            ; 0x81
      .EQU    SYSPRINTTEMP=130             ; 0x82
      .EQU    SYSREPEATTEMP1=131           ; 0x83
      .EQU    SYSREPEATTEMP2=132           ; 0x84
      .EQU    SYSSTRINGPARAM1=96           ; 0x60
      
      ;********************************************************************************
      
      ;Register variables
      .DEF    DELAYTEMP=r25
      .DEF    DELAYTEMP2=r26
      .DEF    SYSBITTEST=r5
      .DEF    SYSBYTETEMPA=r22
      .DEF    SYSBYTETEMPB=r28
      .DEF    SYSBYTETEMPX=r0
      .DEF    SYSCALCTEMPA=r22
      .DEF    SYSCALCTEMPB=r28
      .DEF    SYSCALCTEMPX=r0
      .DEF    SYSREADA=r30
      .DEF    SYSREADA_H=r31
      .DEF    SYSSTRINGA=r26
      .DEF    SYSSTRINGA_H=r27
      .DEF    SYSSTRINGB=r28
      .DEF    SYSSTRINGB_H=r29
      .DEF    SYSSTRINGLENGTH=r25
      .DEF    SYSVALUECOPY=r21
      .DEF    SYSWAITTEMP10US=r27
      .DEF    SYSWAITTEMPMS=r29
      .DEF    SYSWAITTEMPMS_H=r30
      .DEF    SYSWAITTEMPS=r31
      .DEF    SYSWAITTEMPUS=r27
      .DEF    SYSWAITTEMPUS_H=r28
      .DEF    SYSTEMP1=r1
      .DEF    SYSTEMP2=r16
      .DEF    SYSTEMP3=r2
      
      ;********************************************************************************
      
      ;Vectors
      ;Interrupt vectors
      .ORG    0
          rjmp    BASPROGRAMSTART ;Reset
      .ORG    1
          reti    ;INT0
      .ORG    2
          reti    ;INT1
      .ORG    3
          reti    ;TIMER1_CAPT
      .ORG    4
          reti    ;TIMER1_COMPA
      .ORG    5
          reti    ;TIMER1_COMPB
      .ORG    6
          reti    ;TIMER1_OVF
      .ORG    7
          reti    ;TIMER0_OVF
      .ORG    8
          reti    ;SPI_STC
      .ORG    9
          reti    ;USART_RX
      .ORG    10
          reti    ;USART_UDRE
      .ORG    11
          reti    ;USART_TX
      .ORG    12
          reti    ;ANA_COMP
      .ORG    13
          reti    ;INT2
      .ORG    14
          reti    ;TIMER0_COMP
      .ORG    15
          reti    ;EE_RDY
      .ORG    16
          reti    ;SPM_RDY
      
      ;********************************************************************************
      
      ;Start of program memory page 0
      .ORG    18
      BASPROGRAMSTART:
      ;Initialise stack
          ldi SysValueCopy,high(RAMEND)
          out SPH, SysValueCopy
          ldi SysValueCopy,low(RAMEND)
          out SPL, SysValueCopy
      ;Call initialisation routines
          rcall   INITSYS
          rcall   INITI2C
          rcall   INITLCD
      
      ;Start of the main program
          ldi SysWaitTempS,1
          rcall   Delay_S
      SysDoLoop_S1:
          rcall   lbCLS
          ldi SysValueCopy,0
          sts LCDLINE,SysValueCopy
          ldi SysValueCopy,0
          sts LCDCOLUMN,SysValueCopy
          rcall   LOCATE
          ldi SysStringB,low(SYSSTRINGPARAM1)
          ldi SysStringB_H,high(SYSSTRINGPARAM1)
          ldi SysReadA,low(StringTable1<<1)
          ldi SysReadA_H,high(StringTable1<<1)
          rcall   SYSREADSTRING
          ldi SysValueCopy,low(SYSSTRINGPARAM1)
          sts SysPRINTDATAHandler,SysValueCopy
          ldi SysValueCopy,high(SYSSTRINGPARAM1)
          sts SysPRINTDATAHandler_H,SysValueCopy
          rcall   PRINT108
          ldi SysValueCopy,1
          sts LCDLINE,SysValueCopy
          ldi SysValueCopy,0
          sts LCDCOLUMN,SysValueCopy
          rcall   LOCATE
          ldi SysStringB,low(SYSSTRINGPARAM1)
          ldi SysStringB_H,high(SYSSTRINGPARAM1)
          ldi SysReadA,low(StringTable2<<1)
          ldi SysReadA_H,high(StringTable2<<1)
          rcall   SYSREADSTRING
          ldi SysValueCopy,low(SYSSTRINGPARAM1)
          sts SysPRINTDATAHandler,SysValueCopy
          ldi SysValueCopy,high(SYSSTRINGPARAM1)
          sts SysPRINTDATAHandler_H,SysValueCopy
          rcall   PRINT108
          ldi SysValueCopy,2
          sts LCDLINE,SysValueCopy
          ldi SysValueCopy,0
          sts LCDCOLUMN,SysValueCopy
          rcall   LOCATE
          ldi SysStringB,low(SYSSTRINGPARAM1)
          ldi SysStringB_H,high(SYSSTRINGPARAM1)
          ldi SysReadA,low(StringTable3<<1)
          ldi SysReadA_H,high(StringTable3<<1)
          rcall   SYSREADSTRING
          ldi SysValueCopy,low(SYSSTRINGPARAM1)
          sts SysPRINTDATAHandler,SysValueCopy
          ldi SysValueCopy,high(SYSSTRINGPARAM1)
          sts SysPRINTDATAHandler_H,SysValueCopy
          rcall   PRINT108
          ldi SysValueCopy,3
          sts LCDLINE,SysValueCopy
          ldi SysValueCopy,0
          sts LCDCOLUMN,SysValueCopy
          rcall   LOCATE
          ldi SysStringB,low(SYSSTRINGPARAM1)
          ldi SysStringB_H,high(SYSSTRINGPARAM1)
          ldi SysReadA,low(StringTable4<<1)
          ldi SysReadA_H,high(StringTable4<<1)
          rcall   SYSREADSTRING
          ldi SysValueCopy,low(SYSSTRINGPARAM1)
          sts SysPRINTDATAHandler,SysValueCopy
          ldi SysValueCopy,high(SYSSTRINGPARAM1)
          sts SysPRINTDATAHandler_H,SysValueCopy
          rcall   PRINT108
          ldi SysWaitTempS,3
          rcall   Delay_S
          rjmp    SysDoLoop_S1
      SysDoLoop_E1:
          rjmp    BASPROGRAMEND
      BASPROGRAMEND:
          sleep
          rjmp    BASPROGRAMEND
      
      ;********************************************************************************
      
      lbCLS:
          lds SysValueCopy,SYSLCDTEMP
          cbr SysValueCopy,1<<1
          sts SYSLCDTEMP,SysValueCopy
          ldi SysValueCopy,1
          sts LCDBYTE,SysValueCopy
          rcall   LCDNORMALWRITEBYTE
          ldi SysWaitTempMS,4
          ldi SysWaitTempMS_H,0
          rcall   Delay_MS
          ldi SysValueCopy,128
          sts LCDBYTE,SysValueCopy
          rcall   LCDNORMALWRITEBYTE
          ldi DELAYTEMP,66
      DelayUS1:
          dec DELAYTEMP
          brne    DelayUS1
          rjmp    PC + 1
          ret
      
      ;********************************************************************************
      
      Delay_10US:
      D10US_START:
          ldi DELAYTEMP,12
      DelayUS0:
          dec DELAYTEMP
          brne    DelayUS0
          nop
          dec SysWaitTemp10US
          brne    D10US_START
          ret
      
      ;********************************************************************************
      
      Delay_MS:
          inc SysWaitTempMS_H
      DMS_START:
          ldi DELAYTEMP2,43
      DMS_OUTER:
          ldi DELAYTEMP,30
      DMS_INNER:
          dec DELAYTEMP
          brne    DMS_INNER
          dec DELAYTEMP2
          brne    DMS_OUTER
          dec SysWaitTempMS
          brne    DMS_START
          dec SysWaitTempMS_H
          brne    DMS_START
          ret
      
      ;********************************************************************************
      
      Delay_S:
      DS_START:
          ldi SysWaitTempMS,232
          ldi SysWaitTempMS_H,3
          rcall   Delay_MS
          dec SysWaitTempS
          brne    DS_START
          ret
      
      ;********************************************************************************
      
      I2CRESTART:
          rjmp    I2CSTART
      
      ;********************************************************************************
      
      I2CSEND:
          sbi DDRC,3
          cbi PORTC,3
          ldi SysValueCopy,8
          sts SysRepeatTemp2,SysValueCopy
      SysRepeatLoop2:
          lds SysBitTest,I2CBYTE
          sbrs    SysBitTest,7
          rjmp    ELSE8_1
          cbi DDRC,4
          rjmp    ENDIF8
      ELSE8_1:
          sbi DDRC,4
          cbi PORTC,4
      ENDIF8:
          lds SysValueCopy,I2CBYTE
          rol SysValueCopy
          sts I2CBYTE,SysValueCopy
          cbi DDRC,3
      SysWaitLoop1:
          sbis    PINC,3
          rjmp    SysWaitLoop1
          rjmp    PC + 1
          rjmp    PC + 1
          sbi DDRC,3
          cbi PORTC,3
          lds SysTemp1,SysRepeatTemp2
          dec SysTemp1
          sts SysRepeatTemp2,SysTemp1
          brne    SysRepeatLoop2
      SysRepeatLoopEnd2:
          cbi DDRC,4
          cbi DDRC,3
      SysWaitLoop2:
          sbis    PINC,3
          rjmp    SysWaitLoop2
          sbis    PINC,4
          rjmp    ELSE9_1
          ldi SysValueCopy,0
          sts I2CACK,SysValueCopy
          ldi SysValueCopy,0
          sts I2CACKPOLLSTATE,SysValueCopy
          rjmp    ENDIF9
      ELSE9_1:
          ldi SysValueCopy,255
          sts I2CACK,SysValueCopy
          ldi SysValueCopy,255
          sts I2CACKPOLLSTATE,SysValueCopy
      ENDIF9:
          sbi DDRC,3
          cbi PORTC,3
          sbi DDRC,4
          cbi PORTC,4
          ret
      
      ;********************************************************************************
      
      I2CSTART:
          cbi DDRC,4
          cbi DDRC,3
          sbi DDRC,4
          cbi PORTC,4
          rjmp    PC + 1
          rjmp    PC + 1
          sbi DDRC,3
          cbi PORTC,3
          ret
      
      ;********************************************************************************
      
      I2CSTOP:
          sbi DDRC,3
          cbi PORTC,3
          sbi DDRC,4
          cbi PORTC,4
          cbi DDRC,3
          rjmp    PC + 1
          rjmp    PC + 1
          cbi DDRC,4
          ret
      
      ;********************************************************************************
      
      INITI2C:
          cbi DDRC,4
          cbi DDRC,3
          ldi SysValueCopy,0
          sts I2CMATCH,SysValueCopy
          ret
      
      ;********************************************************************************
      
      INITI2CLCD:
          ldi SysWaitTempMS,15
          ldi SysWaitTempMS_H,0
          rcall   Delay_MS
          ldi SysValueCopy,0
          sts I2C_LCD_BYTE,SysValueCopy
          ldi SysValueCopy,3
          sts LCDBYTE,SysValueCopy
          rcall   LCDNORMALWRITEBYTE
          ldi SysWaitTempMS,5
          ldi SysWaitTempMS_H,0
          rcall   Delay_MS
          ldi SysValueCopy,3
          sts LCDBYTE,SysValueCopy
          rcall   LCDNORMALWRITEBYTE
          ldi SysWaitTempMS,1
          ldi SysWaitTempMS_H,0
          rcall   Delay_MS
          ldi SysValueCopy,3
          sts LCDBYTE,SysValueCopy
          rcall   LCDNORMALWRITEBYTE
          ldi SysWaitTempMS,1
          ldi SysWaitTempMS_H,0
          rcall   Delay_MS
          ldi SysValueCopy,3
          sts LCDBYTE,SysValueCopy
          rcall   LCDNORMALWRITEBYTE
          ldi SysWaitTempMS,1
          ldi SysWaitTempMS_H,0
          rcall   Delay_MS
          ldi SysValueCopy,2
          sts LCDBYTE,SysValueCopy
          rcall   LCDNORMALWRITEBYTE
          ldi SysWaitTempMS,1
          ldi SysWaitTempMS_H,0
          rcall   Delay_MS
          ldi SysValueCopy,40
          sts LCDBYTE,SysValueCopy
          rcall   LCDNORMALWRITEBYTE
          ldi SysWaitTempMS,1
          ldi SysWaitTempMS_H,0
          rcall   Delay_MS
          ldi SysValueCopy,12
          sts LCDBYTE,SysValueCopy
          rcall   LCDNORMALWRITEBYTE
          ldi SysWaitTempMS,1
          ldi SysWaitTempMS_H,0
          rcall   Delay_MS
          ldi SysValueCopy,1
          sts LCDBYTE,SysValueCopy
          rcall   LCDNORMALWRITEBYTE
          ldi SysWaitTempMS,15
          ldi SysWaitTempMS_H,0
          rcall   Delay_MS
          ldi SysValueCopy,6
          sts LCDBYTE,SysValueCopy
          rcall   LCDNORMALWRITEBYTE
          ldi SysWaitTempMS,1
          ldi SysWaitTempMS_H,0
          rcall   Delay_MS
          rjmp    lbCLS
      
      ;********************************************************************************
      
      INITLCD:
      ;asm showdebug  `LCD_IO selected is ` LCD_IO
      ;asm showdebug  `LCD_Speed is FAST`
      ;asm showdebug  `OPTIMAL is set to ` OPTIMAL
      ;asm showdebug  `LCD_Speed is set to ` LCD_Speed
          rcall   INITI2C
          ldi SysValueCopy,1
          sts LCD_BACKLIGHT,SysValueCopy
          ldi SysWaitTempMS,2
          ldi SysWaitTempMS_H,0
          rcall   Delay_MS
          ldi SysValueCopy,2
          sts SysRepeatTemp1,SysValueCopy
      SysRepeatLoop1:
          ldi SysValueCopy,78
          sts LCD_I2C_ADDRESS_CURRENT,SysValueCopy
          rcall   INITI2CLCD
          lds SysTemp1,SysRepeatTemp1
          dec SysTemp1
          sts SysRepeatTemp1,SysTemp1
          brne    SysRepeatLoop1
      SysRepeatLoopEnd1:
          ldi SysValueCopy,12
          sts LCD_STATE,SysValueCopy
          ret
      
      ;********************************************************************************
      
      INITSYS:
          ldi SysValueCopy,0
          out PORTA,SysValueCopy
          ldi SysValueCopy,0
          out PORTB,SysValueCopy
          ldi SysValueCopy,0
          out PORTC,SysValueCopy
          ldi SysValueCopy,0
          out PORTD,SysValueCopy
          ldi SysValueCopy,0
          out PORTE,SysValueCopy
          ret
      
      ;********************************************************************************
      
      LCDNORMALWRITEBYTE:
          lds SysBitTest,SYSLCDTEMP
          sbrs    SysBitTest,1
          rjmp    ELSE4_1
          lds SysValueCopy,I2C_LCD_BYTE
          sbr SysValueCopy,1<<0
          sts I2C_LCD_BYTE,SysValueCopy
          rjmp    ENDIF4
      ELSE4_1:
          lds SysValueCopy,I2C_LCD_BYTE
          cbr SysValueCopy,1<<0
          sts I2C_LCD_BYTE,SysValueCopy
      ENDIF4:
          lds SysValueCopy,I2C_LCD_BYTE
          cbr SysValueCopy,1<<1
          sts I2C_LCD_BYTE,SysValueCopy
          cbr SysValueCopy,1<<3
          lds SysBitTest,LCD_BACKLIGHT
          sbrc    SysBitTest,0
          sbr SysValueCopy,1<<3
          sts I2C_LCD_BYTE,SysValueCopy
          rcall   I2CRESTART
          lds SysValueCopy,LCD_I2C_ADDRESS_CURRENT
          sts I2CBYTE,SysValueCopy
          rcall   I2CSEND
          lds SysValueCopy,I2C_LCD_BYTE
          cbr SysValueCopy,1<<7
          lds SysBitTest,LCDBYTE
          sbrc    SysBitTest,7
          sbr SysValueCopy,1<<7
          sts I2C_LCD_BYTE,SysValueCopy
          cbr SysValueCopy,1<<6
          lds SysBitTest,LCDBYTE
          sbrc    SysBitTest,6
          sbr SysValueCopy,1<<6
          sts I2C_LCD_BYTE,SysValueCopy
          cbr SysValueCopy,1<<5
          lds SysBitTest,LCDBYTE
          sbrc    SysBitTest,5
          sbr SysValueCopy,1<<5
          sts I2C_LCD_BYTE,SysValueCopy
          cbr SysValueCopy,1<<4
          lds SysBitTest,LCDBYTE
          sbrc    SysBitTest,4
          sbr SysValueCopy,1<<4
          sts I2C_LCD_BYTE,SysValueCopy
          sbr SysValueCopy,1<<2
          sts I2C_LCD_BYTE,SysValueCopy
          sts I2CBYTE,SysValueCopy
          rcall   I2CSEND
          lds SysValueCopy,I2C_LCD_BYTE
          cbr SysValueCopy,1<<2
          sts I2C_LCD_BYTE,SysValueCopy
          sts I2CBYTE,SysValueCopy
          rcall   I2CSEND
          lds SysValueCopy,I2C_LCD_BYTE
          cbr SysValueCopy,1<<7
          lds SysBitTest,LCDBYTE
          sbrc    SysBitTest,3
          sbr SysValueCopy,1<<7
          sts I2C_LCD_BYTE,SysValueCopy
          cbr SysValueCopy,1<<6
          lds SysBitTest,LCDBYTE
          sbrc    SysBitTest,2
          sbr SysValueCopy,1<<6
          sts I2C_LCD_BYTE,SysValueCopy
          cbr SysValueCopy,1<<5
          lds SysBitTest,LCDBYTE
          sbrc    SysBitTest,1
          sbr SysValueCopy,1<<5
          sts I2C_LCD_BYTE,SysValueCopy
          cbr SysValueCopy,1<<4
          lds SysBitTest,LCDBYTE
          sbrc    SysBitTest,0
          sbr SysValueCopy,1<<4
          sts I2C_LCD_BYTE,SysValueCopy
          sbr SysValueCopy,1<<2
          sts I2C_LCD_BYTE,SysValueCopy
          sts I2CBYTE,SysValueCopy
          rcall   I2CSEND
          lds SysValueCopy,I2C_LCD_BYTE
          cbr SysValueCopy,1<<2
          sts I2C_LCD_BYTE,SysValueCopy
          sts I2CBYTE,SysValueCopy
          rcall   I2CSEND
          rcall   I2CSTOP
          ldi SysValueCopy,12
          sts LCD_STATE,SysValueCopy
          ldi DELAYTEMP,13
      DelayUS2:
          dec DELAYTEMP
          brne    DelayUS2
          nop
          lds SysBitTest,SYSLCDTEMP
          sbrc    SysBitTest,1
          rjmp    ENDIF5
          lds SysCalcTempA,LCDBYTE
          cpi SysCalcTempA,16
          brsh    ENDIF6
          ldi SysCalcTempA,7
          lds SysCalcTempB,LCDBYTE
          cp  SysCalcTempA,SysCalcTempB
          brsh    ENDIF7
          lds SysValueCopy,LCDBYTE
          sts LCD_STATE,SysValueCopy
      ENDIF7:
      ENDIF6:
      ENDIF5:
          ret
      
      ;********************************************************************************
      
      LOCATE:
          lds SysValueCopy,SYSLCDTEMP
          cbr SysValueCopy,1<<1
          sts SYSLCDTEMP,SysValueCopy
          ldi SysCalcTempA,1
          lds SysCalcTempB,LCDLINE
          cp  SysCalcTempA,SysCalcTempB
          brsh    ENDIF1
          lds SysTemp1,LCDLINE
          ldi SysTemp2,2
          sub SysTemp1,SysTemp2
          sts LCDLINE,SysTemp1
          lds SysTemp1,LCDCOLUMN
          ldi SysTemp2,20
          add SysTemp1,SysTemp2
          sts LCDCOLUMN,SysTemp1
      ENDIF1:
          lds SysBYTETempA,LCDLINE
          ldi SysBYTETempB,64
          mul SysByteTempA,SysByteTempB
          mov SysTemp2,SysByteTempX
          lds SysTemp3,LCDCOLUMN
          add SysTemp2,SysTemp3
          mov SysTemp1,SysTemp2
          ldi SysTemp2,128
          or  SysTemp1,SysTemp2
          sts LCDBYTE,SysTemp1
          rcall   LCDNORMALWRITEBYTE
          ldi SysWaitTemp10US,5
          rjmp    Delay_10US
      
      ;********************************************************************************
      
      PRINT108:
          lds SysStringA,SysPRINTDATAHandler
          lds SysStringA_H,SysPRINTDATAHandler_H
          ld  SysValueCopy,X
          sts PRINTLEN,SysValueCopy
          lds SysCalcTempA,PRINTLEN
          tst SysCalcTempA
          brne    ENDIF2
          ret
      ENDIF2:
          lds SysValueCopy,SYSLCDTEMP
          sbr SysValueCopy,1<<1
          sts SYSLCDTEMP,SysValueCopy
          ldi SysValueCopy,1
          sts SYSPRINTTEMP,SysValueCopy
      SysForLoop1:
          lds SysTemp1,SysPRINTDATAHandler
          lds SysTemp3,SYSPRINTTEMP
          add SysTemp1,SysTemp3
          mov SysStringA,SysTemp1
          lds SysTemp1,SysPRINTDATAHandler_H
          ldi SysTemp2,0
          adc SysTemp1,SysTemp2
          mov SysStringA_H,SysTemp1
          ld  SysValueCopy,X
          sts LCDBYTE,SysValueCopy
          rcall   LCDNORMALWRITEBYTE
          lds SysTemp3,PRINTLEN
          lds SysTemp2,SYSPRINTTEMP
          sub SysTemp3,SysTemp2
          mov SysTemp1,SysTemp3
          mov SysBYTETempA,SysTemp1
          ldi SysBYTETempB,0
          rcall   SYSCOMPEQUAL
          com SysByteTempX
          sbrs    SysByteTempX,0
          rjmp    ENDIF3
          lds SysTemp1,SYSPRINTTEMP
          inc SysTemp1
          sts SYSPRINTTEMP,SysTemp1
          rjmp    SysForLoop1
      ENDIF3:
      SysForLoopEnd1:
          ret
      
      ;********************************************************************************
      
      SYSCOMPEQUAL:
          clr SYSBYTETEMPX
          cpse    SYSBYTETEMPA, SYSBYTETEMPB
          ret
          com SYSBYTETEMPX
          ret
      
      ;********************************************************************************
      
      SYSREADSTRING:
          lpm
          mov SYSCALCTEMPA, SYSCALCTEMPX
          inc SYSREADA
          brne    PC + 2
          inc SYSREADA_H
          st  Y+, SYSCALCTEMPA
          rjmp    SYSSTRINGREADCHECK
      SYSREADSTRINGPART:
          lpm
          mov SYSCALCTEMPA, SYSCALCTEMPX
          inc SYSREADA
          brne    PC + 2
          inc SYSREADA_H
          add SYSSTRINGLENGTH, SYSCALCTEMPA
      SYSSTRINGREADCHECK:
          cpi SYSCALCTEMPA, 0
          brne    SYSSTRINGREAD
          ret
      SYSSTRINGREAD:
          lpm
          inc SYSREADA
          brne    PC + 2
          inc SYSREADA_H
          st  Y+, SYSCALCTEMPX
          dec SYSCALCTEMPA
          brne    SYSSTRINGREAD
          ret
      
      ;********************************************************************************
      
      SysStringTables:
      
      StringTable1:
      .DB 16,68,73,83,80,76,65,89,32,79,78,32,49,32,114,111,119,0
      
      
      StringTable2:
      .DB 16,68,73,83,80,76,65,89,32,79,78,32,50,32,114,111,119,0
      
      
      StringTable3:
      .DB 16,68,73,83,80,76,65,89,32,79,78,32,51,32,114,111,119,0
      
      
      StringTable4:
      .DB 16,68,73,83,80,76,65,89,32,79,78,32,52,32,114,111,119,0
      
      
      ;********************************************************************************
      
       
  • jackjames

    jackjames - 2023-02-09

    I wrote this routine in mikrobasic and it works perfectly with a 20x4 display.
    I hope it can be useful. 1 for row 1 and col 1

    Sub Procedure Locate (Dim LCDLine, LCDColumn As Byte)
            Const LCD_WIDTH = 20 ' Columns
    '       -
            LCDLine   = LCDLine -1
            LCDColumn = LCDColumn -1
    '       -
            If LCDLine > 1 Then
               LCDLine = LCDLine - 2
               LCDColumn = LCDColumn + LCD_WIDTH
            End If
    '       -
            Lcd_Cmd (0x80 Or 0x40 * LCDLine + LCDColumn)
            Delay_us (50)
    End Sub
    
     
  • Anobium

    Anobium - 2023-02-09

    @Romtek

    I am confused. In the first post you indicate that you are using an LCD1602. This would imply an LCD 16 * 2 chars.

    In the same post and the code you share I see locate 0,40 ' 2 row. This would imply an LCD 40 * 2 chars.

    Which one do you have?

     
    • Romtek

      Romtek - 2023-02-09

      I state that I'm using 16x2 and 16x4 displays with PCF8574 interface.
      Sorry but in the previous post I had put MY solution to get around the problem, in fact if one loads the prog as I wrote it it displays on the second line, while if one uses "locate1,0" it doesn't display on the second line.

       
      • Romtek

        Romtek - 2023-02-09

        photo of the problem

         
        • Romtek

          Romtek - 2023-02-09

          photo of the problem always on 8515

           
  • Anobium

    Anobium - 2023-02-09

    The first device is a 1602 and the 1604.
    I have a 1602 here in the same PCF chip and it works.
    So, let us try to figure this out.

    Please try the attached the program. It is your program but I have tested it here.
    Test on a PIC16F88 and LCD 1602 ONLY. I need to figure one thing at a time.

     
    • Romtek

      Romtek - 2023-02-09

      On pic16f88 your program works.
      But on mega 8515 it works ????
      I've already tried on mega8515 but it doesn't write, see attached photo
      characters are missing

       
      • Romtek

        Romtek - 2023-02-09

        On 16f88 with display 4 row does not display correctly see attached photo

        ;Chip Settings
        #chip 16F88,4
        #include <pcf8574.h>
        #option explicit
        
        
        ; ----- Define Hardware settings
           ' THIS CONFIG OF THE SERIAL PORT TO A PC TERMINAL via a TTL Converter
           ' USART settings
           #define USART_BAUD_RATE 19200 
           Dir PORTA.3 Out
           Dir PORTA.4 In
           #define USART_DELAY 10 ms
           #define USART_BLOCKING
        
          ; ----- Define Hardware settings
          ' Define I2C settings - CHANGE PORTS
           #define I2C_MODE Master
           #define I2C_DATA PORTB.0 'pin
           #define I2C_CLOCK PORTB.1 'pin
           #define I2C_DISABLE_INTERRUPTS ON
           #define I2C_BIT_DELAY 0 us     '0
           #define I2C_CLOCK_DELAY 1 us   '1
           #define I2C_END_DELAY 0 us     '0
        
           #define LCD_IO 10
           #define LCD_I2C_Address_1 0x4E
        
        
          '''Set up LCD
           #define LCD_SPEED SLOW
        
           #define LCD_Backlight_On_State  1
           #define LCD_Backlight_Off_State 0
        
        
        ; ----- Quick Command Reference:
        
        
        LOCATE 0,0
        Print "0,0"
        LOCATE 1,0
        Print "1,0"
        
        LOCATE 2,0
        Print "2,0"
        LOCATE 3,0
        Print "3,0"
        
         
  • Anobium

    Anobium - 2023-02-09

    OK. So, we now know it works on 16F88.


    However, try the attachment on the 16F88 and connect a serial terminal. Get the values displayed. These values are the locate values being sent to the LCD via I2C. Get the values.

    Do the same on the mega. Should be the same values.

    I need the values. They should be.

    20, 0, 0, 128
    
    20, 1, 0, 192
    
     
    • Romtek

      Romtek - 2023-02-10

      I tested with pic16f88 and the result is:
      20, 0, 0, 128

      20, 1, 0, 192
      while I tested with mega8515 the result is

      20, 0, 0, 128

      20, 1, 0, 128
      as in the attached photo, (also tested with another identical display and another pcf8574 interface but I got the same result.
      Note the communication speed, in the program it is 19200, while I had to set the terminal at 9600.....but this is another matter.
      I will try the #DEFINE LCD_SPEED 255 change and let you know

       
      • Anobium

        Anobium - 2023-02-10

        So, the values being sent the LCD are good on the PIC16F88.

        Can you confirm the source program is the same? The result in the mega8515 is incorrect at the moment. The seconds line should be 20, 1, 0, 192

         
  • Anobium

    Anobium - 2023-02-09

    @RomTek

    I have tested the same program on the PIC16F88 with a 1602 and 2004 and both work.


    So, we know a baseline works. I am using the same program I posted above. So, using software I2C.

    Try this on both chips.

    #DEFINE LCD_SPEED 255 This will slow the intra-byte communication which may give the LCD time to process. You try 50000 but these will add seriously long intra-byte delay.

    Remember, the setting of the position of cursor is bytes of data being sent to the LCD. So, if the LCD CPU is really slow the LCD could miss some byte data - this would explain the errors you are seeing. So, hence the #DEFINE LCD_SPEED 255

    Test and post the results.

     

    Last edit: Anobium 2023-02-09
1 2 > >> (Page 1 of 2)

Log in to post a comment.