salut

est ce que vous pouvez m'aider à adapter ce code à 16f877.

Code:
RESET_V		EQU	0x0000		; Address of RESET Vector
ISR_V		EQU	0x0004		; Address of Interrupt Vector
OSC_FREQ	EQU	D'4000000'	; Oscillator Frequency is 4 MHz

LCD_DATA	EQU	PORTB		; LCD data lines interface
LCD_DATA_TRIS	EQU	TRISB
LCD_CTRL	EQU	PORTA		; LCD control lines interface

LCD_LINE0	EQU	0x000
LCD_LINE1	EQU	0x040
LCD_LINE2	EQU	0x014
LCD_LINE3	EQU	0x054

; PORTA bits
LCD_E		EQU	2		; LCD Enable control line
LCD_RW		EQU	1		; LCD Read/Write control line
LCD_RS		EQU	0		; LCD Register-Select control line

; PORTB bits
DB7		EQU	7		; LCD dataline 7 (MSB)
DB6		EQU	6		; LCD dataline 6
DB5		EQU	5		; LCD dataline 5
DB4		EQU	4		; LCD dataline 4
DB3		EQU	3		; LCD dataline 3
DB2		EQU	2		; LCD dataline 2
DB1		EQU	1		; LCD dataline 1
DB0		EQU	0		; LCD dataline 0 (LSB)

; misc.
LCD_TEMP	EQU	0x020		; LCD subroutines internal use

TABLE_INDEX	EQU	0x021		; Index to table strings
COUNT		EQU	0x022		; A counter
DELAY		equ	0x023		; Used in DELAYxxx routines
X_DELAY		equ	0x024		; Used in X_DELAYxxx routines


	ORG     0x000             ; processor reset vector

	nop			  ; nop required for icd
  	goto    START              ; go to beginning of program


TABLE_MSG
		MOVLW	0		; Startindex of table message
DISP_MSG
		MOVWF	TABLE_INDEX	; Holds message address
		CALL	MSG1
		ANDLW	0x0FF		; Check if at end of message
		BTFSC	STATUS, Z	; (zero returned at end)
		GOTO	TABLE_MSG_END             
		CALL	LCDPUTCHAR	; Display character
		MOVF	TABLE_INDEX, W	; Point to next character
		ADDLW	1
		GOTO	DISP_MSG
TABLE_MSG_END	RETURN

TABLE_MSG1
		MOVLW	0		; Startindex of table message
DISP_MSG1
		MOVWF	TABLE_INDEX	; Holds message address
		CALL	MSG2
		ANDLW	0x0FF		; Check if at end of message
		BTFSC	STATUS, Z	; (zero returned at end)
		GOTO	TABLE_MSG_END1             
		CALL	LCDPUTCHAR	; Display character
		MOVF	TABLE_INDEX, W	; Point to next character
		ADDLW	1
		GOTO	DISP_MSG1
TABLE_MSG_END1	RETURN


TABLE_MSG2
		MOVLW	0		; Startindex of table message
DISP_MSG2
		MOVWF	TABLE_INDEX	; Holds message address
		CALL	MSG3
		ANDLW	0x0FF		; Check if at end of message
		BTFSC	STATUS, Z	; (zero returned at end)
		GOTO	TABLE_MSG_END2             
		CALL	LCDPUTCHAR	; Display character
		MOVF	TABLE_INDEX, W	; Point to next character
		ADDLW	1
		GOTO	DISP_MSG2
TABLE_MSG_END2	RETURN


TABLE_MSG3
		MOVLW	0		; Startindex of table message
DISP_MSG3
		MOVWF	TABLE_INDEX	; Holds message address
		CALL	MSG1
		ANDLW	0x0FF		; Check if at end of message
		BTFSC	STATUS, Z	; (zero returned at end)
		GOTO	TABLE_MSG_END3             
		CALL	LCDPUTCHAR	; Display character
		MOVF	TABLE_INDEX, W	; Point to next character
		ADDLW	1
		GOTO	DISP_MSG3
TABLE_MSG_END3	RETURN


TABLE_VIT
		MOVLW	0		; Startindex of table message
VIT
		MOVWF	TABLE_INDEX	; Holds message address
		CALL	MSG5
		ANDLW	0x0FF		; Check if at end of message
		BTFSC	STATUS, Z	; (zero returned at end)
		GOTO	TABLE_VIT_END3             
		CALL	LCDPUTCHAR	; Display character
		MOVF	TABLE_INDEX, W	; Point to next character
		ADDLW	1
		GOTO	VIT
TABLE_VIT_END3	RETURN		


;=========================================================
; LCDINIT
; Initilize LC-Display Module
; Should be modified to your needs (i.e. display type, cursor on/off, etc.)
; OK
;=========================================================
LCDINIT
					; Busy-flag is not yet valid
		CLRF	LCD_CTRL	; ALL PORT output should output Low.
					; power-up delay
		MOVLW	0x01E
		CALL	X_DELAY500	; 30 * 0.5mS = 15mS
					; Busy Flag should be valid from here
		MOVLW	0x038		; 8-bit-interface, 2-lines
		CALL	LCDPUTCMD
		MOVLW	0x000		; disp.off, curs.off, no-blink
		CALL	LCDDMODE
		CALL	LCDCLEAR
		MOVLW	0x004		; disp.on, curs.off
		CALL	LCDDMODE
		MOVLW	0x002		; auto-inc (shift-cursor)
		CALL	LCDEMODE
		RETURN
;=========================================================
; LCD_ENABLE
; Pulses LCD enable pin
; OK
;=========================================================
LCD_ENABLE
		BSF	LCD_CTRL, LCD_E	; LCD E-line High
		BCF	LCD_CTRL, LCD_E	; LCD E-line Low
		RETURN
;=========================================================
; LCDBUSY
; Returns when LCD busy-flag is inactive
; OK
;=========================================================
LCDBUSY
		BSF	STATUS,RP0	; Select Register page 1
		MOVLW	0x0FF		; Set PORTB for input
		MOVWF	LCD_DATA_TRIS
		BCF	STATUS, RP0	; Select Register page 0
		BCF	LCD_CTRL, LCD_RS; Set LCD for command mode
		BSF	LCD_CTRL, LCD_RW; Setup to read busy flag
		BSF	LCD_CTRL, LCD_E	; LCD E-line High
		MOVF	LCD_DATA, W	; Read busy flag + DDram address
		BCF	LCD_CTRL, LCD_E	; LCD E-line Low
		ANDLW	0x80		; Check Busy flag, High = Busy
		BTFSS	STATUS, Z
		GOTO	LCDBUSY
LCDNOTBUSY	BCF	LCD_CTRL, LCD_RW
		BSF	STATUS, RP0	; Select Register page 1
		MOVLW	0x000
		MOVWF	LCD_DATA_TRIS	; Set PORTB for output
		BCF	STATUS, RP0	; Select Register page 0
		RETURN
;=========================================================
; LCDCLEAR
; Clears display and returns cursor to home position (upper-left corner).
;
;=========================================================
LCDCLEAR
		MOVLW	0x001
		CALL	LCDPUTCMD
		RETURN
;=========================================================
; LCDHOME
; Returns cursor to home position.
; Returns display to original position (when shifted).
;
;=========================================================
LCDHOME
		MOVLW	0x002
		CALL	LCDPUTCMD
		RETURN
;=========================================================
; LCDEMODE
; Sets entry mode of display.
; Required entry mode must be set in W
;  b0	: 0 = no display shift	1 = display shift
;  b1	: 0 = auto-decrement	1 = auto-increment
;  b2-7	: don't care
; OK
;=========================================================
LCDEMODE
		ANDLW	0x003		; Strip upper bits
		IORLW	0x004		; Function set
		CALL	LCDPUTCMD
		RETURN
;=========================================================
; LCDDMODE
; Sets display control.
; Required display mode must be set in W
;  b0	: 0 = cursor blink off	1 = cursor blink on
;  b1	: 0 = cursor off	1 = cursor on
;  b2	: 0 = display off	1 = display on (display data remains in DDRAM)
;  b3-7	: don't care
; OK
;=========================================================
LCDDMODE
		ANDLW	0x007		; Strip upper bits
		IORLW	0x008		; Function set
		CALL	LCDPUTCMD
		RETURN
;=========================================================
; LCDSCGA
; Sets Character-Generator-RAM address. CGRAM is read/written after
;  this setting.
; Required CGRAM address must be set in W
;  b0-5	: required CGRAM address
;  b6-7	: don't care
;
;=========================================================
LCDSCGA
		ANDLW	0x03F		; Strip upper bits
		IORLW	0x040		; Function set
		CALL	LCDPUTCMD
		RETURN
;=========================================================
; LCDSDDA
; Sets the Display-Data-RAM address. DDRAM data is read/written after
;  this setting.
; Required DDRAM address must be set in W
;  b0-6	: required DDRAM address
;  b7	: don't care
; OK
;=========================================================
LCDSDDA
		IORLW	0x080		; Function set
		CALL	LCDPUTCMD
		RETURN
;=========================================================
; LCDGADDR
; Returns address counter contents, used for both DDRAM and CGRAM.
; RAM address is returned in W
;
;=========================================================
LCDGADDR
		BSF	STATUS,RP0	; Select Register page 1
		MOVLW	0x0FF		; Set PORTB for input
		MOVWF	LCD_DATA_TRIS
		BCF	STATUS, RP0	; Select Register page 0
		BCF	LCD_CTRL, LCD_RS; Set LCD for command mode
		BSF	LCD_CTRL, LCD_RW; Setup to read busy flag
		BSF	LCD_CTRL, LCD_E	; LCD E-line High
		MOVF	LCD_DATA, W	; Read busy flag + RAM address
		BCF	LCD_CTRL, LCD_E	; LCD E-line Low
		ANDLW	0x07F		; Strip upper bit
		BCF	LCD_CTRL, LCD_RW
		BSF	STATUS, RP0	; Select Register page 1
		MOVLW	0x000
		MOVWF	LCD_DATA_TRIS	; Set PORTB for output
		BCF	STATUS, RP0	; Select Register page 0
		RETURN
;=========================================================
; LCDPUTCHAR
; Sends character to LCD
; Required character must be in W
; OK
;=========================================================
LCDPUTCHAR
		MOVWF	LCD_TEMP	; Character to be sent is in W
		CALL	LCDBUSY		; Wait for LCD to be ready
		BCF	LCD_CTRL, LCD_RW; Set LCD in read mode
		BSF	LCD_CTRL, LCD_RS; Set LCD in data mode
		BSF	LCD_CTRL, LCD_E	; LCD E-line High
		MOVF	LCD_TEMP, W
		MOVWF	LCD_DATA	; Send data to LCD
		BCF	LCD_CTRL, LCD_E	; LCD E-line Low
		RETURN
;=========================================================
; LCDPUTCMD
; Sends command to LCD
; Required command must be in W
; OK
;=========================================================
LCDPUTCMD
		MOVWF	LCD_TEMP	; Command to be sent is in W
		CALL	LCDBUSY		; Wait for LCD to be ready
		BCF	LCD_CTRL, LCD_RW; Set LCD in read mode
		BCF	LCD_CTRL, LCD_RS; Set LCD in command mode
		BSF	LCD_CTRL, LCD_E	; LCD E-line High
		MOVF	LCD_TEMP, W
		MOVWF	LCD_DATA	; Send data to LCD
		BCF	LCD_CTRL, LCD_E	; LCD E-line Low
		RETURN






;*********************************************************
; Delay_time	= ((DELAY_value * 3) + 4) * Cycle_time
; DELAY_value	= (Delay_time - (4 * Cycle_time)) / (3 * Cycle_time)
;
; i.e. (@ 4MHz crystal)
; Delay_time	= ((32 * 3) + 4) * 1uSec
;		= 100uSec
; DELAY_value	= (500uSec - 4) / 3
;		= 165.33
;		= 165
;*********************************************************
DELAY500	MOVLW	D'165'		; +1		1 cycle
		MOVWF	DELAY		; +2		1 cycle
DELAY500_LOOP	DECFSZ	DELAY, F	; step 1	1 cycle
		GOTO	DELAY500_LOOP	; step 2	2 cycles
DELAY500_END	RETURN			; +3		2 cycles
;
;
X_DELAY500	MOVWF	X_DELAY		; +1		1 cycle
X_DELAY500_LOOP	CALL	DELAY500	; step1		wait 500uSec
		DECFSZ	X_DELAY, F	; step2		1 cycle
		GOTO	X_DELAY500_LOOP	; step3		2 cycles
X_DELAY500_END	RETURN			; +2		2 cycles






;=========================================================
; Table message to display
;=========================================================
MSG1
		addwf	PCL ,F		;Jump to char pointed to in W reg
		retlw	'+'
		retlw	'+'
		retlw	'+'
		retlw	'+'
		retlw	'+'
		retlw	'+'
		retlw	'+'
		retlw	'+'
		retlw	'+'
		retlw	'+'
		retlw	'+'
		retlw	'+'
		retlw	'+'
		retlw	'+'
		retlw	'+'
		retlw	'+'
		retlw	'+'
		retlw	'+'
		retlw	'+'
		
MSG1_END
		retlw	0
;
	IF ( (MSG1 & 0x0FF) >= (MSG1_END & 0x0FF) )
		MESSG   "Warning - User Definded: Table 'MSG1' crosses page boundry in computed jump"
	ENDIF
	return 

	
MSG2
		addwf	PCL ,F		;Jump to char pointed to in W reg
		retlw	'+'
		retlw	' '
		retlw	' '
		retlw	' '
		retlw	'R'
		retlw	'O'
		retlw	'B'
		retlw	'O'
		retlw	'T'
		retlw	'O'
		retlw	'S'
		retlw	' '
		retlw	' '
		retlw	'.'
		retlw	' '
		retlw	' '
		retlw	' '
		retlw	' '
		retlw	' '
		
MSG2_END
		retlw	0
;
	IF ( (MSG2 & 0x0FF) >= (MSG2_END & 0x0FF) )
		MESSG   "Warning - User Definded: Table 'MSG1' crosses page boundry in computed jump"
	ENDIF
	return 	

MSG3
		addwf	PCL ,F		;Jump to char pointed to in W reg
		retlw	'+'
		retlw	' '
		retlw	' '
		retlw	'F'
		retlw	'4'
		retlw	' '
		retlw	'p'
		retlw	'o'
		retlw	'u'
		retlw	'r'
		retlw	' '
		retlw	'E'
		retlw	'N'
		retlw	'T'
		retlw	'R'
		retlw	'E'
		retlw	'R'
		retlw	' '
		retlw	' '
		
MSG3_END
		retlw	0
;
	IF ( (MSG3 & 0x0FF) >= (MSG3_END & 0x0FF) )
		MESSG   "Warning - User Definded: Table 'MSG1' crosses page boundry in computed jump"
	ENDIF
	return 	
	
	
	
MSG5
		addwf	PCL ,F		;Jump to char pointed to in W reg
		retlw	'L'
		retlw	'a'
		retlw	' '
		retlw	'V'
		retlw	'i'
		retlw	't'
		retlw	'e'
		retlw	's'
		retlw	's'
		retlw	'e'
		retlw	' '
		retlw	'e'
		retlw	's'
		retlw	't'
		retlw	':'
		retlw	' '
		retlw	' '
		retlw	' '
		retlw	' '
		
MSG5_END
		retlw	0
;
	IF ( (MSG5 & 0x0FF) >= (MSG5_END & 0x0FF) )
		MESSG   "Warning - User Definded: Table 'MSG1' crosses page boundry in computed jump"
	ENDIF
	return 	
	
	
INDEX	
		call	LCDCLEAR
		MOVLW	'+'		; ASCII '0'
		MOVWF	COUNT
		MOVLW	LCD_LINE0
		CALL	LCDSDDA		; Position cursor leftmost on first line
		CALL	TABLE_MSG	; Display message
		MOVLW	LCD_LINE0 + 0x013
		CALL	LCDSDDA		; Position cursor
		MOVF	COUNT, W
		CALL	LCDPUTCHAR	; Display line number
		
		MOVLW	'+'		; ASCII '0'
		MOVWF	COUNT
		MOVLW	LCD_LINE1
		CALL	LCDSDDA		; Position cursor leftmost on first line
		CALL	TABLE_MSG1	; Display message
		MOVLW	LCD_LINE1 + 0x013
		CALL	LCDSDDA		; Position cursor
		MOVF	COUNT, W
		CALL	LCDPUTCHAR	; Display line number
		
		MOVLW	'+'		; ASCII '0'
		MOVWF	COUNT
		MOVLW	LCD_LINE2
		CALL	LCDSDDA		; Position cursor leftmost on first line
		CALL	TABLE_MSG2	; Display message
		MOVLW	LCD_LINE2 + 0x013
		CALL	LCDSDDA		; Position cursor
		MOVF	COUNT, W
		CALL	LCDPUTCHAR	; Display line number
		
		MOVLW	'+'		; ASCII '0'
		MOVWF	COUNT
		MOVLW	LCD_LINE3
		CALL	LCDSDDA		; Position cursor leftmost on first line
		CALL	TABLE_MSG3	; Display message
		MOVLW	LCD_LINE3 + 0x013
		CALL	LCDSDDA		; Position cursor
		MOVF	COUNT, W
		CALL	LCDPUTCHAR	; Display line number
		
		RETURN
VITESSE
		CALL    LCDCLEAR
		MOVLW	' '		; ASCII '0'
		MOVWF	COUNT
		MOVLW	LCD_LINE0
		CALL	LCDSDDA		; Position cursor leftmost on first line
		CALL	TABLE_MSG1	; Display message
		MOVLW	LCD_LINE0 + 0x013
		CALL	LCDSDDA		; Position cursor
		MOVF	COUNT, W
		CALL	LCDPUTCHAR	; Display line number

		MOVLW	' '		; ASCII '0'
		MOVWF	COUNT
		MOVLW	LCD_LINE2
		CALL	LCDSDDA		; Position cursor leftmost on first line
		CALL	TABLE_VIT	; Display message
		MOVLW	LCD_LINE2 + 0x013
		CALL	LCDSDDA		; Position cursor
		MOVF	COUNT, W
		CALL	LCDPUTCHAR	; Display line number	
		RETURN

Niveau

step1
		call  DELAY500	
		btfss PORTA,3
		goto step1
step2   
		call  DELAY500
		btfsc PORTA,3
		goto  step2	
step3	
		call DELAY500	
		btfss PORTA,3
		goto step3			
		return		
		
;*****************************************************************************
; Initialize processor registers
;*****************************************************************************
START					; POWER_ON Reset (Beginning of program)
		CLRF	STATUS		; Do initialization, Select bank 0
		CLRF	INTCON		; Clear int-flags, Disable interrupts
		CLRF	PCLATH		; Keep in lower 2KByte

		CLRF	PORTA		; ALL PORT output should output Low.
		CLRF	PORTB

		BSF		STATUS, RP0	; Select bank 1
		MOVLW	0x0F8		; RA2-0 outputs, RA4-3 inputs
		MOVWF	TRISA
		MOVLW	0x000		; RB7-0 outputs
		MOVWF	TRISB
		BSF		OPTION_REG, NOT_RBPU ; Disable PORTB pull-ups
	
		BCF	STATUS, RP0	; Select bank 0

		CALL	LCDINIT		; Initialize LCDisplay



			
loop
	
		CALL INDEX	
				
		call Niveau
		call VITESSE
		call Niveau
		goto loop

		
END