打印

1602LCD未发送总线模式命令时如何确定工作于4位还是8位?

[复制链接]
7202|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ljm810010|  楼主 | 2009-7-29 17:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
向1602发送命令0x38表示使用8位数据总线,发送命令0x28表示使用4位数据总线,但是上电后未确定哪种方式时,0x38或0x28是按照8位方式接收,还是按4位方式接收?这好象有点矛盾,协议还没确定,LCD是怎样知道MCU打算用哪种方式呢?毕竟0x38或0x28也是需要通过数据线传送。

相关帖子

沙发
smileagain| | 2009-7-29 17:36 | 只看该作者

是8位模式

1602上电后有一个默认的初始设置
数据总线默认的是8位模式
因此你如果用8位模式的话
这一项可以不用设定

使用特权

评论回复
板凳
一条大河| | 2009-7-29 17:57 | 只看该作者

高4位一到不就定下来了

使用特权

评论回复
地板
ljm810010|  楼主 | 2009-7-29 18:03 | 只看该作者

RE:2L

如果默认8位模式,但硬件连接只接了高四位,这时发送0x28命令切换成四位,在切换前,还是按8位方式接收0x28,这就会令0x28只接收到高四位0x20,而低四位0x08丢失(1602低四位没连接)。这样岂不是接收到错误的命令吗?

使用特权

评论回复
5
smileagain| | 2009-7-29 18:44 | 只看该作者

这个问题问得好!

我一直用8位模式,还从没想过这个问题
我想是不是可以这样,把低四位固定设成1000(即接电源或地,不让其悬空)
这样只要高四位发出0010,就构成了8位数据0x28了
接下来只用高四位,低四位的设定不影响数据的值
具体能不能这样我也没试过,你可以试一下
很多时候可不可以只有时了才有发言权
如果成功了re一下,呵呵

使用特权

评论回复
6
ljm810010|  楼主 | 2009-7-29 19:47 | 只看该作者

低四位悬空是可以的,有试过

只是不明何为可以不接

使用特权

评论回复
7
程序匠人| | 2009-7-29 22:15 | 只看该作者

没试过4位模式,猜想:是不是有内部下拉?

 ljm810010 发表于 2009-7-29 19:47 侃单片机 ←返回版面    

6楼: 低四位悬空是可以的,有试过 


-----------------------------------

猜想:是不是有内部下拉?

随便找了一份资料如下:

使用特权

评论回复
8
程序匠人| | 2009-7-29 22:23 | 只看该作者

找到一张4位模式接线示意图

使用特权

评论回复
9
ljm810010|  楼主 | 2009-7-30 13:06 | 只看该作者

猜想一下可能是这样

上电默认8位总线:

if (命令字高位为0x3X)
{
   if(命令字低位为0xX8)
     {确认为8位模式};
   else
     {无效命令}
}

else if(命令字高位为0x2X)
{
   舍弃低四位;
   再按收接收下一命令;
   if(下一命令字高4位为0x8X)
     {确认为4位模式};
   else
     {无效命令}
}

else
{
   其它命令;
}

   
 

使用特权

评论回复
10
ecook| | 2009-7-30 13:10 | 只看该作者

标记一下

使用特权

评论回复
11
smileagain| | 2009-7-30 13:26 | 只看该作者

呵呵,那就试一下吧

现在的1602的datasheet都写得很烂,不但不详细,而且很多都有错
所以许多事情只能自己摸索

使用特权

评论回复
12
aolin| | 2009-7-31 09:16 | 只看该作者

这个问题真的问得好!

LZ很细心。
我也是摸了很久才摸出来:
#define    LCD_4_BIT_CONFIG        (FUNCTION_SET | SET_2LINE_MODE | SET_4BIT_INTERFACE)
#define    LCD_8_BIT_CONFIG        (FUNCTION_SET | SET_2LINE_MODE | SET_8BIT_INTERFACE)

#define    LCD_CONFIG        LCD_4_BIT_CONFIG

void    lcd_init(void)
{
    pLCD_RS = 0;    //select instruction register
    pLCD_E = 0;
    DelayMs(50);
    lcd_config_command(0x03);        /* 8-bit config first  */

    DelayUs(100);
    lcd_send_command(LCD_CONFIG);        /* 5 font, 4 lines  */
    DelayUs(200);
    lcd_send_command(LCD_CONFIG);        /* 5 font, 4 lines  */

    lcd_send_command(DISPLAY_OFF);        /* display on/off  */
    
    lcd_send_command(CLEAR_DISPLAY);
    DelayMs(100);
    lcd_send_command(INCREMENT_MODE);        /* auto increment mode */

    InitCGRAM( CGRAM_Data );
}

使用特权

评论回复
13
ljm810010|  楼主 | 2009-7-31 13:12 | 只看该作者

晕,搞到一天还没调出来

这个4线太难搞了,1602的PDF没对4线作详细介绍。哪位好心人帮忙看看
#include <reg51.h>
#define    lcd_rs    P1_1
#define    lcd_rw    P1_2
#define    lcd_e     P1_3
#define    lcd_io    P1

sbit    P1_0=P1^0;
sbit    P1_1=P1^1;
sbit    P1_2=P1^2;
sbit    P1_3=P1^3;
sbit    P1_4=P1^4;
sbit    P1_5=P1^5;
sbit    P1_6=P1^6;
sbit    P1_7=P1^7;

sbit    P3_0=P3^0;
sbit    P3_1=P3^1;
sbit    P3_2=P3^2;
sbit    P3_3=P3^3;
sbit    P3_4=P3^4;
sbit    P3_5=P3^5;
sbit    P3_6=P3^6;
sbit    P3_7=P3^7;

unsigned char code msg1[] = {"Hello"};
unsigned char code msg2[] = {"World"};
unsigned char code msg3[] = {"     "};

void lcd_init(void);
void lcd_send(unsigned char dat);
void lcd_addr(unsigned char addr);
void lcd_string(unsigned char code *sdata,unsigned char lengh);

void Delay_5ms()
{
    unsigned int i=1000;
    while(--i);
}

void Delay_5us()
{
    unsigned char i=5;
    while(--i);
}

//========================================
void main(void)
{
    unsigned char t;
    lcd_init();
    while(1)
    {
        lcd_addr(0x05);
        lcd_string(msg1,5);
        lcd_addr(0x45);
        lcd_string(msg2,5);

        for(t=200;t>0;t--) Delay_5ms();
        lcd_addr(0x05);
        lcd_string(msg3,5);
        lcd_addr(0x45);
        lcd_string(msg3,5);
        for(t=200;t>0;t--) Delay_5ms();
    }
}



void lcd_init(void)
{
    lcd_rw    = 0;
    lcd_rs    = 0;

    Delay_5ms();
    lcd_e    = 1;
    lcd_io &= 0x0f;
    lcd_io |= 0x30;//
    Delay_5us();
    lcd_e    = 0;
    Delay_5ms();
    lcd_e    = 1;
    lcd_io &= 0x0f;
    lcd_io |= 0x30;//
    Delay_5us();
    lcd_e    = 0;
    Delay_5ms();
    lcd_e    = 1;
    lcd_io &= 0x0f;
    lcd_io |= 0x30;//
    Delay_5us();
    lcd_e    = 0;
    Delay_5ms();

    lcd_send(0x28);//
    lcd_send(0x0c);

    lcd_rs    = 0;
    lcd_send(0x01);
    lcd_send(0x0c);
    lcd_send(0x06);
    lcd_send(0x14);
    lcd_rs = 1;
    Delay_5ms();

}    

void lcd_send(unsigned char dat)
{
    lcd_e = 1;
    lcd_io &= 0x0f;
    lcd_io |= dat & 0xf0;
    Delay_5us();
    lcd_e = 0;
    Delay_5us();

    lcd_e = 1;
    dat <<= 4;
    lcd_io &= 0x0f;
    lcd_io |= dat;
    Delay_5us();
    lcd_e = 0;
    Delay_5us();

}
    

void lcd_addr(unsigned char addr)
{
    lcd_rs = 0;
    addr |= 0x80;
    lcd_send(addr);
    lcd_rs = 1;
}

void lcd_string(unsigned char code *sdata,unsigned char lengh)
{
    unsigned char x;
    for(x=0;x<lengh;x++)
    {
        lcd_send(sdata[x]);
    }
}

使用特权

评论回复
14
ljm810010|  楼主 | 2009-7-31 13:36 | 只看该作者

附接线图

图是的MCU是STC12C5410AD

使用特权

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

本版积分规则

38

主题

1195

帖子

0

粉丝