I cant seem to fix it
like the numbers displayed or what not goes dim and some are fine but some arent
Thats the Code if someone can help me pleaseCode:list p=16f877 #include <p16f877A.inc> __CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF #define LCD_RS PORTE,0 ;Define the pin for the LCD RS Control Line #define LCD_RW PORTE,1 ;Define the pin for the LCD R/W Control Line #define LCD_E PORTE,2 ;Define the pin for the LCD E Control Line #define LCD_DATA PORTD ;Define the pins for LCD Data Lines COUNTER1 EQU 0x020 ;Memory address for Counter 1 COUNTER2 EQU 0x021 ;Memory address for Counter 2 COUNTER3 EQU 0x022 ;MEMORY ADDRESS FOR COUNTER 3 ORG 0x0000 RESET_V goto START ;Reset Vector ORG 0x0005 START clrf PORTD ;Clear PORTD Output Latches. clrf PORTE ;Clear PORTE Output Latches. bsf STATUS,RP0 ;Switch to Bank 1. movlw 0x07 ;Load W with 0x07 movwf ADCON1 ;Copy W into ADCON1 (Switch Port A and E into Digital Mode) clrf TRISD ;Switch all Port D pins to output mode clrf TRISE ;Switch all Port E pins to output mode bcf STATUS,RP0 ;Switch to Bank 0 ; call LOCKED_MODE ; call HOLD_LOCKED ; call UNLOCKED_MODE ; call HOLD_UNLOCKED ; call IDLE_MODE ; call HOLD_IDLE ; call STEP_MODE ; call HOLD_STEP ; call POS_MODE ; call HOLD_POS LOCKED_MODE bcf LCD_RW ;Clear LCD_RW line to write data to the LCD bcf LCD_RS ;Clear LCD_RS line to write control commands movlw B'00111000' ;Load the function set command into working register Call LCD_WRITE ;Call the LCD_Write Subroutine movlw B'00001110' ;Load the Display On command into the working register Call LCD_WRITE ;Call the LCD_Write Subroutine movlw B'00000110' ;Load the Entry Mode Set command into the working register Call LCD_WRITE ;Call the LCD_Write Subroutine movlw B'00000001' ;Load the Clear Screen command into the working register Call LCD_WRITE ;Call the LCD_Write Subroutine Call LONG_DELAY ;Call the Long Delay Subroutine bsf LCD_RS ;Set the LCD_RS control line to write characters to the display movlw 'S' ;Load the first letter of your First Name into the Working Register Call LCD_WRITE ;Call the LCD_Write Subroutine movlw 'Y' ;Write the remaining letters of your First Name to the screen Call LCD_WRITE ;Call the LCD_Write Subroutine movlw 'S' Call LCD_WRITE movlw 'T' Call LCD_WRITE movlw 'E' Call LCD_WRITE movlw 'M' Call LCD_WRITE movlw '_' Call LCD_WRITE movlw 'L' Call LCD_WRITE movlw 'O' Call LCD_WRITE movlw 'C' Call LCD_WRITE movlw 'K' Call LCD_WRITE movlw 'E' Call LCD_WRITE movlw 'D' Call LCD_WRITE bcf LCD_RS ;Clear LCD_RS line to write control commands movlw B'11000000' ;Load the command into the working register that places the cursor on the second line of the LCD Call LCD_WRITE ;Call the LCD_Write Subroutine bsf LCD_RS ;Set the LCD_RS control line to write characters to the display movlw '1' ;Load the first letter of your Surname into the Working Register Call LCD_WRITE movlw '1' Call LCD_WRITE movlw '4' Call LCD_WRITE movlw '6' Call LCD_WRITE movlw '3' Call LCD_WRITE movlw '3' Call LCD_WRITE movlw '3' Call LCD_WRITE movlw '2' Call LCD_WRITE ; return HOLD_LOCKED btfsc PORTB, 5 goto HOLD_LOCKED UNLOCKED_MODE bcf LCD_RW ;Clear LCD_RW line to write data to the LCD bcf LCD_RS ;Clear LCD_RS line to write control commands movlw B'00111000' ;Load the function set command into working register Call LCD_WRITE ;Call the LCD_Write Subroutine movlw B'00001110' ;Load the Display On command into the working register Call LCD_WRITE ;Call the LCD_Write Subroutine movlw B'00000110' ;Load the Entry Mode Set command into the working register Call LCD_WRITE ;Call the LCD_Write Subroutine movlw B'00000001' ;Load the Clear Screen command into the working register Call LCD_WRITE ;Call the LCD_Write Subroutine Call LONG_DELAY ;Call the Long Delay Subroutine bsf LCD_RS ;Set the LCD_RS control line to write characters to the display movlw 'S' ;Load the first letter of your First Name into the Working Register Call LCD_WRITE ;Call the LCD_Write Subroutine movlw 'Y' ;Write the remaining letters of your First Name to the screen Call LCD_WRITE ;Call the LCD_Write Subroutine movlw 'S' Call LCD_WRITE movlw 'T' Call LCD_WRITE movlw 'E' Call LCD_WRITE movlw 'M' Call LCD_WRITE movlw '_' Call LCD_WRITE movlw 'U' Call LCD_WRITE movlw 'N' Call LCD_WRITE movlw 'L' Call LCD_WRITE movlw 'O' Call LCD_WRITE movlw 'C' Call LCD_WRITE movlw 'K' Call LCD_WRITE movlw 'E' Call LCD_WRITE movlw 'D' Call LCD_WRITE bcf LCD_RS ;Clear LCD_RS line to write control commands movlw B'11000000' ;Load the command into the working register that places the cursor on the second line of the LCD Call LCD_WRITE ;Call the LCD_Write Subroutine bsf LCD_RS ;Set the LCD_RS control line to write characters to the display movlw '1' ;Load the first letter of your Surname into the Working Register Call LCD_WRITE movlw '1' Call LCD_WRITE movlw '4' Call LCD_WRITE movlw '6' Call LCD_WRITE movlw '3' Call LCD_WRITE movlw '3' Call LCD_WRITE movlw '3' Call LCD_WRITE movlw '2' Call LCD_WRITE ; return HOLD_UNLOCKED btfsc PORTB, 4 goto HOLD_UNLOCKED IDLE_MODE bcf LCD_RW ;Clear LCD_RW line to write data to the LCD bcf LCD_RS ;Clear LCD_RS line to write control commands movlw B'00111000' ;Load the function set command into working register call LCD_WRITE ;Call the LCD_Write Subroutine movlw B'00001110' ;Load the Display On command into the working register call LCD_WRITE ;Call the LCD_Write Subroutine movlw B'00000110' ;Load the Entry Mode Set command into the working register call LCD_WRITE ;Call the LCD_Write Subroutine movlw B'00000001' ;Load the Clear Screen command into the working register call LCD_WRITE ;Call the LCD_Write Subroutine call LONG_DELAY ;Call the Long Delay Subroutine bsf LCD_RS ;Set the LCD_RS control line to write characters to the display movlw 'I' ;Load the first letter of your First Name into the Working Register call LCD_WRITE ;Call the LCD_Write Subroutine movlw 'D' ;Write the remaining letters of your First Name to the screen call LCD_WRITE ;Call the LCD_Write Subroutine movlw 'L' call LCD_WRITE movlw 'E' call LCD_WRITE movlw '_' call LCD_WRITE movlw 'M' call LCD_WRITE movlw 'O' call LCD_WRITE movlw 'D' call LCD_WRITE movlw 'E' call LCD_WRITE bcf LCD_RS ;Clear LCD_RS line to write control commands movlw B'11000000' ;Load the command into the working register that places the cursor on the second line of the LCD call LCD_WRITE ;Call the LCD_Write Subroutine bsf LCD_RS ;Set the LCD_RS control line to write characters to the display movlw 'S' ;Load the first letter of your Surname into the Working Register call LCD_WRITE movlw 'Y' call LCD_WRITE movlw 'S' call LCD_WRITE movlw 'T' call LCD_WRITE movlw 'E' call LCD_WRITE movlw 'M' call LCD_WRITE movlw '_' call LCD_WRITE movlw 'E' call LCD_WRITE movlw 'N' call LCD_WRITE movlw 'A' call LCD_WRITE movlw 'B' call LCD_WRITE movlw 'L' call LCD_WRITE movlw 'E' call LCD_WRITE movlw 'D' call LCD_WRITE ; return HOLD_IDLE btfsc PORTB, 2 goto HOLD_IDLE STEP_MODE bcf LCD_RW ;Clear LCD_RW line to write data to the LCD bcf LCD_RS ;Clear LCD_RS line to write control commands movlw B'00111000' ;Load the function set command into working register Call LCD_WRITE ;Call the LCD_Write Subroutine movlw B'00001110' ;Load the Display On command into the working register Call LCD_WRITE ;Call the LCD_Write Subroutine movlw B'00000110' ;Load the Entry Mode Set command into the working register Call LCD_WRITE ;Call the LCD_Write Subroutine movlw B'00000001' ;Load the Clear Screen command into the working register Call LCD_WRITE ;Call the LCD_Write Subroutine Call LONG_DELAY ;Call the Long Delay Subroutine bsf LCD_RS ;Set the LCD_RS control line to write characters to the display movlw 'S' ;Load the first letter of your First Name into the Working Register Call LCD_WRITE ;Call the LCD_Write Subroutine movlw 'T' ;Write the remaining letters of your First Name to the screen Call LCD_WRITE ;Call the LCD_Write Subroutine movlw 'E' Call LCD_WRITE movlw 'P' Call LCD_WRITE movlw '_' Call LCD_WRITE movlw 'M' Call LCD_WRITE movlw 'O' Call LCD_WRITE movlw 'D' Call LCD_WRITE movlw 'E' Call LCD_WRITE bcf LCD_RS ;Clear LCD_RS line to write control commands movlw B'11000000' ;Load the command into the working register that places the cursor on the second line of the LCD Call LCD_WRITE ;Call the LCD_Write Subroutine bsf LCD_RS ;Set the LCD_RS control line to write characters to the display movlw 'S' ;Load the first letter of your Surname into the Working Register Call LCD_WRITE movlw 'T' Call LCD_WRITE movlw 'E' Call LCD_WRITE movlw 'P' Call LCD_WRITE movlw 'S' Call LCD_WRITE movlw ':' Call LCD_WRITE movlw 'X' Call LCD_WRITE movlw 'X' Call LCD_WRITE movlw 'Y' Call LCD_WRITE movlw 'Y' Call LCD_WRITE movlw 'Y' Call LCD_WRITE ; return HOLD_STEP btfsc PORTB,2 goto STEP_MODE POS_MODE bcf LCD_RW ;Clear LCD_RW line to write data to the LCD bcf LCD_RS ;Clear LCD_RS line to write control commands movlw B'00111000' ;Load the function set command into working register Call LCD_WRITE ;Call the LCD_Write Subroutine movlw B'00001110' ;Load the Display On command into the working register Call LCD_WRITE ;Call the LCD_Write Subroutine movlw B'00000110' ;Load the Entry Mode Set command into the working register Call LCD_WRITE ;Call the LCD_Write Subroutine movlw B'00000001' ;Load the Clear Screen command into the working register Call LCD_WRITE ;Call the LCD_Write Subroutine Call LONG_DELAY ;Call the Long Delay Subroutine bsf LCD_RS ;Set the LCD_RS control line to write characters to the display movlw 'P' ;Load the first letter of your First Name into the Working Register Call LCD_WRITE ;Call the LCD_Write Subroutine movlw 'O' ;Write the remaining letters of your First Name to the screen Call LCD_WRITE ;Call the LCD_Write Subroutine movlw 'S' Call LCD_WRITE movlw 'I' Call LCD_WRITE movlw 'O' Call LCD_WRITE movlw 'N' Call LCD_WRITE movlw '_' Call LCD_WRITE movlw 'M' Call LCD_WRITE movlw 'O' Call LCD_WRITE movlw 'D' Call LCD_WRITE movlw 'E' Call LCD_WRITE bcf LCD_RS ;Clear LCD_RS line to write control commands movlw B'11000000' ;Load the command into the working register that places the cursor on the second line of the LCD Call LCD_WRITE ;Call the LCD_Write Subroutine bsf LCD_RS ;Set the LCD_RS control line to write characters to the display movlw 'X' ;Load the first letter of your Surname into the Working Register Call LCD_WRITE movlw 'X' Call LCD_WRITE movlw 'X' Call LCD_WRITE movlw ':' Call LCD_WRITE movlw 'Y' Call LCD_WRITE movlw 'Y' Call LCD_WRITE movlw 'Y' Call LCD_WRITE movlw ':' Call LCD_WRITE movlw 'Z' Call LCD_WRITE movlw 'Z' Call LCD_WRITE movlw 'Z' Call LCD_WRITE movlw ':' Call LCD_WRITE movlw 'D' Call LCD_WRITE movlw 'D' Call LCD_WRITE movlw 'D' Call LCD_WRITE ; return HOLD_POS btfsc PORTB,2 goto HOLD_POS goto IDLE_MODE ;******************************************************************************************************** ; Subroutine Section ;******************************************************************************************************** ; LCD Write - loads a command into the LCD Controller ;******************************************************************************************************** LCD_WRITE bsf LCD_E ;Set the LCD Enable Pin movwf LCD_DATA ;Write the command in the working register to the LCD Data Lines nop ;No Operation nop ;No Operation bcf LCD_E ;Clear the LCD Enable Pin call SHORT_DELAY ;Call the Short_Delay subroutine to Wait the minimum instruction execution time return ;Return to where the routine was called from ;******************************************************************************************************** ; Short Delay (approx 60us) ;******************************************************************************************************** SHORT_DELAY movlw D'100' ;Load 100 into the Working register movwf COUNTER1 ;Copy the Working register into the Counter1 register C1_DEC decfsz COUNTER1,F ;Decrement the Counter 1 register goto C1_DEC ;Goto C1_DEC return ;Return to where the routine was called from ;******************************************************************************************************** ; Long Delay (approx 6ms) ;******************************************************************************************************** LONG_DELAY movlw D'100' ;Load 100 into the Working register movwf COUNTER2 ;Copy the Working register into the Counter2 register DLY_C2_DEC call SHORT_DELAY ;Call the SHORT_DELAY subroutine decfsz COUNTER2,F ;Decrement the Counter 2 register goto DLY_C2_DEC ;Goto DLY_C2_DEC return ;Return to where the routine was called from END




Bookmarks