打印

LCD12864串行控制有关CS电平的问题

[复制链接]
1713|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
风溪香士|  楼主 | 2014-1-13 21:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在用LCD12864的串行控制,程序如下:
//写指令
void LCD12864_write_com(unsigned char com)
{
        unsigned char dattemp,i;
        LCD12864_cs = 1;
        dattemp = 0xf8;
        for (i = 0; i < 8; i++)
        {
                dattemp <<= 1;
                LCD12864_sclk = 0;
                delay9us(1);
                LCD12864_sid = CY;
                delay9us(1);
                LCD12864_sclk = 1;
        }
        dattemp = com & 0xf0;
        for (i = 0; i < 8; i++)
        {
                dattemp <<= 1;
                LCD12864_sclk = 0;
                delay9us(1);
                LCD12864_sid = CY;
                delay9us(1);
                LCD12864_sclk = 1;
        }
        dattemp = (com << 4) & 0xf0;
        for (i = 0; i < 8; i++)
        {
                dattemp <<= 1;
                LCD12864_sclk = 0;
                delay9us(1);
                LCD12864_sid = CY;
                delay9us(1);
                LCD12864_sclk = 1;
        }
        LCD12864_sclk = 0;
        LCD12864_sid = 1;
        LCD12864_cs = 0;
}

//写数据
void LCD12864_write_dat(unsigned char dat)
{
        unsigned char dattemp,i;
        LCD12864_cs = 1;
        dattemp = 0xfa;
        for (i = 0; i < 8; i++)
        {
                dattemp <<= 1;
                LCD12864_sclk = 0;
                delay9us(1);
                LCD12864_sid = CY;
                delay9us(1);
                LCD12864_sclk = 1;
        }
        dattemp = dat & 0xf0;
        for (i = 0; i < 8; i++)
        {
                dattemp <<= 1;
                LCD12864_sclk = 0;
                delay9us(1);
                LCD12864_sid = CY;
                delay9us(1);
                LCD12864_sclk = 1;
        }
        dattemp = (dat << 4) & 0xf0;
        for (i = 0; i < 8; i++)
        {
                dattemp <<= 1;
                LCD12864_sclk = 0;
                delay9us(1);
                LCD12864_sid = CY;
                delay9us(1);
                LCD12864_sclk = 1;
        }
        LCD12864_sclk = 0;
        LCD12864_sid = 1;
        LCD12864_cs = 0;
}
主函数如下:
void main()
{
        LCD12864_init();
        LCD12864_write_com(0x80);
        LCD12864_write_dat('0');
        LCD12864_write_dat('1');
        while(1);
}

这样写就不会显示01,但如果把写指令函数中的LCD12864_cs = 0;删掉,就只会显示一个0,如果再把写数据函数中的LCD12864_cs = 0;删掉就能显示01了。这样感觉就是LCD12864_write_com(0x80);中的LCD12864_cs = 0;是的后面的显示数据都失效了,而LCD12864_write_dat('0');中的LCD12864_cs = 0;也会让后面的LCD12864_write_dat('1');失效。但我两个函数一开始就又把LCD12864_cs置一了。实在想不通为什么。后面我又试了,把那三句顺序改变,改为
        LCD12864_cs = 0;
        LCD12864_sclk = 0;
        LCD12864_sid = 1;
也可以正常显示。这是CS的时序问题吗,还请各位指点一下。

相关帖子

沙发
wape271| | 2014-1-14 09:58 | 只看该作者
我试过将CS线去掉,用电阻拉高,只要2根信号线也能正常显示

使用特权

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

本版积分规则

个人签名:我命由我不由天!

13

主题

82

帖子

1

粉丝