打印

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

[复制链接]
2402|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sidneyysk|  楼主 | 2011-11-4 10:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这个液晶显示程序怎么不能显示,望各位帮忙解答下,谢谢!
其中RS接单片机的RA3,RW接RA2,EN接RA1。液晶采用4线数据传输方式,液晶的D7~D4分别接PIC单片机16f873a的RB0~RB3
LIST P=16F873A           ;  告诉编译程序使用何种PIC单片机
        INCLUDE "p16f873A.inc"   ;  定义了特殊寄存器等内容的头文件     
        __CONFIG _PWRTE_OFF & _XT_OSC & _WDT_OFF   ;  配置字

COM        EQU      20H         ;指令专用寄存器
DAT        EQU      21H         ;数据专用寄存器     
I             EQU      25H
J             EQU      26H   
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          ;选择寄存器体1
  BCF STATUS,06H
  MOVLW  0FFH
  MOVWF  TRISB             ;将RB口置位输入
  BCF STATUS,05H
  BCF PORTA,RS             ;选择指令
  BSF PORTA,RW            ;选择读
  BSF PORTA,EN             ;使能线电平变化
  BTFSC PORTB,00H       ;读忙状态,不忙时退出,忙时继续检测
  GOTO BUSY
  BCF PORTA,EN             ;恢复使能电平
  BSF STATUS,05H         ;返回寄存器体0
  MOVLW 0FH
  MOVWF TRISB             ;将RB0置为输出
  BCF  STATUS,05H
  RETURN
;=======================
;1602写指令
;=======================
LCD_COM
  BCF  PORTA,RS           ;选择指令寄存器
  BCF  PORTA,RW          ;选择写
  MOVF  COM,W
  MOVWF PORTB           ;送命令字到RB口
  BSF  PORTA,EN           ;使能电平置高,命令字传送
  NOP
  BCF  PORTA,EN           ;恢复使能线电平
  RETURN
;======================
;1602写数据指令
;======================
LCD_DAT
  BSF PORTA,RS           ;选择数据寄存器
  BCF PORTA,RW          ;选择写
  MOVF  DAT,W            ;将数据送到B口
  MOVWF PORTB
  BSF PORTA,EN           ;使能线电平置高,数据传送
  NOP
  BCF  PORTA,EN
  RETURN
;======================
;1602初始化函数
;D4~D7对应RB3~RB0
;======================
LCDRESET
  CALL DELAY            ;延时15ms
  CALL DELAY
  CALL DELAY
  MOVLW 02H            ;送命令字28H,液晶模式设置:4位数据,双行,5*7点阵
  MOVWF COM
  CALL LCD_COM
  MOVLW 08H
  MOVWF COM
  CALL LCD_COM

  CALL DELAY
  MOVLW 02H            ;重复读写命令字28H3次
  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             ;显示模式设置  4位数据,双行,5*7字符点阵
  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         ;写第一行起始地址80H
  MOVWF  COM
  CALL   LCD_COM
  MOVLW  00H
  MOVWF  COM
  CALL  LCD_COM
  CALL  BUSY
  MOVLW  04H               ;送字母'A'的ASCII码41H,显示'A'
  MOVWF  DAT
  CALL   LCD_DAT
  MOVLW  01H
  MOVWF  DAT
  CALL   LCD_DAT
   
STOP
  CLRWDT
  GOTO STOP
  END

相关帖子

沙发
sidneyysk|  楼主 | 2011-11-4 13:26 | 只看该作者
大家帮忙解决一下啊,不胜感激!

使用特权

评论回复
板凳
lost1421| | 2011-11-4 13:44 | 只看该作者
本帖最后由 lost1421 于 2011-11-4 13:47 编辑

楼主使用的4位数据总线与LCD1602进行通讯,在进行数据交换时,要注意数据的正确性。
你的代码:
;=======================
;1602写指令
;=======================
LCD_COM
  BCF  PORTA,RS           ;选择指令寄存器
  BCF  PORTA,RW          ;选择写
  MOVF  COM,W
  MOVWF PORTB           ;送命令字到RB口
  BSF  PORTA,EN           ;使能电平置高,命令字传送
  NOP
  BCF  PORTA,EN           ;恢复使能线电平
  RETURN
;======================
;1602写数据指令
;======================
LCD_DAT
  BSF PORTA,RS           ;选择数据寄存器
  BCF PORTA,RW          ;选择写
  MOVF  DAT,W            ;将数据送到B口
  MOVWF PORTB
  BSF PORTA,EN           ;使能线电平置高,数据传送
  NOP
  BCF  PORTA,EN
  RETURN
-----------
在引脚电平变化后,加几个NOP,不知道你的频率是多少,有可能LCD内部不能及时处理你的信号。

另外LCD的初始化的命令字好像和我以前使用时不一样:
        lcd_write_cmd (0x28);        // 2 lines, 5x8 character matrix
        lcd_write_cmd (0x0C);        // Display ctrl: Disp=ON, Curs/Blnk=OFF
        lcd_write_cmd (0x06);        // Entry mode:  Move right,  no shift
        lcd_write_cmd(0x80);        // Set DDRAM address counter to 0

使用特权

评论回复
地板
lost1421| | 2011-11-4 13:45 | 只看该作者
楼主使用的4位数据总线与LCD1602进行通讯,在进行数据交换时,要注意数据的正确性。
你的代码:
;=======================
;1602写指令
;=======================
LCD_COM
  BCF  PORTA,RS           ;选择指令寄存器
  BCF  PORTA,RW          ;选择写
  MOVF  COM,W
  MOVWF PORTB           ;送命令字到RB口
  BSF  PORTA,EN           ;使能电平置高,命令字传送
  NOP
  BCF  PORTA,EN           ;恢复使能线电平
  RETURN
;======================
;1602写数据指令
;======================
LCD_DAT
  BSF PORTA,RS           ;选择数据寄存器
  BCF PORTA,RW          ;选择写
  MOVF  DAT,W            ;将数据送到B口
  MOVWF PORTB
  BSF PORTA,EN           ;使能线电平置高,数据传送
  NOP
  BCF  PORTA,EN
  RETURN
-----------
在引脚电平变化后,加几个NOP,不知道你的频率是多少,有可能LCD内部不能及时处理你的信号。

另外LCD的初始化的命令字好像和我以前使用时不一样:
        lcd_write_cmd (0x28);        // 2 lines, 5x8 character matrix
        lcd_write_cmd (0x0C);        // Display ctrl:Disp=ON,Curs/Blnk=OFF
        lcd_write_cmd (0x06);        // Entry mode: Move right, no shift
        lcd_write_cmd(0x80);        // Set DDRAM address counter to 0

使用特权

评论回复
5
sidneyysk|  楼主 | 2011-11-4 13:53 | 只看该作者
命令字应该没有问题,我用的是28H,01H,06H,0FH,只是加了个光标。我用的是4MHz频率,应该要多加几个NOP吗?

使用特权

评论回复
6
sidneyysk|  楼主 | 2011-11-7 09:07 | 只看该作者
顶上,大家帮忙解决下,本人不胜感激!

使用特权

评论回复
7
sidneyysk|  楼主 | 2011-11-8 16:25 | 只看该作者
有木有人帮忙指点一下啊?

使用特权

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

本版积分规则

0

主题

12

帖子

1

粉丝