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