   list       p=16f84A	     ; list directive to define proces
#include   <p16f84A.inc>     ; processor specific variable 
	
    __config _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC ;          

;***** VARIABLE DEFINITIONSBLE DEFINITIONSBLE 
 cblock  0x0C
w_temp	         		
w_temp1		                               
TEMP                                          
Temp                                      
Cnt	
DCnt
DCnt2
               
 endc                                          
 ;Define Information                                                      
 #DEFINE  RS PORTA, 0		; RC4 is RS line of LCD       
 #DEFINE  E  PORTA, 1		; RC5 is E line of LCD        
				; RB0-RB3 are D4-D7 of LCD    
 ;************************************************************                                                                                       
 ; LCD Module commands                                                                           
 ;************************************************************           
#define DISP_ON	    0x0C ; Display on                                          
#define CLR_DISP    0x01 ; Clear the Display (команда требует задержки на 5 mS)
#define ENTRY_INC   0x06 ;                                                                                                                                                     
#define LINE1       0x80 ; Начало первой линии                                 
#define LINE2       0xC0 ; Начало второй линии                                                                                                                           
#define LCD_PORT    PORTB                                                                   
;***********************************************************                                              
	org     0x00				; 
  	goto    INIT				;                  
;********************* Обработчик прерываний ***************                         
;************************ЗДЕСЬ ТАБЛИЦЫ,ПОДПРОГРАММЫ И Т.Д.**
;***********************************************************  
;*************************************************************************;                     
;                 Initialize the LCD                                      ;                     
;*************************************************************************;                     
InitLCD:                                                                                      
       call  Delay40ms	        ; Wait 40 msecs before Reset                                
       bcf   RS	                ; send an 8 bit instruction                              
       movlw 0x30		        ; Reset Command                        
       call  NybbleOut		; Send the Nybble                               
       call  Delay5ms		; Wait 5 msecs before Sending Again 
       movlw 0x30
       call  NybbleOut		; Send the Nybble                               
       call  Delay5ms           
       movlw 0x30
       call  NybbleOut		; Send the Nybble                               
       call  Delay5ms           
       movlw 0x20		;  Set 4 Bit Mode  !!!                 
       call  NybbleOut                                                                      
    ;--- Задержка на 250 uS ---                                                         
       movlw 0xD0				                                       
       movwf DCnt                                                                          
DLoopIL:                                                                                     
	decfsz DCnt, f                                                                      
	goto   DLoopIL                                                                        
	;--------------------------                                                         
	movlw   b'00101000'      ;0x28 ; 4 bit, 2 Линии, 5x7 Точек              
	call	SendINS                                                                    
	movlw	b'00010000'      ;0x10 ; display shift off                    
	call	SendINS                                                                    
	movlw	CLR_DISP	 ; Clear the Display RAM                         
	call	SendINS                                                                    
	call	Delay5ms	 ; Wait 5 msecs (Note, Can take up to 4.1 msecs) 
	movlw	ENTRY_INC	 ; increment cursor                    
	call	SendINS                                                                    
	movlw	b'00001100'      ;0x0C ; display on cursor off               
	call	SendINS                                                                    
	movlw	LINE1		 ;                                      
	call	SendINS                                                                    
      return                                                                              
;*************************************************************************;                    	
;              Send an instruction in W out to the LCD                    ;                    
;*************************************************************************;                    
SendINS:                                                                                       
        movwf    Temp	        ; Save the Temporary Value                          
        bcf      RS		; Командный режим      
        call     NybbleOut                                                                    
        movfw    Temp		; Send the HIGH Nybble 
        swapf    Temp, w	; Send the LOW Nybble                          
        call     NybbleOut                                                                    
     return                                                                                
                                                                                               
;*************************************************************************;                    
;              Send the character in W out to the LCD
;              Отправить символ в W на ЖК-дисплее           
;*************************************************************************;                    
SendASCII:				; Send nbr as ASCII character   
	    addlw    '0'                                                                          
SendCHAR:				; Отправить символ на LCD-дисплей 
	    movwf    Temp		; Сохранить временное значение                   
	    bsf	     RS			; Режим данных         
	    call     NybbleOut                                                                    
	    movfw    Temp		; Отправить старший полубайт
            swapf    Temp, w		; Отправить младший полубайт                            
	    bsf      RS			; Режим данных         
	    call     NybbleOut                                                                    
	 return                                                                                
;*************************************************************************;                              	
;              Send the nibble in W out to the LCD                        ;                              
;*************************************************************************;                              
NybbleOut:                     ; Send a Nybble to the LCD                                               
         andlw   0xf0          ; Выделяем старший полубайт                                          
         movwf   TEMP	       ; Помещаем старший полубайт во временныую переменную TEMP
	 movfw	 LCD_PORT      ; Считали данные с порта данных LCD                         
         andlw   0x0f          ; Маскируем разряды, не относящиеся к LCD                   
         iorwf   TEMP, w       ; Объединяем значащие полубайты                                      
         movwf   LCD_PORT      ; Записываем новое значение в порт данных LCD               
	 bsf	 E                                                                                      
	 bcf	 E	       ; Strobe out the LCD Data        
	 movlw	 0xD0	       ; Задержка на 250 uS !!!!!!!!!!!!!!!!                              
	 movwf	 DCnt                                                                                   
DLoop1:                                                                                                  
	 decfsz	DCnt, f                                                                                
	 goto	DLoop1                                                                                 
      return                                                                                          
                                                                                                         
;**************************************************************************                              
;      Задержка 5, 40, 80 миллисекунд                                                                    
;**************************************************************************                              
Delay80ms:                                                                                               
	movlw	0xFF ; устанавливаем начальное значение переменной (256)
	goto	$+4                                                                                    
Delay40ms:                                                                                               
	movlw	0x85 ; устанавливаем начальное значение переменной (133)
	goto	$+2  ; перескакиваем через следующий оператор  
Delay5ms:                                                                                                
	movlw   0x10    ; устанавливаем начальное значение переменной...   
	movwf   DCnt2   ; ...внешнего цикла (16)                           
DLoopOut:	                                                                                       
	movlw   0xFF    ; устанавливаем начальное значение переменной...                     
	movwf   DCnt    ; ...вложенного цикла (256)                                 
DLoopIn:		 ; Продолжительность внетреннего цикла ~0,3 mS      
	decfsz  DCnt, f   ; декремент переменной цикла                                
	goto    DLoopIn	    ; если DCnt не 0, повторить декремент                                
	decfsz  DCnt2, f    ; иначе декремент переменной внешнего цикла                 
	goto    DLoopOut    ; если DCnt2 не 0, повторить декремент                               
	return   
;------------------------------------------------------------------                          
INIT:    
	clrf    PORTA		; initialize PORTA                                                                                                             
        clrf    STATUS          	               	                                                                            
        movlw   b'00000000'                                         
        movwf   PORTA           	         
        clrf    PORTB           	                                                                                          
        bsf     STATUS, RP0     	                                   
        movlw   b'00000000'                               
        movwf   TRISA^80           
        movlw   b'00000000'                               
        movwf   TRISB^80           	                   
        bcf     STATUS, RP0    	 
    	call	InitLCD		                                                                
;****************ГЛАВНЫЙ ЦИКЛ***************************                                                                     
main:                                                                                                             
        ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;                                                           
  	movlw   LINE1+3       		; Вывод 1 CТРОКА 3 ПОЗИЦИЯ
   	call    SendINS                                           
	movlw	'H'                                              
	call	SendCHAR                                         
	movlw	'e'                                              
	call	SendCHAR                                         
	movlw	'l'                                              
	call	SendCHAR                                         
	movlw	'l'                                              
	call	SendCHAR                                         
	movlw	'o'                                              
	call	SendCHAR
	movlw	' '                                              
	call	SendCHAR
	movlw	'W'                                              
	call	SendCHAR                                         
	movlw	'o'                                              
	call	SendCHAR                                         
	movlw	'r'                                              
	call	SendCHAR                                         
	movlw	'd'                                              
	call	SendCHAR
	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	movlw   LINE2+1                  ; Вывод 2 CТРОКА 2 ПОЗИЦИЯ
	call    SendINS                                                                               
	movlw	'L'                                              
	call	SendCHAR                                         
	movlw	'C'                                              
	call	SendCHAR                                         
	movlw	'D'                                              
	call	SendCHAR                                         
	movlw	' '                                              
	call	SendCHAR                                         
	movlw	'p'                                              
	call	SendCHAR                                         
	movlw	'i'                                              
	call	SendCHAR                                         
	movlw	'c'                                              
	call	SendCHAR
	movlw	'1'                                              
	call	SendCHAR                                         
	movlw	'6'                                              
	call	SendCHAR
	movlw	'f'                                              
	call	SendCHAR                                         
	movlw	'8'                                              
	call	SendCHAR
	movlw	'4'                                              
	call	SendCHAR                                         
	movlw	'a'                                              
	call	SendCHAR
LOOP:    goto LOOP                                                 
         


            end                                        
