Pic PIC16F877 branching to different location

Discussion in 'Embedded Systems and Microcontrollers' started by limbonic, Jun 24, 2013.

  1. limbonic

    Thread Starter New Member

    Jul 4, 2011
    17
    0
    I try to write code in assembly drive an LCD screen and a keypad. At the end the program have to drive also 2 stepper motors but in this stage i want to create first the menu of the LCD screen. When i press the buttons i want to display some messages on the LCD. My problem is that when i add more messages my code brances in weird location than the locations i want.

    If in the code below i have only:

    Code ( (Unknown Language)):
    1. kpad_values
    2.     goto     keypad
    3.     goto     FORWARD
    4.     goto     keypad    ;invalid key        
    5.     goto     LEFT
    it runs smooth and when i press the suitable buttons it displays the suitable word in the LCD.

    When i add one more message connected to another button:
    Code ( (Unknown Language)):
    1.  
    2. kpad_values
    3.     goto     keypad
    4.     goto     FORWARD
    5.     goto     keypad    ;invalid key        
    6.     goto     LEFT
    7.     goto     STORE0
    8.  
    The programm doesn't work properly. Any idea what is going wrong and how i could fix this problem??

    The code i use;

    Code ( (Unknown Language)):
    1.  
    2. LIST P=16F877A
    3. include "P16F877A.INC"
    4. __CONFIG _RC_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF & _BODEN_ON & _LVP_OFF  & _CPD_OFF & _DEBUG_OFF;
    5. ERRORLEVEL -302
    6.    
    7. PCL      EQU   H'02'      
    8. STATUS   EQU   H'03'      
    9. PORTA    EQU   H'05'      
    10. TRISA    EQU   H'85'      
    11. PORTB    EQU   H'06'      
    12. TRISB    EQU   H'86'  
    13. PORTC     EQU   H'07'
    14. TRISC     EQU   H'87'
    15. PORTD      EQU   H'08'
    16. TRISD     EQU   H'88'  
    17. INTCON   EQU   H'0B'
    18. ADCON1     EQU   H'9F'
    19.  
    20.          
    21. LOOP       EQU   H'20'      
    22. LOOPA      EQU   H'21'      
    23. CLKCNT     EQU   H'22'    
    24. STORE   EQU   H'27'    
    25. d1        equ      H'28'
    26. d2        equ      H'29'
    27. d3        equ   H'2a'
    28. RSLINE  EQU   H'2F'    
    29.  
    30.  
    31. cblock 0x30  
    32. rowCode
    33. scanFlag
    34. rowCounter
    35. rowMask
    36. keytemp
    37. kpadPattern
    38. tabh
    39. tabl
    40. endc        
    41.  
    42.            
    43. W   EQU   0      
    44. F   EQU   1      
    45.            
    46.    ORG   0x00      
    47.    GOTO   main      
    48.  
    49. main
    50.     CALL    PORT_INIT
    51.     CALL    LCD_INIT
    52.     CALL    LCD_MESSAGE
    53.     call    LCD_LINE2
    54.     call    LCD_MESSAGE2
    55.  
    56. nop
    57.     CALL    keypad
    58. nop
    59.     GOTO     NOMORE
    60.  
    61.  
    62. PORT_INIT
    63.     BCF        STATUS,5
    64.     BCF        STATUS,6
    65.     CLRF     PORTA
    66.     CLRF    PORTB
    67.     CLRF    PORTC
    68.     CLRF    PORTD
    69.     BSF        STATUS,5
    70.     MOVLW    0x06
    71.     MOVWF    ADCON1
    72.  
    73.     CLRF    TRISA
    74.     CLRF    TRISB
    75.     CLRF    TRISC
    76.     MOVLW    B'00000111'        ;D0-2 OUTPUT, D4-7 INPUT
    77.     MOVWF    TRISD
    78.     BCF   STATUS,5        
    79. RETURN
    80.    
    81.      
    82.            
    83. LCD_INIT
    84.    CALL   DELAY1     ;perform first 1/5th sec delay
    85. LCDSET  
    86.    CLRF   LOOP      ;clr LCD set-up loop
    87.    CLRF   RSLINE      ;clear RS line for instruction send
    88. LCDST2  
    89.    MOVF   LOOP,W      ;get table address
    90.    CALL   TABLCD      ;get set-up instruction
    91.    CALL   LCDOUT      ;perform it
    92.    INCF   LOOP,F      ;inc loop
    93.    BTFSS   LOOP,3      ;has last LCD set-up instruction now been done?
    94.    GOTO   LCDST2      ;no
    95.    CALL   DELAY1      ;yes, perform second 1/5th sec delay
    96.             ;to allow final LCD command to occur
    97.             ;(it takes longer than the rest)
    98. RETURN
    99.  
    100.  
    101. TABLCD  
    102.    ADDWF   PCL,F           ;LCD initialisation table
    103.    RETLW   B'00110011'  
    104.    RETLW   B'00110011'  
    105.    RETLW   B'00110010'  
    106.    RETLW   B'00101100'  
    107.    RETLW   B'00000110'  
    108.    RETLW   B'00001100'  
    109.    RETLW   B'00000001'  
    110.    RETLW   B'00000010'  
    111.                            
    112.  
    113.  
    114.  
    115. LCD_MESSAGE              
    116.    CLRF   LOOP      ;clear loop
    117.    BSF   RSLINE,4      ;set RS for data send
    118. msg1  
    119.    MOVF   LOOP,W      ;get table address
    120.    CALL   MESSAG      ;get message letter
    121.    CALL   LCDOUT      ;show it
    122.    INCF   LOOP,F      ;inc loop
    123.    BTFSS   LOOP,4      ;has last LCD letter been sent?
    124.    GOTO   msg1      ;no, so repeat for next one
    125. return
    126.    
    127. LCD_MESSAGE2
    128.    CLRF   LOOP      ;clear loop
    129.    BSF   RSLINE,4      ;set RS for data send
    130. msg2
    131.    MOVF   LOOP,W      ;get table address
    132.    CALL   MESSAG2      ;get message letter
    133.    CALL   LCDOUT      ;show it
    134.    INCF   LOOP,F      ;inc loop
    135.    BTFSS  LOOP,4      ;has last LCD letter been sent?
    136.    GOTO   msg2      ;no, so repeat for next one
    137. RETURN
    138.            
    139.  
    140.            
    141. LCDOUT   MOVWF   STORE      ;temp store data
    142.            MOVLW   D'250'      ;set minimum time between sending full bytes to
    143.               MOVWF   LOOPA      ;LCD - value of 250 seems OK for this prog with
    144. DELAY    DECFSZ  LOOPA,F      ;XTAL clk of upto 20MHz
    145.              GOTO   DELAY      ;keep decrementing LOOPA until zero
    146.             CALL   SENDIT      ;send MSB
    147.             CALL   SENDIT      ;send LSB
    148.       RETURN        
    149.            
    150. SENDIT  SWAPF   STORE,F      ;swap data nibbles
    151.            MOVF   STORE,W      ;get data byte
    152.            ANDLW   H'0F'      ;get nibble from byte (LSB)
    153.            IORWF   RSLINE,W      ;OR the RS bit
    154.            MOVWF   PORTB      ;output the byte
    155.            BSF   PORTB,5      ;set E line high
    156.            BCF   PORTB,5      ;set E line low
    157.    RETURN        
    158.            
    159.  
    160.  
    161. LCD_LINE2
    162.     BCF       RSLINE,4      ;set RS for instructions send
    163.     MOVLW    B'11000000'
    164.     MOVWF    PORTB
    165.        CALL       LCDOUT      ;perform it
    166.     CALL     DELAY1
    167.     BSF        RSLINE,4
    168.     RETURN
    169.    
    170.  
    171. ;KEYPAD
    172. keypad
    173.     CLRF    kpadPattern
    174.    
    175. startscan
    176.     CLRF    rowCode            ;register to help distrinct each row key values
    177. ;                            ;0:access 1,2,3 values
    178. ;                            ;3:access 4,5,6 values
    179.  
    180.     CLRF    scanFlag
    181.  
    182.     movlw    0x04
    183.     movwf    rowCounter
    184.     movlw    b'00001110'
    185.     movlw    b'00010000'
    186.     movwf    rowMask
    187.    
    188. keyfind
    189.     movf    rowMask,w
    190.     movwf    PORTD
    191.     BTFSC    PORTD,0
    192.     call    col0
    193.     btfsc     PORTD,1
    194.     call    col1
    195.     btfsc    PORTD,2
    196.     call    col2
    197.  
    198.     movlw    0x03
    199.     addwf     rowCode,f
    200.     bcf        PORTD,3
    201.     rlf        rowMask,f
    202.     decfsz    rowCounter,f
    203.     goto    keyfind
    204.     movf    scanFlag,f
    205.     btfsc    STATUS,Z
    206.     goto    scanEnd
    207.     call    get_key
    208.  
    209. scanEnd
    210.     call    DELAY1
    211.     goto     startscan
    212.  
    213. col0
    214.     movf    rowCode,w
    215.     addlw    0x00
    216.     movwf    kpadPattern
    217.     incf    scanFlag,f
    218.     return
    219.  
    220.  
    221. col1
    222.     movf    rowCode,w
    223.     addlw    0x01
    224.     movwf    kpadPattern
    225.     incf    scanFlag,f
    226.     return
    227.  
    228. col2
    229.     movf    rowCode,w
    230.     addlw    0x02
    231.     movwf    kpadPattern
    232.     incf    scanFlag,f
    233.     return
    234.  
    235. get_key
    236.     movf    kpadPattern,w
    237.     movlw    high(kpad_values)
    238.     movwf    tabh
    239.     movlw    low(kpad_values)
    240.     addwf    kpadPattern,w
    241.     movwf    tabl
    242.  
    243.  
    244.     btfsc    STATUS,C
    245.     incf    tabh
    246.     movf    tabh,W
    247.     movwf    PCLATH
    248.     movf    tabl,W
    249.     movwf    PCL
    250.  
    251. kpad_values
    252.     goto     keypad
    253.     goto     FORWARD
    254.     goto     keypad    ;invalid key        
    255.     goto     LEFT
    256.     goto     STORE0
    257.  
    258.  
    259.  
    260.  
    261. FORWARD
    262.     BCF        RSLINE,4
    263.     movlw    b'00000001'
    264.     movwf    PORTB
    265.     call    LCDOUT
    266.     bsf        RSLINE,4
    267.     call    LCD_MESSAGE4
    268.     goto     NOMORE
    269.  
    270. LEFT
    271.     BCF        RSLINE,4
    272.     movlw    b'00000001'
    273.     movwf    PORTB
    274.     call    LCDOUT
    275.     bsf        RSLINE,4
    276.     call    LCD_MESSAGE5
    277.     goto     NOMORE
    278.  
    279. STORE0
    280.     movlw    0x01
    281.     movwf    0x40
    282.     BCF        RSLINE,4
    283.     movlw    b'00000001'
    284.     movwf    PORTB
    285.     call    LCDOUT
    286.     bsf        RSLINE,4
    287.     call    LCD_MESSAGE6
    288.     goto     NOMORE
    289.  
    290.  
    291. DELAY1
    292.             ;1499993 cycles
    293.     movlw    0x0C
    294.     movwf    d1
    295.     movlw    0x46
    296.     movwf    d2
    297.     movlw    0x04
    298.     movwf    d3
    299. Delay_0
    300.     decfsz    d1, f
    301.     goto    $+2
    302.     decfsz    d2, f
    303.     goto    $+2
    304.     decfsz    d3, f
    305.     goto    Delay_0
    306.  
    307.             ;3 cycles
    308.     goto    $+1
    309.     nop
    310.  
    311.             ;4 cycles (including call)
    312.     return
    313.  
    314.  
    315.  
    316. LCD_MESSAGE4
    317.    CLRF   LOOP      
    318.    BSF   RSLINE,4    
    319. msg4
    320.    MOVF   LOOP,W    
    321.    CALL   MESSAG4      
    322.    CALL   LCDOUT      
    323.    INCF   LOOP,F    
    324.    BTFSS  LOOP,4      
    325.    GOTO   msg4      
    326. RETURN
    327.  
    328. LCD_MESSAGE5
    329.    CLRF   LOOP    
    330.    BSF   RSLINE,4    
    331. msg5
    332.    MOVF   LOOP,W    
    333.    CALL   MESSAG5      
    334.    CALL   LCDOUT    
    335.    INCF   LOOP,F    
    336.    BTFSS  LOOP,4      
    337.    GOTO   msg5    
    338. RETURN
    339.  
    340. LCD_MESSAGE6
    341.    CLRF   LOOP      
    342.    BSF   RSLINE,4      
    343. msg6
    344.    MOVF   LOOP,W    
    345.    CALL   MESSAG6      
    346.    CALL   LCDOUT      
    347.    INCF   LOOP,F      
    348.    BTFSS  LOOP,4    
    349.    GOTO   msg6    
    350. RETURN
    351.  
    352. MESSAG  
    353.    ADDWF   PCL,F      
    354.    RETLW   ' '      
    355.    RETLW   ' '      
    356.    RETLW   ' '      
    357.    RETLW   ' '      
    358.    RETLW   ' '      
    359.    RETLW   'r'      
    360.    RETLW   'o'      
    361.    RETLW   'b'
    362.    RETLW   'o'      
    363.    RETLW   't'      
    364.    RETLW   ' '      
    365.    RETLW   'v'      
    366.    RETLW   '0'      
    367.    RETLW   '.'  
    368.    RETLW   '1'      
    369.    RETLW   ' '  
    370.  
    371. MESSAG2  
    372.    ADDWF   PCL,F  
    373.    RETLW   'a'
    374.    RETLW   'd'
    375.    RETLW   'd'
    376.    RETLW   ' '  
    377.    RETLW   'i'      
    378.    RETLW   'n'      
    379.    RETLW   's'      
    380.    RETLW   't'      
    381.    RETLW   'r'      
    382.    RETLW   'u'      
    383.    RETLW   'c'      
    384.    RETLW   't'
    385.    RETLW   'i'      
    386.    RETLW   'o'      
    387.    RETLW   'n'
    388.    RETLW   's'
    389.  
    390.  
    391.  
    392.  
    393.  
    394.  
    395. MESSAG4  
    396.    ADDWF   PCL,F  
    397.    RETLW   ' '
    398.    RETLW   ' '      
    399.    RETLW   ' '
    400.    RETLW   'F'
    401.    RETLW   'O'
    402.    RETLW   'R'  
    403.    RETLW   'W'      
    404.    RETLW   'A'      
    405.    RETLW   'R'      
    406.    RETLW   'D'      
    407.    RETLW   ' '      
    408.    RETLW   ' '      
    409.    RETLW   ' '      
    410.    RETLW   ' '
    411.    RETLW   ' '      
    412.    RETLW   ' '
    413.  
    414. MESSAG5  
    415.    ADDWF   PCL,F  
    416.    RETLW   ' '
    417.    RETLW   ' '      
    418.    RETLW   ' '
    419.    RETLW   ' '
    420.    RETLW   ' '
    421.    RETLW   'L'
    422.    RETLW   'E'  
    423.    RETLW   'F'      
    424.    RETLW   'T'      
    425.    RETLW   ' '      
    426.    RETLW   ' '          
    427.    RETLW   ' '      
    428.    RETLW   ' '      
    429.    RETLW   ' '
    430.    RETLW   ' '      
    431.    RETLW   ' '
    432.  
    433. MESSAG6  
    434.    ADDWF   PCL,F  
    435.    RETLW   ' '
    436.    RETLW   ' '      
    437.    RETLW   ' '
    438.    RETLW   ' '
    439.    RETLW   'S'
    440.    RETLW   'T'
    441.    RETLW   'O'  
    442.    RETLW   'R'      
    443.    RETLW   'E'      
    444.    RETLW   ' '      
    445.    RETLW   ' '          
    446.    RETLW   ' '      
    447.    RETLW   ' '      
    448.    RETLW   ' '
    449.    RETLW   ' '      
    450.    RETLW   ' '
    451.  
    452.  
    453. NOMORE   GOTO   NOMORE      ;hold here
    454.    END         ;final line
     
    Last edited: Jun 24, 2013
  2. limbonic

    Thread Starter New Member

    Jul 4, 2011
    17
    0
    I have to limit my text to 10000 characters so i delete some comments (sorry). In order to debug i use the stimulus. If i choose d0 pin as '1' and then as '0' then the first keypad column is active so i could take the keys in keypad(1,4,7,*) having the suitable row , if i choose d1 pin as HIGH first and as LOW then i choose column 2 and the keys(2,5,8,0) etc.
     
  3. Markd77

    Senior Member

    Sep 7, 2009
    2,803
    594
    You want to read AN556 from Microchip, explains everything.
     
    absf likes this.
Loading...