打印

1602显示程序不知什么地方有问题,求助

[复制链接]
1868|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sidneyysk|  楼主 | 2011-11-2 14:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

不知道这个程序有什么问题,液晶怎么不能显示呀?望高手帮帮忙
RS接A3,RW接A2,EN接A1。采用四位数据总线方式传输数据,D7~D4接B3~B0
LIST P=16F873A           ;  告诉编译程序使用何种PIC单片机
        INCLUDE "p16f873A.inc"   ;  定义了特殊寄存器等内容的头文件     
        __CONFIG _PWRTE_OFF & _XT_OSC & _WDT_OFF   ;  配置字

COM       EQU      20H         ;指令专用寄存器
DAT       EQU      21H         ;数据专用寄存器
COMR     EQU      22H
BUF        EQU      23H        

I            EQU      25H
J            EQU      26H   
T           EQU      27H

RS         EQU      3     ;指令数据信号线
RW        EQU      2     ;读/写指令信号线
EN         EQU      1     ;使能信号线

  ORG 0X00
  GOTO main
  ORG 0X10
;=====================   
;延时5ms子函数
;=====================
DELAY
  MOVLW  0AH
  MOVWF  I
D1
  MOVLW  0A4H
  MOVWF  J
D2
  DECFSZ  J        ;J自动减1为0则跳
  GOTO   D2
  DECFSZ  I        ;I自动减1为0则跳
  GOTO    D1
  RETLW   0
;========================
;1602忙检测函数
;========================
BUSY
  BSF STATUS,05H
  BCF STATUS,06H
  MOVLW  0FFH
  MOVWF  TRISB
  BCF STATUS,05H
  BCF PORTA,RS
  BSF PORTA,RW
  BSF PORTA,EN
  BTFSC PORTB,00H
  GOTO BUSY
  BCF PORTA,EN
  BSF STATUS,05H
  MOVLW 0FH
  MOVWF TRISB
  BCF  STATUS,05H
  RETURN
;=======================
;1602写指令
;=======================
LCD_COM
  BCF  PORTA,RS
  BCF  PORTA,RW
  BSF  PORTA,EN
  MOVF  COM,W
  MOVWF PORTB
  BCF  PORTA,EN
  RETURN
;======================
;1602写数据指令
;======================
LCD_DAT
  BSF PORTA,RS
  BCF PORTA,RW
  BSF PORTA,EN
  MOVF  DAT,W
  MOVWF PORTB
  BCF  PORTA,EN
  RETURN
;======================
;1602初始化函数
;======================
LCDRESET
  CALL DELAY
  CALL BUSY
  MOVLW 02H                 ;设置显示方式
  MOVWF COM
  CALL LCD_COM
  MOVLW 08H
  MOVWF COM
  CALL LCD_COM
  
  CALL BUSY
  MOVLW 00H               ;显示开关控制  显示功能关,无光标
  MOVWF COM
  CALL LCD_COM
  MOVLW 08H
  MOVWF COM
  CALL LCD_COM


  CALL BUSY               ;清屏指令
  MOVLW 00H
  MOVWF COM
  CALL LCD_COM
  MOVLW 01H
  MOVWF COM
  CALL LCD_COM


  CALL BUSY
  MOVLW 00H                ;设置输入模式  地址自动加1
  MOVWF COM
  CALL LCD_COM

  MOVLW 06H

  MOVWF COM
  CALL LCD_COM


  CALL BUSY                 ;显示开关控制 显示功能开,光标显示
  MOVLW 00H
  MOVWF COM
  CALL LCD_COM
  MOVLW 0FH
  MOVWF COM
  CALL LCD_COM
  RETURN

;=========================
;初始化函数
;=========================

INIT
  CLRWDT
  BSF STATUS, RP0
  BCF STATUS, RP1
  MOVLW 0EH            ;RA0为模拟量输入口,其他为数字量
  MOVWF ADCON1         
  MOVLW 80H            
  OPTION               ;关闭RB口电平变化功能
  MOVLW 0D1H
  MOVWF TRISA          ;RA1,RA2,RA3,RA5置为输出,其他未用设置为输入
  MOVLW 0C0H
  MOVWF TRISB          ;RB0-RB5置为输出,其他为未用设置为输入
  MOVLW 0FEH
  MOVWF TRISC          ;RC0为输出,其他未用设置为输入
  BCF INTCON, 3        ;RB口电平变化中断禁止
  BCF STATUS, RP0
  RETURN

;=======================
;主函数
;=======================
main

  CALL  INIT
  CALL   LCDRESET
  
  CALL BUSY
  MOVLW  08H         ;第一行起始地址
  MOVWF  COM
  CALL   LCD_COM
  MOVLW  00H
  MOVWF  COM
  CALL  LCD_COM

  CALL  BUSY
  MOVLW  04H               ;显示'A'
  MOVWF  DAT
  CALL   LCD_DAT
  MOVLW  01H
  MOVWF  DAT
  CALL   LCD_DAT
   
STOP
  CLRWDT
  GOTO STOP
  END


不知道这个程序有什么问题,液晶怎么不能显示呀?望高手帮帮忙
RS接A3,RW接A2,EN接A1。采用四位数据总线方式传输数据,D7~D4接B3~B0
LIST P=16F873A           ;  告诉编译程序使用何种PIC单片机
        INCLUDE "p16f873A.inc"   ;  定义了特殊寄存器等内容的头文件     
        __CONFIG _PWRTE_OFF & _XT_OSC & _WDT_OFF   ;  配置字

COM       EQU      20H         ;指令专用寄存器
DAT       EQU      21H         ;数据专用寄存器
COMR     EQU      22H
BUF        EQU      23H        

I            EQU      25H
J            EQU      26H   
T           EQU      27H

RS         EQU      3     ;指令数据信号线
RW        EQU      2     ;读/写指令信号线
EN         EQU      1     ;使能信号线

  ORG 0X00
  GOTO main
  ORG 0X10
;=====================   
;延时5ms子函数
;=====================
DELAY
  MOVLW  0AH
  MOVWF  I
D1
  MOVLW  0A4H
  MOVWF  J
D2
  DECFSZ  J        ;J自动减1为0则跳
  GOTO   D2
  DECFSZ  I        ;I自动减1为0则跳
  GOTO    D1
  RETLW   0
;========================
;1602忙检测函数
;========================
BUSY
  BSF STATUS,05H
  BCF STATUS,06H
  MOVLW  0FFH
  MOVWF  TRISB
  BCF STATUS,05H
  BCF PORTA,RS
  BSF PORTA,RW
  BSF PORTA,EN
  BTFSC PORTB,00H
  GOTO BUSY
  BCF PORTA,EN
  BSF STATUS,05H
  MOVLW 0FH
  MOVWF TRISB
  BCF  STATUS,05H
  RETURN
;=======================
;1602写指令
;=======================
LCD_COM
  BCF  PORTA,RS
  BCF  PORTA,RW
  BSF  PORTA,EN
  MOVF  COM,W
  MOVWF PORTB
  BCF  PORTA,EN
  RETURN
;======================
;1602写数据指令
;======================
LCD_DAT
  BSF PORTA,RS
  BCF PORTA,RW
  BSF PORTA,EN
  MOVF  DAT,W
  MOVWF PORTB
  BCF  PORTA,EN
  RETURN
;======================
;1602初始化函数
;======================
LCDRESET

  CALL DELAY
  CALL DELAY
  CALL DELAY
  MOVLW 02H                 
  MOVWF COM
  CALL LCD_COM
  MOVLW 08H
  MOVWF COM
  CALL LCD_COM


  CALL DELAY
  MOVLW 02H                 

  MOVWF COM
  CALL LCD_COM
  MOVLW 08H
  MOVWF COM
  CALL LCD_COM

  CALL DELAY
  MOVLW 02H               
  MOVWF COM
  CALL LCD_COM
  MOVLW 08H
  MOVWF COM
  CALL LCD_COM


  CALL DELAY
  CALL BUSY
  MOVLW 02H                 ;设置显示方式
  MOVWF COM
  CALL LCD_COM
  MOVLW 08H
  MOVWF COM
  CALL LCD_COM
  
  CALL BUSY
  MOVLW 00H               ;显示开关控制  显示功能关,无光标
  MOVWF COM
  CALL LCD_COM
  MOVLW 08H
  MOVWF COM
  CALL LCD_COM


  CALL BUSY               ;清屏指令
  MOVLW 00H
  MOVWF COM
  CALL LCD_COM
  MOVLW 01H
  MOVWF COM
  CALL LCD_COM


  CALL BUSY
  MOVLW 00H                ;设置输入模式  地址自动加1
  MOVWF COM
  CALL LCD_COM

  MOVLW 06H

  MOVWF COM
  CALL LCD_COM


  CALL BUSY                 ;显示开关控制 显示功能开,光标显示
  MOVLW 00H
  MOVWF COM
  CALL LCD_COM
  MOVLW 0FH
  MOVWF COM
  CALL LCD_COM
  RETURN

;=========================
;初始化函数
;=========================

INIT
  CLRWDT
  BSF STATUS, RP0
  BCF STATUS, RP1
  MOVLW 0EH            ;RA0为模拟量输入口,其他为数字量
  MOVWF ADCON1         
  MOVLW 80H            
  OPTION               ;关闭RB口电平变化功能
  MOVLW 0D1H
  MOVWF TRISA          ;RA1,RA2,RA3,RA5置为输出,其他未用设置为输入
  MOVLW 0C0H
  MOVWF TRISB          ;RB0-RB5置为输出,其他为未用设置为输入
  MOVLW 0FEH
  MOVWF TRISC          ;RC0为输出,其他未用设置为输入
  BCF INTCON, 3        ;RB口电平变化中断禁止
  BCF STATUS, RP0
  RETURN

;=======================
;主函数
;=======================
main

  CALL  INIT
  CALL   LCDRESET
  
  CALL BUSY
  MOVLW  08H         ;第一行起始地址
  MOVWF  COM
  CALL   LCD_COM
  MOVLW  00H
  MOVWF  COM
  CALL  LCD_COM

  CALL  BUSY
  MOVLW  04H               ;显示'A'
  MOVWF  DAT
  CALL   LCD_DAT
  MOVLW  01H
  MOVWF  DAT
  CALL   LCD_DAT
   
STOP
  CLRWDT
  GOTO STOP
  END

相关帖子

沙发
chenluck| | 2011-11-2 15:59 | 只看该作者
你的时序不对的,改成如下试试:
BSF PORTA,RS
  BCF PORTA,RW

    MOVF  DAT,W
  MOVWF PORTB
  
  BSF PORTA,EN
  NOP
BCF  PORTA,EN

RETURN

使用特权

评论回复
板凳
lost1421| | 2011-11-2 16:12 | 只看该作者
注释为什么这么少?
写汇编语言的关键是:每条语句后面要加注释,并说明作用。

使用特权

评论回复
地板
ningling_21| | 2011-11-2 16:49 | 只看该作者
先搞清楚DATASHEET,再写CODE...

使用特权

评论回复
5
diweo| | 2011-11-2 18:04 | 只看该作者
看着程序代码就头晕

使用特权

评论回复
6
wgsxsm| | 2011-11-2 18:40 | 只看该作者
这种液晶最好把初始化程序写好就OK了,判忙可以不要。。。
汇编看不懂。。。

使用特权

评论回复
7
sidneyysk|  楼主 | 2011-11-3 09:13 | 只看该作者
4# ningling_21



请问初始化指令有错吗?烦请指出错误之处,谢!

使用特权

评论回复
8
sidneyysk|  楼主 | 2011-11-3 09:15 | 只看该作者
2# chenluck

兄弟,改以后还是不行啊

使用特权

评论回复
9
lost1421| | 2011-11-3 11:17 | 只看该作者
汇编代码应该这样写:
;===============================================
;名称: PAUSE_TASK
;输入: A
;输出: 无
;功能:
;===============================================
PAUSE_TASK:
                JNB        POWER_BIT,EXIT_PAUSE_TASK        ; Check whether Power is OFF, yes and jump
                JNB        PAUSE_BIT,EXIT_PAUSE_TASK        ; Check whether the PAUSE is set, No jump to count down
                MOV        A,TIMER_TICK                        ;
                JNZ        EXIT_PAUSE_TASK                        ; Check whether it is zero
                MOV        TIMER_TICK,#TIMER_NUM                ; Reset the times of Timer0
                MOV        A,PAUSE_DATA                        ; Read PAUSE_DATA
                JNZ        DEC_PAUSE_DATA                        ; Check whether PAUSE_DATA is equal 0, No and jump to end
                CLR        PAUSE_BIT                        ; Yes, clear the PAUSE mark
                CLR        POWER_PIN                        ; Start to run
                CLR        KEY_OPT_BIT                        ; Clear Key operation bit to inform system that the key operation has been done.
                RET
        DEC_PAUSE_DATA:
                DEC        PAUSE_DATA                        ; PAUSE DATA subtract 1
EXIT_PAUSE_TASK:
                RET
-------------------------------------------------------------------------------------------

你不详细注释,谁能在短时间内看懂你的代码?

使用特权

评论回复
10
dafen58| | 2011-11-3 11:25 | 只看该作者
汇编?天书啊:lol

使用特权

评论回复
11
sidneyysk|  楼主 | 2011-11-3 13:18 | 只看该作者
9# lost1421

好的,我再发一个详细的,大家帮忙看看

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

12

帖子

1

粉丝