论坛风格切换切换到宽版
  • 8393阅读
  • 28回复

1602液晶屏的4bit驱动 [复制链接]

上一主题 下一主题
离线BG7NBK
 
发帖
100
只看楼主 倒序阅读 0楼 发表于: 2005-04-26
看了很多1602的资料,知道1602可以用4位数据线,但是资料中都是对8位数据线说明的,不知道4位数据线怎样写入各种命令和数据。
离线BA5RW
发帖
48265
只看该作者 1楼 发表于: 2005-04-26
意义不大,就省四条线,写起来很麻烦.尤其是用汇编的时候.所以我直接用八根数据线的,不容易出错.
离线BG7NBK
发帖
100
只看该作者 2楼 发表于: 2005-04-26
省4条线还是很有用的,我打算用2051做mcu控制9851。
离线BA5RW
发帖
48265
只看该作者 3楼 发表于: 2005-04-26
哦,有点麻烦.         
离线transmit
只看该作者 4楼 发表于: 2005-04-27
留个邮箱,我有源程序,仅供参考
离线BA5RW
发帖
48265
只看该作者 5楼 发表于: 2005-04-27
光源程序没有用的,楼主去要一份说明书就可以了,上面有命令格式,配合例题和实验琢磨几天就会了.
离线xiongjunfeng
发帖
1220
只看该作者 6楼 发表于: 2005-04-27
先送高四位,再送低四位!!我做的控制就是这样联的省四个i/o口
离线BG7NBK
发帖
100
只看该作者 7楼 发表于: 2005-04-27
'
光源程序没有用的,楼主去要一份说明书就可以了,上面有命令格式,配合例题和实验琢磨几天就会了.
'
说明书中只说有4bit模式,但是没有说如何用4bit模式。
离线BD7RC
发帖
3283
只看该作者 8楼 发表于: 2005-04-27
1、在初始化液晶显示模块时,先声明是4位总线模式(送控制字为28h,原来8位总线的是38h)

2、送显示的数据时,原来一次就送8位的,现在要分两次送出,先高4位后低4位。

其他的和8位的差别不大。


'
说明书中只说有4bit模式,但是没有说如何用4bit模式。
'
离线BG7NBK
发帖
100
只看该作者 9楼 发表于: 2005-04-27
'
先送高四位,再送低四位!!我做的控制就是这样联的省四个i/o口
'
能不能说的详细点,怎样进入4bit模式?
开机都是8bit模式吧。
离线BA5RW
发帖
48265
只看该作者 10楼 发表于: 2005-04-27
你的说明书肯定有控制命令格式(控制字)的,其中就有一位专门用来申明几线传送方式的。
离线BD7RC
发帖
3283
只看该作者 11楼 发表于: 2005-04-27
《用单片机控制字符型液晶显示模块》一文的补充
《电子报》2003年,第6期,类别:智能电子


  《电子报》2001年第45期第十二版《用单片机控制字符型液晶显示模块》一文,详细地介绍了DM-162液晶模块的使用方法。从实际使用中遇到的问题来看,本人认为有以下两点需要补充说明:
  一、DM-162液晶模块提供了8位双向数据线(D0~D7),支持4位数据总线和8位数据总线两种接口方式。在实际使用中,由于单片机I/O端口数的限制,往往需要用到4位数据总线方式。其实,4位数据总线进行数据操作时,是先处理高4位数据,后处理低4位数据。下面举例说明4位数据总线的使用方法。DM-162液晶模块与AT89C51接口电路如附图。
  在第二行第一个字符处(40H)显示字符“A”的程序如下:
  RS   EQU P3.7
  RW EQU P3.6
  E     EQU P3.5
  D7 EQU P1.7
     ORG 0000H
        MOV A,#01H   ;清屏
        CALL W_INSTRU
      MOV     A,#28H   ;4位总线2行5×7点阵
      CALL W_INSTRU
       MOV   A,#0FH   ;显示开,光标开,闪烁开
        CALL W_INSTRU
       MOV     A,#06H ;光标自动右移,
                      ;显示文字不移动
     CALL W_INSTRU  
      MOV   A,0C0H  ;置显示位地址(40H)
       CALL W_INSTRU
      MOV   A,#41H     ;字符A的代码
       CALL W_DATA
       JMP   $
   ;子程序SUB1判断LCD是否忙
BUSY:CLR   E
        CLR     RS
     SETB   RW
WAIT:SETB   D7
        SETB   E       ;处理高4位数据
       MOV   C,D7   ;读入忙标志位BF
        CLR   E
        SETB E         ;处理低4位数据
       CLR   E
        JC   WAIT     ;LCD忙转移
        RET
;SUB2:将指令(A)写入LCD    
W_INSTRU:CALL   BUSY
       CLR   RS
       CLR   RW
      MOV   P1,A     ;写高4位数据
     ;暂忽略对P1.0~1.3口的影响
        SETB     E
        CLR     E
      SWAP   A         ;写低4位数据
     MOV     P1,A
       SETB     E
       CLR     E
       RET
;SUB3:将数据(A)写入LCD
W_DATA:CALL   BUSY
       SETB RS
       CLR     RW
     MOV   P1,A     ;写高4位数据
       SETB   E
        CLR   E
        SWAP A           ;写低4位数据
     MOV     P1,A
       SETB   E
       CLR     E
       RET          
       END
离线BG7KH
发帖
4815
只看该作者 12楼 发表于: 2005-04-27
如果要省io。请加一片74ls164 ,用串行,全部只用5条线。
离线BG7NBK
发帖
100
只看该作者 13楼 发表于: 2005-04-27
'
《用单片机控制字符型液晶显示模块》一文的补充
《电子报》2003年,第6期,类别:智能电子
  《电子报》2001年第45期第十二版《用单片机控制字符型液晶显示模块》一文,详细地介绍了DM-162液晶模块的使用方法。从实际使用中遇到的问题来看,本人认为有以下两点需要补充说明:
  一、DM-162液晶模块提供了8位双向数据线(D0~D7),支持4位数据总线和8位数据总线两种接口方式。在实际使用中,由于单片机I/O端口数的限制,往往需要用到4位数据总线方式。其实,4位数据总线进行数据操作时,是先处理高4位数据,后处理低4位数据。下面举例说明4位数据总线的使用方法。DM-162液晶模块与AT89C51接口电路如附图。
  在第二行第一个字符处(40H)显示字符“A”的程序如下:
  RS   EQU P3.7
  RW EQU P3.6
  E     EQU P3.5
  D7 EQU P1.7
     ORG 0000H
        MOV A,#01H   ;清屏
        CALL W_INSTRU
      MOV     A,#28H   ;4位总线2行5×7点阵
      CALL W_INSTRU
       MOV   A,#0FH   ;显示开,光标开,闪烁开
        CALL W_INSTRU
       MOV     A,#06H ;光标自动右移,
                      ;显示文字不移动
     CALL W_INSTRU  
      MOV   A,0C0H  ;置显示位地址(40H)
       CALL W_INSTRU
      MOV   A,#41H     ;字符A的代码
       CALL W_DATA
       JMP   $
   ;子程序SUB1判断LCD是否忙
BUSY:CLR   E
        CLR     RS
     SETB   RW
WAIT:SETB   D7
        SETB   E       ;处理高4位数据
       MOV   C,D7   ;读入忙标志位BF
        CLR   E
        SETB E         ;处理低4位数据
       CLR   E
        JC   WAIT     ;LCD忙转移
        RET
;SUB2:将指令(A)写入LCD    
W_INSTRU:CALL   BUSY
       CLR   RS
       CLR   RW
      MOV   P1,A     ;写高4位数据
     ;暂忽略对P1.0~1.3口的影响
        SETB     E
        CLR     E
      SWAP   A         ;写低4位数据
     MOV     P1,A
       SETB     E
       CLR     E
       RET
;SUB3:将数据(A)写入LCD
W_DATA:CALL   BUSY
       SETB RS
       CLR     RW
     MOV   P1,A     ;写高4位数据
       SETB   E
        CLR   E
        SWAP A           ;写低4位数据
     MOV     P1,A
       SETB   E
       CLR     E
       RET          
       END
'

这段程序中,数据是用的4位,但是命令还是用的8位呀,实际上,只有4位与mcu连接,那8位的命令怎么操作呢?
离线lingmeng
发帖
470
只看该作者 14楼 发表于: 2005-04-27
来个pic的   看一看 有点帮助的
本主题包含附件,请 登录 后查看, 或者 注册 成为会员
离线BG7TBL
发帖
2965
只看该作者 15楼 发表于: 2005-04-27
我经常用4位,很好用,节省焊接时间!!!
看看下面的程序,
;+++++++++++++++++++++++++++++++++++++++
;以下为lcd应用程序的初始化程序,必须放在程序的开头
                 rs      bit      p2.0  
                 rw      bit      p2.1
                 e      bit      p2.2
                 bf      bit      p3.7
                 lcd_db7      bit      p3.7    
                 lcd_db6      bit      p3.6                  
                 lcd_db5      bit      p3.5
                 lcd_db4      bit      p3.4
                 lcd_db3      bit      p3.3
                 lcd_db2      bit      p3.2
                 lcd_db1      bit      p3.1
                 lcd_db0      bit      p3.0
                 zling      data      48h       ;指令
                 shuju      data      49h       ;数据

;********************************
;以下为lcd各个子程序程序应用部分
;********************************
;初始化lcd
;****************************************
initlcd:      
           clr      rs            ;送数据30h到命令寄存器
           clr      rw
           setb      e            ;lcd_db=30h      
           clr      lcd_db7  
           clr      lcd_db6      
           setb      lcd_db5
           setb      lcd_db4
           lcall      delaylcd
           clr      e
           lcall      delay_star
           mov      zling,#22h      ;设置位4位总线,
           acall      wrtc
           ret
;****************************************
;忙标志检测子程序
readbf:      
waitbf:            clr      rs
           setb      rw
           setb      e
           setb      lcd_db7      
           jb      bf,waitbf
           ret
;*********************************
;写指令代码子程序
wrtc:            acall      readbf ;读忙标志
           clr      rs
           clr      rw
           setb      e
           mov      a,zling      ;将高四位数据送出
           mov      c,acc.7
           mov      lcd_db7,c
           mov      c,acc.6
           mov      lcd_db6,c
           mov      c,acc.5
           mov      lcd_db5,c
           mov      c,acc.4
           mov      lcd_db4,c
           clr      e
           nop
           nop
           nop
           setb      e
           mov      a,zling      ;将底四位数据送出
           mov      c,acc.3
           mov      lcd_db7,c
           mov      c,acc.2
           mov      lcd_db6,c
           mov      c,acc.1
           mov      lcd_db5,c
           mov      c,acc.0
           mov      lcd_db4,c
           clr      e
           ret
;**********************************
delaylcd:mov      r6,#5
lop11:      mov      r7,#5
lop22:      djnz      r7,lop22
lop33:      djnz      r6,lop11
           ret
;**********************************
;写数据寄存器字节子程序
wrts:            acall      readbf
           setb      rs
           clr      rw
           setb      e
           mov      a,shuju;将高四位数据送出
           mov      c,acc.7
           mov      lcd_db7,c
           mov      c,acc.6
           mov      lcd_db6,c
           mov      c,acc.5
           mov      lcd_db5,c
           mov      c,acc.4
           mov      lcd_db4,c
           clr      e
           nop
           nop
           nop
           setb      e
           mov      a,shuju;将底四位数据送出
           mov      c,acc.3
           mov      lcd_db7,c
           mov      c,acc.2
           mov      lcd_db6,c
           mov      c,acc.1
           mov      lcd_db5,c
           mov      c,acc.0
           mov      lcd_db4,c
           clr      e
           ret
;***********************************
;以上为lcd各个子程序程序应用部分
;***********************************
离线ba1ka
发帖
1044
只看该作者 16楼 发表于: 2005-04-28
4位方式很好用,尤其是使用89c2051,90s1200,90s2313 等mcu时可节约资源.
离线bg5cvc
发帖
1106
只看该作者 17楼 发表于: 2005-04-28
同意
lcd的1602我常用4个口通信
vfd的1602我常用一个口通信
离线xiongjunfeng
发帖
1220
只看该作者 18楼 发表于: 2005-04-28
这是我写的在40个脚的pic芯片用四线驱动lcd1602的例程,工作正常,晶体用的10m

#include      <pic.h>
#define lcd_rs rd1
#define lcd_rw rd2
#define lcd_e rd3
#define lcd_data portd
void wait10()//延时10ms
{
unsigned int d=2500;
while(--d){;}
}

lcd_busy()//显示屏忙检测
{
portd=0;
trisd=0xf0;
lcd_rs=0;
lcd_rw=1;
lcd_e=1;
do{;}
while(rd7!=0);
}

void wr_lcd(char cmd,char data)//显示屏写命令或数据
{
char tmp;
lcd_busy();
tmp=data;
trisd=0x00;
portd=0;
lcd_data=data&0b11110000;
if(cmd=='d')lcd_rs=1;
lcd_e=1;
nop();
lcd_e=0;
tmp=tmp<<4;
lcd_data=tmp&0b11110000;
if(cmd=='d')lcd_rs=1;
lcd_e=1;
nop();
lcd_e=0;
}

lcd_init()//显示屏初始化
{
trisd=0x00;
wr_lcd(' ',0x38);
wait10();
wr_lcd(' ',0x38);
wait10();
wr_lcd(' ',0x38);
wait10();
wr_lcd(' ',0b00101100);//四位数据、两行显示、5*10点阵
wr_lcd(' ',0b00000001);//清屏
wr_lcd(' ',0x08);//关显示
//wr_lcd(' ',0b00000110);//读写一个字符后,地址指针加1,整屏不动
wr_lcd(' ',0b00000111);//读写一个字符后,地址指针加1,整屏左移
wr_lcd(' ',0b00001100);//开显示
wr_lcd(' ',0b11010000);//显示光标移到第二行第16字符
//wr_lcd(' ',0b10000000);//显示光标移到第一行第1字符
}
离线BG6AGB
发帖
915
只看该作者 19楼 发表于: 2005-04-28
记号~~~~~~~~~~~~~~~~