請問有人可以幫我看看為什么我的代碼在isis中可以顯示但燒到單片機后只顯示一行方格啊?代碼如下:
list p=16f877A ; list directive to define processor
#include <p16f877A.inc> ; processor specific variable definitions
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC & _WRT_OFF & _LVP_ON & _CPD_OFF
COUNT EQU 24H ;定義計數寄存器地址
TMP1 EQU 25H ;定義臨時寄存器地址
PORTA EQU 5H ;定義RA口數據寄存器地址
PORTC EQU 7H ;定義RC口數據寄存器地址
TRISA EQU 85H ;定義RA口方向控制寄存器地址
TRISC EQU 87H ;定義RC口方向控制寄存器地址
ORG 00H;
NOP ;放置一條ICD必需的空操作指令
GOTO MAIN
ORG 0004H
MAIN
BSF STATUS, RP0 ;SELECT BANK1 定義RA口,RC口全部為輸出
BCF STATUS, RP1
MOVLW B'10000000'
MOVWF TRISB ;MAKE PIN 7 INPUT ELSE INPUT
MOVLW 07H
MOVWF ADCON1 ;設置RA口全部為普通數字IO口
MOVLW 00H
MOVWF TRISA
MOVWF TRISC
MOVWF TRISD
MOVLW B'00001100' ;時器,
MOVWF OPTION_REG ;時器,預分頻器分配給定時器0,分頻比1:32;開啟RB口弱上拉.
BCF STATUS, RP0 ;SELECT BANK0
BCF STATUS, RP1
CLRF PORTB ;MAKE DEFAULT PORTB 0
CLRF PORTD
BSF PORTA,0
;***********************
; LCD DISPLAY
;***********************
CALL DELAY ;調用廷時,剛上電LCD復位不一定有PIC快
MOVLW 38H
MOVWF PORTC
CALL ENABLEA
CALL DELAY
MOVLW 38H
MOVWF PORTC
CALL ENABLEA
CALL DELAY
MOVLW 38H
MOVWF PORTC
CALL ENABLEA
CALL DELAY
MOVLW 38H
MOVWF PORTC
CALL ENABLEA
CALL DELAY
MOVWF 08H
MOVWF PORTC
CALL ENABLEA
MOVLW 01H
MOVWF PORTC ;清屏MAKE COMMAND FOR LCD TO CLEAR DISPLAY
CALL ENABLE
CALL DELAY
;MOVLW B'00111000'
;MOVWF PORTC ;8位2行5x7點陣 MAKE COMMANDS FOR LCD TO DISPLAY 16X2 CHARACTER 5X7 PER CHAR 8BIT DATA COMMUNICATION
;CALL ENABLE
;MOVLW 0FH ;文字不動,光標自動右移 ENTRY MODE, SET INCREMENT MOVING CURSOR
;MOVWF PORTC
;CALL ENABLE
MOVLW 06H ;文字不動,光標自動右移 ENTRY MODE, SET INCREMENT MOVING CURSOR
MOVWF PORTC
CALL ENABLE
MOVLW 0CH ;顯示器開、光標開、閃爍開 MAKE COMMAND FOR LCD TO DISPLAY ON, CURSOR OFF, BLINK OFF
MOVWF PORTC
CALL ENABLE
MOVLW 80H
MOVWF PORTC ;顯示位置
CALL ENABLE
MOVLW B'01001010' ;J
MOVWF PORTC
BSF PORTA,1
BCF PORTA,2
BCF PORTA,3
CALL DELAY_LCD
BSF PORTA,3
;DISPLAY SUBROUTE
;***********************
;******************************************************
TABLE ;取第一行的顯示碼
ADDWF PCL,1 ;地址偏移量加當前PC值
RETLW B'01001010' ;J
RETLW B'01000001' ;A
RETLW B'01000011' ;C
RETLW B'01001011' ;K
RETLW B'00111010' ;:
RETLW B'01001111' ;O
RETLW B'01001110' ;N
RETLW 20H ;空格
RETLW 20H ;空格
RETLW B'01010110' ;V
RETLW B'01001111' ;O
RETLW B'01001001' ;I
RETLW B'01000011' ;C
RETLW B'01000101' ;E
RETLW B'01001101' ;M
RETLW B'01001111' ;O
RETLW 00H
;-------------------- ----------------------------------
TABLE1 ;取第二行的顯示碼
ADDWF PCL,1 ;地址偏移量加當前PC值
RETLW B'01000100' ;D
RETLW B'01010101' ;U
RETLW B'01001100' ;L
RETLW B'01000101' ;E
RETLW B'00111010' ;:
RETLW B'01001111' ;O
RETLW B'01001110' ;N
RETLW 20H ;空格
RETLW 20H ;空格
RETLW B'01001110' ;N
RETLW B'01001111' ;O
RETLW B'00111010' ;:
RETLW B'01001111' ;O
RETLW B'01001111' ;O
RETLW 20H ;空格
RETLW 20H ;空格
RETLW 00H
;*******************************************************
WRITE1
CLRF COUNT ;送第一行數字程序
WRITE_A
MOVFW COUNT
CALL TABLE
MOVWF TMP1
CALL WRITE3
INCF COUNT,1
MOVFW TMP1
XORLW 00H
BTFSS STATUS,Z
GOTO WRITE_A
RETLW 0
;*************************
WRITE2 ;送第二行數子程序
CLRF COUNT
WRITE2_A
MOVFW COUNT
CALL TABLE1
MOVWF TMP1
CALL WRITE3
INCF COUNT,1
MOVFW TMP1
XORLW 00H
BTFSS STATUS,Z
GOTO WRITE2_A
RETLW 0
;**************************
WRITE3 ;送數據到LCD子程序
MOVWF PORTC
BSF PORTA,1 ;RS_PIN#1
BCF PORTA,2 ;RW_PIN#2
BCF PORTA,3 ;E_PIN#3
CALL DELAY
BSF PORTA,3 ;E_PIN#3
RETLW 0
;*******************************************
ENABLEA
BCF PORTA,1 ;RS_PIN#1寫入控制命令的子程序
BCF PORTA,2 ;RW_PIN#2
BCF PORTA,3 ;E_PIN#3
CALL DELAY
BSF PORTA,3 ;E_PIN#3
RETURN
;*******************************************
ENABLE
BCF PORTA,1 ;RS_PIN#1寫入控制命令的子程序
BCF PORTA,2 ;RW_PIN#2
BCF PORTA,3 ;E_PIN#3
CALL DELAY_LCD
BSF PORTA,3 ;E_PIN#3
RETURN
DELAY_LCD
MOVLW 0FFH
MOVWF PORTC
BCF PORTA,1
BSF PORTA,2
BCF PORTA,3
NOP
BSF PORTA,3
BTFSC PORTC,7
GOTO DELAY
RETURN
DELAY ;5mS 子程序名,也是子程序入口地址
MOVLW 01FH ;將外層循環參數值FFH經過W
MOVWF 20H ;送入用作外循環變量的20H單元\
lp0
MOVLW 0A0H ;將內層循環參數值FFH經過W
MOVWF 21H ;送入用作內循環變量的21H單元
lp1
DECFSZ 21H,1 ;變量21H內容遞減,若為0跳躍
GOTO lp1 ;跳轉到LP1處
DECFSZ 20H,1 ;變量20H內容遞減,若為0跳躍
GOTO lp0 ;跳躍到LP0處
return ;返回主程序
END
|