Z    EQU 2  ;定义0状态位的位地址
 RP0   EQU 5  ;定义页选位RP0的位地址
 #DEFINE RS PORTA,1
 #DEFINE RW PORTA,2
 #DEFINE E  PORTA,3
 COUNT EQU 24H  ;定义计数寄存器地址
 TMP1  EQU 25H  ;定义临时寄存器地址
 COUNTER EQU 26H
;**********************
  ORG 000H
  NOP        ;放置一条ICD必需的空操作指令
  GOTO MAIN
  ORG 0008H
;******************************************************
TABLE         
     ADDWF PCL,1  ;地址偏移量加当前PC值
     RETLW 20H   ;空格
     RETLW 20H   ;
     RETLW 41H   ;A
     RETLW 20H   ;
     RETLW 6CH   ;l
     RETLW 61H   ;a
     RETLW 7AH   ;z
     RETLW 79H   ;y
     RETLW 20H   ;
     RETLW 79H   ;y
     RETLW 6FH   ;o
     RETLW 75H   ;u
     RETLW 74H   ;t
     RETLW 68H   ;h
     RETLW 20H   ;
     RETLW 00H
;-------------------- ----------------------------------
TABLE1
    ADDWF PCL,1    ;地址偏移量加当前PC值                        
   RETLW 20H   ;
   RETLW 20H   ;              
   RETLW 61H   ;a
   RETLW 20H   ;
   RETLW 6CH   ;l
   RETLW 6FH  ;o
   RETLW 75H    ;u
   RETLW 73H   ;s
    RETLW 79H     ;y
    RETLW 20H     ;
    RETLW 61H     ;a
    RETLW 67H     ;g
    RETLW 65H     ;e
   RETLW 20H   ;
    RETLW 00H
;*******************************************************
;   主程序
;******************************************************
MAIN
  BSF STATUS,RP0     ;转体1
  MOVLW 0EH
 MOVWF ADCON1      ;设置RA口全部为普通数字IO口
  MOVLW 00H
  MOVWF TRISA      ;定义A口为输出
  MOVWF TRISD      ;定义D口为输出
  BCF STATUS,RP0     ;回体0
;-----------------------------------
;以下16条指令为设置LCD显示模式
;-----------------------------------
  CALL DELAY       ;调用延时,刚上电LCD复位不一定有PIC快(196MS)
  MOVLW 01H
  MOVWF PORTD       ;清屏命令,数据指针清零,所有显示清零
  CALL ENABLE      ;调用写命令程序
  MOVLW 38H
  MOVWF PORTD       ;8位2行5x7点阵
  CALL ENABLE
  MOVLW 0EH       ;显示开、光标显示、光标不显示
  MOVWF PORTD
  CALL ENABLE  ;当读或写一个字符后,地址指针加一,且光标加一
  MOVLW 06H       ;当写一个字符后,整屏显示不移动
  MOVWF PORTD
;-----------------------------------
  
  CALL ENABLE  ;设置数据地址指针
  MOVLW 80H
  MOVWF PORTD      ;第一行的位置
  CALL ENABLE
  CALL WRITE1      ;调用送第一行数子程序“WWW.PIC16.COM"
;---------------------------------
  MOVLW 0C0H
  MOVWF PORTD      ;第二行的位置
  CALL ENABLE 
  CALL WRITE2      ;调用送第二行数子程序“TEL0755-83643980"
  GOTO  $
;****************** 送第一行数字程序***************
WRITE1
  CLRF COUNT      ;清0查表偏移地址
WRITE_A
  MOVF COUNT,W
  CALL TABLE      ;查表,显示A LAZY YOUTH
  MOVWF TMP1      ;送暂存器
  INCF COUNT,1     ;偏移地址加1
  MOVF TMP1,W     
  XORLW 00H       ;判断是否显示完所有数据(约定表格做后一个00H做为结束标志)
  BTFSC STATUS,Z
  GOTO  ET       ;全部显示完成
  MOVF TMP1,W
  CALL WRITE3      ;没有显示完,把当前查表所得数据送LCD显示
  GOTO WRITE_A     ;调用显示程序
ET NOP
  RETURN        ;子程序返回
;*******************送第二行数子程序**************
WRITE2       
  CLRF COUNT      ;清0查表偏移地址
WRITE2_A
 MOVF COUNT,W
  CALL TABLE1     ;查表,显示A LOUSY AGE
  MOVWF TMP1
  INCF COUNT,1     ;偏移地址加1
  MOVF TMP1,W
  XORLW 00H      ;判断是否显示完所有数据
  BTFSC STATUS,Z
  GOTO ET1       ;
  MOVF TMP1,W
  CALL WRITE3     ;调用显示程序
 GOTO WRITE2_A
ET1 NOP
  RETURN         ;是,程序返回
;*******************送数据到LCD子程序*************
WRITE3
       
 MOVWF PORTD     
  BSF RS
  BCF RW
  BCF E
  CALL DELAY 
  BSF E
  RETURN
;*******************写命令程序********************
ENABLE
  BCF RS    ;写入控制命令的子程序
  BCF RW
  BCF E
  CALL DELAY ;高脉冲使能
  BSF E
  RETURN
;*********************延时子程序******************
DELAY       
 MOVLW  0FFH    ;将外层循环参数值FFH经过W
 MOVWF  20H     ;送入用作外循环变量的20H单元
LP0
 MOVLW  0FFH    ;将内层循环参数值FFH经过W
 MOVWF  21H     ;送入用作内循环变量的21H单元
LP1
 DECFSZ 21H,1    ;变量21H内容递减,若为0跳跃
 GOTO   LP1    ;跳转到LP1处
 DECFSZ  20H,1   ;变量20H内容递减,若为0跳跃
 GOTO   LP0    ;跳跃到LP0处
 RETURN        ;返回主程序
;--------------------------------------------------------------
  END