Two dimensional arrays?


Closed Thread
Results 1 to 13 of 13

Hybrid View

  1. #1
    Join Date
    Mar 2010
    Posts
    40


    Did you find this post helpful? Yes | No

    Default

    dear sir,

    i dont why i use the array code that you post early compile no error..but when download to the pic16f873a it like stuck at somewhere at the initial array..below is my code...
    Code:
    INCLUDE "modedefs.bas"
    
    
    @ __config _HS_OSC & _WDT_OFF & _LVP_OFF & _CP_OFF
    ;----------------------------------------------------------------
    DEFINE OSC 20
    DEFINE LCD_DREG PORTA 'LCD Data line
    DEFINE LCD_DBIT 0
    DEFINE LCD_RSREG PORTB 'RS bit
    DEFINE LCD_RSBIT 5
    DEFINE LCD_EREG PORTB 'E bit
    DEFINE LCD_EBIT 4
    DEFINE LCD_RWREG PORTB 'RW bit
    DEFINE LCD_RWBIT 6
    DEFINE LCD_BITS 4
    DEFINE LCD_LINES 2
    DEFINE LCD_CHARS 20
    DEFINE LCD_COMMANDUS 2000
    DEFINE LCD_DATAUS 50
    LCDOUT $FE,1,"8"
    pause 500
    ;---------------------------------------------------------------
    VinTXD VAR PORTC.7 'AD0 TXD VDIP2 connect RX
    VinRXD VAR PORTC.6 'AD1 RXD VDIP2 connect TX
    FlowIn VAR PORTC.0 'AD2 RTS
    T VAR PORTC.0 'push button
    D VAR PORTC.1 ' PUSH BUTTON FOR DISPLAY
    LCDOUT $FE,1,"9"
    pause 500
    ;----------------------------------------------------------------
        ; -- Working with 2D arrays ---
    
    Width      CON 8                      ; Number of bytes in a Row
    Length     CON 12                     ; Number of Rows in the array
    ;---------------------------------------------------------------------------
    ArraySize  CON Width * Length         ; Total size of the array
    MyArray    VAR BYTE[ArraySize]        ; The Array
    
    Idx        VAR BYTE                   ; Index, points to 1D array locations
    Xidx       VAR BYTE                   ; 2D column Index
    Yidx       VAR BYTE                   ; 2D row Index
    ArrayData  VAR BYTE                   ; holding register for array data
    
    ;----[Get a value from the 2D array]----------------------------------------
    Get2D:
        Idx=(Yidx*Width+Xidx) MIN (ArraySize-1) ; find Index, limit to ArraySize 
        ArrayData = MyArray(Idx)                ; retrieve value from the array
    RETURN
    
    ;----[Put a value in the 2D array]------------------------------------------
    Put2D:
        Idx=(Yidx*Width+Xidx) MIN (ArraySize-1) ; find Index, limit to ArraySize 
        MyArray(Idx) = ArrayData                ; store the value in the array
    RETURN
    
    ;----[Set entire array to 0's]----------------------------------------------
    Clear2D:
        FOR Idx = 0 TO ArraySize-1
            MyArray(Idx) = 0
        NEXT Idx
    RETURN
    
    ASM
    #Get2D macro X, Y
        MOVE?BB   X, _Xidx                      ; copy users X value to Xidx
        MOVE?BB   Y, _Yidx                      ; copy users Y value to Yidx
    //    L?CALL    _Get2D                        ; call the Get subroutine
      endm                                      ; value is returned in ArrayData
    #define Get2D(X, Y)  #Get2D X, Y            ; allows paretheses in macro
    
    #Put2D macro X, Y                           ; value should be in ArrayData
        MOVE?BB   X, _Xidx                      ; copy users X value to Xidx
        MOVE?BB   Y, _Yidx                      ; copy users Y value to Yidx
        L?CALL    _Put2D                        ; call the Put subroutine
      endm
    #define Put2D(X, Y)  #Put2D X, Y            ; allows paretheses in macro
    
    #Clear2D macro
        L?CALL    _Clear2D                      ; call the Clear subroutine
      endm
    #define Clear2D()  #Clear2D
    ENDASM
    ;----------------------------------------------------------------
    ;a var BYTE[12]
    
    FILE1 VAR BYTE[12]
    FILE2 VAR BYTE[12]
    FILE3 VAR BYTE[12]
    ;X VAR BYTE
    
    LCDOUT $FE,1,"20"
    pause 500
    CRET VAR BYTE
    CRET = $0D
    ;----------------------------------------------------------------
    StartDisk:
    pause 3000
    HIGH VinRXD
    
    SEROUT2 VinRXD,84,["ECS",13]
    LCDOUT $FE,1, "1"
    pause 2500
    PAUSEUS 1000
    HIGH VinRXD
    PAUSEUS 3000
    SEROUT2 VinRXD,84,["IPA",13]
    LCDOUT $FE,1, "2"
    pause 2500
    HIGH VinRXD
    PAUSEUS 1000
    SEROUT2 VinRXD,84,["A:",13]
    LCDOUT $FE,1, "3"
    pause 2500
    HIGH VinRXD
    PAUSEUS 1000
    SEROUT2 VinRXD,84,["DIR",13]
    LCDOUT $FE,1, "4"
    'pause 2500
    PAUSEUS 1000
    ;------------------------------------------------------------
    X        VAR BYTE SYSTEM
    Y        VAR BYTE SYSTEM
    LCDOUT $FE,1,"11"
    pause 500
    ;----------------------------------------------------------------
    
    ;------------------------------------------------------------
    WAIT1
    IF FLOWIN = 1 THEN WAIT1
    
    LCDOUT $FE,1, "5"
    @ Clear2D                       ; clear the array
        FOR Y = 0 TO Length-1
        SERIN2 VinTXD,84,[WAIT(CRET),STR FILE1\12 \CRET]           ; fill the array with data
          FOR X = 0 TO Width-1
              ArrayData =FILE1[X]             ; value to put in array
              @ Put2D(X,Y)
          NEXT X
        NEXT Y
    
    ;--------------------------------------------------------------------------------
    PAUSE 1000
    FOR Y = 0 TO Length-1        
          FOR X = 0 TO Width-1
              @ Get2D(X,Y)
          NEXT X
        LCDOUT $FE,1,ArrayData
    pause 500
        NEXT Y 
    goto StartDisk
    Last edited by ScaleRobotics; - 21st November 2010 at 16:10. Reason: added code tags

  2. #2
    Join Date
    Jul 2003
    Location
    Colorado Springs
    Posts
    4,959


    Did you find this post helpful? Yes | No

    Default

    I think you just need to jump over the subroutines with a GOTO.
    <br>
    DT

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