最近遇到的问题,液晶说什么也不显示,期望高手指点。程序如下:<br /> list p=16f873a ; list directive to define processor<br /> #include <p16f873a.inc> ; processor specific variable definitions<br />; __CONFIG _CP_OFF & _WDT_ON & _BODEN_ON & _PWRTE_ON & _XT_OSC<br />;-------------------------------<br />;RB1 --> SID<br />;RB0 --> SCL<br />;RC0 --> RS<br />;RC1 --> CS1<br />;RA3 --> RESET<br />;-------------------------------<br />;***** VARIABLE DEFINITIONS<br /> CBLOCK 0X20<br />PR_COUNT<br />PR_OUT<br />PR_DATA<br />LCD_D_CON1<br />LCD_D_CON2<br />DAT1<br />DAT2<br />D5_COUNT1<br />D5_COUNT2<br /> ENDC<br />;**********************************************************************<br /> ORG 0X000 ; PROCESSOR RESET VECTOR<br /> NOP<br /> GOTO INITIAL ; GO TO BEGINNING OF PROGRAM<br /><br /> ORG 0X004 ; INTERRUPT VECTOR LOCATION<br /> RETFIE ; RETURN FROM INTERRUPT<br /> <br />INITIAL ;初始化程序<br />;-------------------------------- <br />;SPECIAL REG <br />;--------------------------------<br /> CLRWDT<br /> BCF STATUS,RP0<br /> CLRF PORTA<br /> CLRF PORTB<br /> CLRF PORTC<br /> MOVLW 0X80 ;10000000<br /> MOVWF ADCON0<br /> CLRF ADRESH ;873<br /> MOVLW 0C0H ;11000000<br /> MOVWF RCSTA <br /> BSF STATUS,RP0<br /> CLRF TRISA <br /> CLRF TRISB ;RB0-RB7,总线<br /> MOVLW 0X80 ;1000,0000<br /> MOVWF TRISC <br /> MOVLW 0X02 ;<br /> MOVWF ADCON1<br /> CLRF ADRESL ;873<br /> MOVLW 0X0D ;0000 1110<br /> MOVWF OPTION_REG<br />;-------------------------------<br /> BCF STATUS,RP0<br /> CALL LCD_INITIAL<br />;-------------------------------<br />;上电 <br />;------------------------------- <br /> BSF STATUS,RP0<br /> BSF PCON,1 ;POWER-ON<br /> BSF PCON,0 ;BOD<br />;---------------------------------<br />; MAIN PROGRAM<br />;---------------------------------<br />MAIN<br /> CLRWDT<br /> BCF STATUS,RP0<br /> <br /> MOVLW 0B0H ;初始页地址<br /> MOVWF PR_DATA<br /> CALL LCD_PR1<br /> <br /> MOVLW 10H ;初始列地址高8位<br /> MOVWF PR_DATA<br /> CALL LCD_PR1<br /> <br /> MOVLW 0H ;初始列地址低8位<br /> MOVWF PR_DATA<br /> CALL LCD_PR1<br /><br /> MOVLW 0A5H ;全显<br /> MOVWF PR_DATA<br /> CALL LCD_PR1<br /> CALL LCD_DELAY1<br /> CALL LCD_DELAY1<br /> CALL LCD_DELAY1<br /> <br /> GOTO $<br /> GOTO MAIN<br />;---------------------------------<br />; -SUBPROGRAM- 液晶初始化<br />LCD_INITIAL<br />;---------------------------------<br /> BCF STATUS,RP0<br /> <br /> BCF PORTA,3 ;硬件复位<br /> CALL LCD_DELAY1<br /> BSF PORTA,3<br /> <br /> MOVLW 0E2H ;软件复位<br /> MOVWF PR_DATA<br /> CALL LCD_PR1<br /> CALL LCD_DELAY1<br /> <br /> MOVLW 0A2H ;LCD BIAS=1/9<br /> MOVWF PR_DATA<br /> CALL LCD_PR1<br /> <br /> MOVLW 0A0H ;列地址移动方向:ADC=0<br /> MOVWF PR_DATA<br /> CALL LCD_PR1<br /> <br /> MOVLW 0C8H ;行扫描方向:SHL=1<br /> MOVWF PR_DATA<br /> CALL LCD_PR1<br /> CALL LCD_DELAY1<br /> <br /> MOVLW 02FH ;电源控制模式:vc,vr,vf=111<br /> MOVWF PR_DATA<br /> CALL LCD_PR1<br /> CALL LCD_DELAY1<br /> <br /> MOVLW 26H ;内部调整电阻比:R2,R1,R0=111<br /> MOVWF PR_DATA<br /> CALL LCD_PR1<br /> CALL LCD_DELAY1<br /> <br /> MOVLW 81H ;对比度寄存器模式<br /> MOVWF PR_DATA<br /> CALL LCD_PR1<br /> <br /> MOVLW 20H ;对比度寄存器值<br /> MOVWF PR_DATA<br /> CALL LCD_PR1<br /> <br /> MOVLW 40H ;起始行<br /> MOVWF PR_DATA<br /> CALL LCD_PR1<br /> <br /> MOVLW 0E0H ;写入数据时列地址自动加1,读不变<br /> MOVWF PR_DATA<br /> CALL LCD_PR1<br /> <br /> MOVLW 0AFH ;开显示<br /> MOVWF PR_DATA<br /> CALL LCD_PR1<br /> <br /> RETURN<br />;---------------------------------<br />; -SUBPROGRAM- 写入控制命令<br />LCD_PR1<br />;---------------------------------<br /> BCF STATUS,RP0<br /> MOVLW 8H<br /> MOVWF PR_COUNT<br /> <br /> BCF PORTC,1 ;选芯片<br /> BCF PORTC,0 ;选命令寄存器<br /> <br /> MOVF PR_DATA,W ;将要发送的数据送入发送寄存器PR_OUT<br /> MOVWF PR_OUT<br />LCD_I_WRITE1<br /> BCF PORTB,0 ;SCL=0<br /> BTFSS PR_OUT,7 ;判断发送寄存器最高位值,输出到SID<br /> BCF PORTB,1<br /> BTFSC PR_OUT,7<br /> BSF PORTB,1<br /> NOP<br /> NOP<br /> BSF PORTB,0 ;SCL=1<br /> NOP<br /> NOP<br /> DECFSZ PR_COUNT,F ;判断循环次数<br /> GOTO LCD_I_WRITE2 ;不为0跳转至LCD_I_WRITE2<br /> BSF PORTC,1 ;为0,恢复芯片并返回<br /> RETURN<br />LCD_I_WRITE2<br /> RLF PR_OUT,F ;左移一位<br /> GOTO LCD_I_WRITE1<br /> RETURN<br />;---------------------------------<br />; -SUBPROGRAM- 写入显示数据<br />LCD_PR2<br />;---------------------------------<br /> MOVLW 8H<br /> MOVWF PR_COUNT<br /> BSF PORTC,0 ;选数据寄存器<br /> BCF PORTC,1<br /> MOVF PR_DATA,W<br /> MOVWF PR_OUT<br />LCD_D_WRITE1<br /> BCF PORTB,0<br /> BTFSS PR_OUT,7<br /> BCF PORTB,1<br /> BTFSC PR_OUT,7<br /> BSF PORTB,1<br /> NOP<br /> NOP<br /> BSF PORTB,0<br /> NOP<br /> NOP<br /> DECFSZ PR_COUNT,F<br /> GOTO LCD_D_WRITE2<br /> BSF PORTC,1<br /> RETURN<br />LCD_D_WRITE2<br /> RLF PR_OUT,F<br /> GOTO LCD_D_WRITE1<br /> RETURN<br />;---------------------------------<br />; -SUBPROGRAM- 400us 4M晶振,延时400us<br />LCD_DELAY1<br />;---------------------------------<br /> BCF STATUS,RP0<br /> MOVLW 17H<br /> MOVWF LCD_D_CON1<br />LCD_DLOOP1<br /> CLRWDT<br /> DECFSZ LCD_D_CON1,1<br /> GOTO LCD_DLOOP1<br /> NOP<br /> NOP<br /> RETURN<br />;---------------------------------<br />; -SUBPROGRAM- 0.64S 4M晶振,延时约0.64s<br />LCD_DELAY2<br />;---------------------------------<br /> BCF STATUS,RP0<br /> MOVLW 80H<br /> MOVWF LCD_D_CON2<br />LDLOOP<br /> DECFSZ LCD_D_CON2<br /> GOTO $+2<br /> RETURN<br /> CALL DELAY_5MS<br /> GOTO LDLOOP<br /> RETURN<br />;---------------------------------<br />; -SUBPROGRAM- 5MS 4M晶振,延时5ms<br />DELAY_5MS<br />;---------------------------------<br /> BCF STATUS,RP0<br /> MOVLW 0FH<br /> MOVWF D5_COUNT1<br />D5_LOOP2<br /> MOVLW 6DH<br /> MOVWF D5_COUNT2<br />D5_LOOP1<br /> DECFSZ D_COUNT1,1<br /> GOTO D5_LOOP1<br /> DECFSZ D_COUNT2,1<br /> GOTO D5_LOOP2<br /> RETURN<br />;---------------------------------<br /> END<br />小弟先谢过了。 |
|