一样的初始化代码
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);//开光标位置,开闪烁 这一句是可以实现的(加上了以后屏幕上光标出现并闪烁)说明我的通信协议没问题。
但是后来写字等操作都没反应,不知是不是我用法不对。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
如果非要用并行,不如ks0107/8 的液晶
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至零。
小弟愚笨,发个帖子让大家笑话下,也算是警醒自己。
注意点:
1、并口有查忙,可以不用延时,不过反应较慢。
2、串口没查忙,要留有延时,否则有时有乱码。
3、我感觉旧屏都很慢,但以前见有人用做过显示动画都没问题。
修改原因:错字
确实,久东西速度不快,不过上个小系统,来练习进程的调度那是极好的。
一周热门 更多>