您可以添加到网摘 让更多人关注此文章:
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
参考链接:http://www.picavr.com/news/2008-07/7041.htm
|