打印
[AVR单片机]

求教avr控制YM1602C问题

[复制链接]
2375|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
我是一只鱼|  楼主 | 2008-7-7 01:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
小弟希望用atmega48的四个端口,通过4094扩展,控制LCD YM1602C和按键扫描。程序如下:

void YM1602C_Write(UINT8 CD,UINT8 Data)
{
    SiBuffer.YM1602C_RS = CD;
    SiBuffer.YM1602C_RW = YM1602C_WRITE;
    SiBuffer.YM1602C_E = YM1602C_DISABLE;
    SI_Dispatch();
    UsDelay(4);
    
    SiBuffer.YM1602C_E = YM1602C_ENABLE;
    SI_Dispatch();
    UsDelay(1);

    SiBuffer.YM1602C_D = Data;
    SI_Dispatch();
    UsDelay(4);
    
    SiBuffer.YM1602C_E = YM1602C_DISABLE;
    SI_Dispatch();
    UsDelay(1);
}

BOOL YM1602C_IsBusy()
{
    int i;
    char ret = FALSE;
    SiBuffer.YM1602C_RS = 0;//registors option
    SiBuffer.YM1602C_RW = 1;//Read
    SiBuffer.YM1602C_E = YM1602C_DISABLE;
    SiBuffer.YM1602C_D7 = 0;
    SI_Dispatch();
    UsDelay(1);

    SiBuffer.YM1602C_E = YM1602C_ENABLE;
    SI_Dispatch();
    UsDelay(2);

    if(IS_YM1602C_BUSY) ret = TRUE;
    SiBuffer.YM1602C_E = YM1602C_DISABLE;
    SI_Dispatch();
    return ret;
}

void YM1602C_Init()
{
    UsDelay(4000);
    YM1602C_Write(YM1602C_CMD, YM1602_CMD_FUN_MASK|YM1602_CMD_2LINES|YM1602_CMD_INTERFACE8|YM1602_CMD_DSP_ON);
    UsDelay(40);
    YM1602C_Write(YM1602C_CMD, YM1602_CMD_DCB_MASK|YM1602_CMD_DISPLAY_ON);
    UsDelay(40);
    YM1602C_Write(YM1602C_CMD, YM1602_CMD_MODE_MASK|YM1602_CMD_INC_CURSOR);//&(~YM1602_CMD_SHIFT_DISPLAY));
    UsDelay(40);
    YM1602C_Write(YM1602C_CMD, YM1602_CMD_CLEAR_DISPLAYER);
    UsDelay(1530);
    YM1602C_Write(YM1602C_CMD, YM1602_CMD_RESET_CURSOR);
    UsDelay(1530);
    YM1602C_Write(YM1602C_CMD, YM1602_CMD_SHIFT_MASK|YM1602_CMD_SHIFT_RIGHT);
    UsDelay(40);
}

void YM1602C_DisplayStrAt(UINT8 nLine, UINT8 nCharacter, UINT8 *pChar)
{
    #if 0
    YM1602C_Write(YM1602C_CMD, YM1602_CMD_DDRA_MASK|1);
    YM1602C_Write(YM1602C_DATA,0x3a);
    #else
    YM1602C_Write(YM1602C_CMD, YM1602_CMD_DDRA_MASK|(0x40*(nLine-1)+nCharacter-1));
    while('\0' != *pChar)
    {
        YM1602C_Write(YM1602C_DATA, *pChar++);
    }
    #endif
}

void YM1602C_SetCursor(UINT8 nLine, UINT8 nColumn)
{
    if(nLine > 0 && nLine<3 && nColumn > 0 && nColumn < 17)
        YM1602C_Write(YM1602C_CMD,YM1602_CMD_DDRA_MASK|(0x40*(nLine-1)+nColumn-1));
    UsDelay(39);
}


另外,定时1秒写:

                        static char n = '0';
                        int i;
                        YM1602C_SetCursor(1,1);
                        for(i=0; i<16; i++)
                        YM1602C_Write(YM1602C_DATA,n);
                        if(++n > '9') n = '0';

但是LCD显示的是乱码。
希望高手指点迷津。

相关帖子

沙发
我是一只鱼|  楼主 | 2008-7-7 01:37 | 只看该作者

补充说明


void YM1602C_Init()
{
    UsDelay(4000);
    YM1602C_Write(YM1602C_CMD, YM1602_CMD_FUN_MASK|YM1602_CMD_2LINES|YM1602_CMD_INTERFACE8|YM1602_CMD_DSP_ON);/////////////写命令,值0x3C
    UsDelay(40);
    YM1602C_Write(YM1602C_CMD, YM1602_CMD_DCB_MASK|YM1602_CMD_DISPLAY_ON);///////写命令,值0x0C
    UsDelay(40);
    YM1602C_Write(YM1602C_CMD, YM1602_CMD_MODE_MASK|YM1602_CMD_INC_CURSOR);//写命令,值0x06//&(~YM1602_CMD_SHIFT_DISPLAY));
    UsDelay(40);
    YM1602C_Write(YM1602C_CMD, YM1602_CMD_CLEAR_DISPLAYER);////写命令,值0x01
    UsDelay(1530);
    YM1602C_Write(YM1602C_CMD, YM1602_CMD_RESET_CURSOR);/////写命令,值0x02
    UsDelay(1530);
    YM1602C_Write(YM1602C_CMD, YM1602_CMD_SHIFT_MASK|YM1602_CMD_SHIFT_RIGHT);/////写命令,值0x14
    UsDelay(40);
}

RS、RW、E、DB0~DB8正确输出到YM1602C接口处。

使用特权

评论回复
板凳
xwj| | 2008-7-7 01:50 | 只看该作者

1、串那么大的电阻干嘛?2、串行,好慢啊,建议E单独控制

使用特权

评论回复
地板
我是一只鱼|  楼主 | 2008-7-7 22:13 | 只看该作者

re

由于读LCD是,LCD接口上出现LCD数据,而4094输出特性,可能与其冲突,因此加电阻耦合。我使用5v电源,阻值4k7,目的使冲突电流限制在1mA左右,保护电路。

我使用的单片机是Atmega48;使用8MHz晶振。应该足够应付。MCU管脚只有32个脚,只好用4094扩展。

有哪位大侠写过 耀宇的YM1602C的驱动的?能给小弟指点一下,感激不尽!

使用特权

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

本版积分规则

2

主题

8

帖子

1

粉丝