西比爱斯

  :: 首页 :: 博问 :: 闪存 :: 新随笔 :: :: :: 管理 ::

秋叶通商的H8板搭载的LCD是M1632和SC1602BS,因其为字符式单色显示器所以操作非常简单。在电路设计上,其允许尽可能的节约端口而设计为4Bit和8Bit两种模式,也就说只需要连接4个I\O口就可以给这个LCD输出数据。

上图中的In0,In1,In2,In3,In4,In7对应PB端口的0,1,2,3,4,7号端口。而从芯片的1-14号编码可以从硬件式样中找到对应的逻辑功能号

PB0        PB1           PB2          PB3           PB4            PB7

DB4       DB5           DB6         DB7           RS             E

 

DB4-DB7为数据/命令输入端口,RS为数据/命令控制位,E为电平控制位。

 

由电路图可以看出,5号口德R/W端口被硬性的链接到了GND端,始终输入为0,所以始终为写入模式,LCD的状态信息无法获取。

(1):初始化

本片从硬件上要求在达到4.5V电压时三次执行数据长度为8的申请(原因不明),在之后再根据本开发板把位宽调整为4.有个要注意的地方,硬件在8位宽模式的时候,它是不知道这时板子上的情况是另外四个没有链接芯片的事实的,它只管按照8位来接受,那么第四位永远都是0.只有上表的DB4-DB7有效。

 

在调整位宽为4后就可以让LCD在极端的时间里分两次接收输入,一次为低4位一次为高四位,就可以开始详细的设置LCD的工作模式。

1 for(i=0;i<3;i++)
2 {
3 LCDOut8(0,0x3); /* 三次申请8位宽模式 */
4 }
5 LCDOut8(0,0x2); /* 申请4位宽模式 */
6
7 LCDOut4(0,0x28); /* 4Bit模式,shift模式 */
8 LCDOut4(0,0x0e); /* 标示开,光标开,ブリンク关*/
9 LCDOut4(0,0x06); /* 以增量方式使用内存 */
10 LCDOut4(0,0x01); /* 清除LCD显示 */
11 LCDOut4(0,0x02); /* 移动光标到起始位 */

根据厂家的源码得到的结论仍然有很不明确的地方,为什么在8位模式的时候仍然要使用0x3,0x2的数字,他们应该不被8位模式下的LCD接收才对。

 

 

(2)写入LCD

到目前为止都没有谈到E的重要之处,而它几乎存在在LCD的每一个地方,因为不管什么修改都要在E控制的电平从1到0的变化时被修改,也就是说不管是什么设置都要调用对E修改的函数代码才可以实现。

 

另外,在四位的模式下,是分两次将高地位传递给LCD的。

 

1 static void LCDOut4(int rs,int code)
2 {
3 int stat;
4 int pb;
5 char lb,hb;
6
7 pb = PB.DR;
8
9 if( rs ) stat = (pb & LCDMASK) | LCD_RS;
10 else stat = (pb & LCDMASK);
11
12 hb = ((code>>4)&0xf) | stat;
13 lb = (code&0xf) | stat;
14
15 PB.DR = hb | LCD_E;
16 PB.DR = hb;
17
18 PB.DR = lb | LCD_E;
19 PB.DR = lb;
20
21 PB.DR = pb;
22 wait(4);
23 }

 

 

(以上)

posted on 2009-12-16 14:35  西比爱斯  阅读(301)  评论(0)    收藏  举报