xl1736 发表于 2014-1-12 21:14:06

小弟请问大家LCD12864(ST7920A)串行/并行接口用法区别?

一样的初始化代码
void inint_12684(void)
{
        DDRC |=0xff;
        clr_RST;
       _delay_ms(100);
        set_RST;
        clr_CH;
        _delay_ms(2);
        write_12864(0,0x0f);//开光标位置,开闪烁
          _delay_ms(2);
          write_12864(0,0x30);//基本指令集,8位并行
           _delay_ms(2);
          write_12864(0,0x06);//设定起始点,光标右移
          _delay_ms(2);
          write_12864(0,0x0c);//整体显示开,光标显示关
                 _delay_ms(10);
          write_12864(0,0x01);//清除显示
                 _delay_ms(10);
}

在并行使用的时候可以正常使用12864,把协议和接法换做串行效果就不一样了。
write_12864(0,0x0f);//开光标位置,开闪烁这一句是可以实现的(加上了以后屏幕上光标出现并闪烁)说明我的通信协议没问题。
但是后来写字等操作都没反应,不知是不是我用法不对。

jetli 发表于 2014-1-12 22:14:50

st7920的优势就在于:带字库+ 串行

如果非要用并行,不如ks0107/8 的液晶 {:titter:}

xl1736 发表于 2014-1-12 22:57:21

jetli 发表于 2014-1-12 22:14
st7920的优势就在于:带字库+ 串行

如果非要用并行,不如ks0107/8 的液晶...

我也是这样觉得,如果并行走线,我的板子线就太多而且太难布。芯片I/O口也蛋疼(我用ATMEGA168)。
但现在我用一样的初始化程序,用在并行接口可以,用在串行接口接不可以(串行接口下仅0x0f指令有反应),不知是什么原因。

xl1736 发表于 2014-1-12 23:32:02

终于把问题解决了,LCD12864时序如图
当时我以为和SPI总线差不多,无非总线使能由低开始变成高开始了。
谁知道用这样的时序根本不能驱动12864。
void write_12864(char rs,unsigned char data)//RS=0写指令,否则写数据
{
        Spi_Start();
        if(rs == 0) Spi_Rw(0xf8);//写指令
        else Spi_Rw(0xfa);//写数据
        Spi_Rw(data&0xf0);
        Spi_Rw((data<<4)&0xf0);
        //Spi_Stop();//优信的协议错误,CS只是片选。
}

//Spi_Stop();//优信的协议错误,CS只是片选。
这段注释掉以后,程序运行正常。
由此得出结论:
1、串行12864在CS拉低以后要从新工作必须执行0x30指令(默认第一次上电是执行基本指令集的,在片选为0,以后再次选中则需要执行这个指令所以我的光标闪烁指令才能生效)
2、在使用总线对其进行驱动的时候并不是每次通信结束后都需要让cs至零。


小弟愚笨,发个帖子让大家笑话下,也算是警醒自己。

lswhome 发表于 2014-1-19 23:56:20

做个记号吧~以前弄ST7920串行就没搞定,全是乱码。。。。无法正常显示。。。。

sfq2008 发表于 2014-1-21 08:00:07

本帖最后由 sfq2008 于 2014-1-21 08:01 编辑

注意点:
1、并口有查忙,可以不用延时,不过反应较慢。
2、串口没查忙,要留有延时,否则有时有乱码。
3、我感觉旧屏都很慢,但以前见有人用做过显示动画都没问题。


修改原因:错字

xl1736 发表于 2014-1-21 21:23:07

sfq2008 发表于 2014-1-21 08:00
注意点:
1、并口有查忙,可以不用延时,不过反应较慢。
2、串口没查忙,要留有延时,否则有时有乱码。


确实,久东西速度不快,不过上个小系统,来练习进程的调度那是极好的。
页: [1]
查看完整版本: 小弟请问大家LCD12864(ST7920A)串行/并行接口用法区别?