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

2020-01-25 15:16发布

一样的初始化代码
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);//开光标位置,开闪烁  这一句是可以实现的(加上了以后屏幕上光标出现并闪烁)说明我的通信协议没问题。
但是后来写字等操作都没反应,不知是不是我用法不对。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
jetli
1楼-- · 2020-01-25 20:03
st7920的优势就在于:带字库+ 串行

如果非要用并行,不如ks0107/8 的液晶
xl1736
2楼-- · 2020-01-26 02:02
 精彩回答 2  元偷偷看……
xl1736
3楼-- · 2020-01-26 07:55
终于把问题解决了,LCD12864时序如图

QQ图片20140112232344.jpg (112.95 KB, 下载次数: 0)

下载附件

2014-1-12 23:24 上传


当时我以为和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
4楼-- · 2020-01-26 11:27
做个记号吧~以前弄ST7920串行就没搞定,全是乱码。。。。无法正常显示。。。。
sfq2008
5楼-- · 2020-01-26 12:59
本帖最后由 sfq2008 于 2014-1-21 08:01 编辑

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


修改原因:错字
xl1736
6楼-- · 2020-01-26 16:03
sfq2008 发表于 2014-1-21 08:00
注意点:
1、并口有查忙,可以不用延时,不过反应较慢。
2、串口没查忙,要留有延时,否则有时有乱码。

确实,久东西速度不快,不过上个小系统,来练习进程的调度那是极好的。

一周热门 更多>