打印

请教并行总线扩展点阵LCD问题?

[复制链接]
2491|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
keer_zu|  楼主 | 2007-4-9 16:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
keer_zu|  楼主 | 2007-4-9 16:41 | 只看该作者

大侠们,拜托了!

使用特权

评论回复
板凳
keer_zu|  楼主 | 2007-4-9 16:52 | 只看该作者

从什么时候开始,我们的论坛静悄悄。不比半年前了。

恳请各位回复 。

使用特权

评论回复
地板
xwj| | 2007-4-9 16:52 | 只看该作者

先确定选通时地址线的高低电位,再转成16进制就OK了

使用特权

评论回复
5
keer_zu|  楼主 | 2007-4-9 16:59 | 只看该作者

谢谢

我原来用的是直接方式:就是把LCD的控制线和数据线直接接到单片机的口线,
我的程序是(调试过了没问题);
例如:
//LCD右半屏写命令字
void LCD_Write_ComR(unsigned char x)
{
DDRA=0x00;
while(bit_is_set(PINA,7))
{                   //2006
SET_RW;  //a1 = 1
SET_cs2; //a3 = 0
CLR_cs1; //a2 = 1
LCD_NOP();
CLR_RS;  //a0 = 0
SET_E;
}
DDRA=0xff;
LCD_NOP();
CLR_E;              //2004
SET_cs2; //a3 = 0
CLR_cs1; //a2 = 1    
CLR_RS;  //a0 = 0
CLR_RW;  //a1 = 0
PORTA=x;
SET_E;
CLR_E;
//SET_cs1;
//SET_cs2;

使用特权

评论回复
6
keer_zu|  楼主 | 2007-4-9 17:10 | 只看该作者

但是这里的问题出在控制线E上。不知道如何处理时序。

我的硬件是别人做的。
所以就只能按着硬件来。

//LCD左半屏写数据
void LCD_Write_DatL(unsigned char x)

DDRA=0x00;
while(bit_is_set(PINA,7))
{                   //200a
SET_RW;  //a1 = 1
SET_cs1; //a2 = 0
CLR_cs2; //a3 = 1
LCD_NOP();
CLR_RS;  //a0 = 0
SET_E;
}
DDRA=0xff;
LCD_NOP();         //2009
CLR_E;   //
SET_cs1; //a2 = 0
CLR_cs2; //a3 = 1    
SET_RS;  //a0 = 1
CLR_RW;  //a1 = 0
PORTA=x;
SET_E;
CLR_E;
//SET_cs1;
//SET_cs2;
}

在这里我不太明白A13的用途。就一直将其置高。算出的地址如上。

程序重新改为:

//LCD左半屏写命令字
void LCD_Write_ComL(unsigned char x)
{
    while(bit_is_set(*CRADDL,7));
    *CWADDL = x;
}
//左半屏写数据
void LCD_Write_DatL(unsigned char x)
{
    while(bit_is_set(*CRADDL,7));
    *DWADDL = x;
}
//LCD右半屏写命令字
void LCD_Write_ComR(unsigned char x)
{
    while(bit_is_set(*CRADDR,7));
    *CWADDR = x;
}
//LCD右半屏写数据
void LCD_Write_DatR(unsigned char x)
{
    while(bit_is_set(*CRADDR,7));
    *DWADDR = x;
}

结果还是不行。

使用特权

评论回复
7
keer_zu|  楼主 | 2007-4-9 17:17 | 只看该作者

我的地址是:

我的地址:
unsigned volatile char *CWADDL = (unsigned char*)(0x2009);
unsigned volatile char *CRADDL = (unsigned char*)(0x200a);
unsigned volatile char *DWADDL = (unsigned char*)(0x2008);
//unsigned volatile char *DRADDL =
unsigned volatile char *CWADDR = (unsigned char*)(0x2004);
unsigned volatile char *CRADDR = (unsigned char*)(0x2006);
unsigned volatile char *DWADDR = (unsigned char*)(0x2005);
//unsigned volatile char *DRADDR = 
不行。
这里的关键是在读端口状态之前,要先对E进行操作。而在总线方式下该
怎么办?另外A13既然是这样接的,一定有它的道理。如果是0,就会使CS1,和CS2同时有效,E也会高。这样会与我非直线扩展方式的程序矛盾。
所以一直置高。
也没结果。

使用特权

评论回复
8
xwj| | 2007-4-9 17:42 | 只看该作者

A13=1,A2=1时选通CS1;A13=1,A3=1时选通CS2;

此时/WR、/RD 任意一个输出低电平时E为高...


知道怎么用了吗?

使用特权

评论回复
9
keer_zu|  楼主 | 2007-4-9 17:57 | 只看该作者

你还是说一直让A13置位?

我试过了,不行啊

没那么简单。

使用特权

评论回复
10
xwj| | 2007-4-9 18:50 | 只看该作者

唉,你太不开窍了...

使用特权

评论回复
11
xwj| | 2007-4-9 18:54 | 只看该作者

你根本就没理解怎样把IO端口映射到存储器地址

去看书,先看懂51的外部RAM操作时序再说!

等你看懂了就很简单了,真的非常非常简单的哦
别不懂脑筋尽瞎问哦

使用特权

评论回复
12
keeyoo| | 2007-4-9 20:12 | 只看该作者

用得着那么多?

直接驱动不更好.
先了解LCD的驱动IC再写程序,网上到处都有这个程序下

使用特权

评论回复
13
skey79| | 2007-4-10 07:56 | 只看该作者

8楼的已经说的很清楚了

LZ可能对6800的时序还没弄清楚,是的E信号的下降沿有效,不知这样解释明白了没?

使用特权

评论回复
14
skey79| | 2007-4-10 08:01 | 只看该作者

顺便请教一下

总共四个控制信号线,为什么搞那么复杂浪费MCU五个I/O口啊,而且还浪费两个74HC00。究竟有什么好处呢?不知有没哪位大侠帮忙解释一下?

使用特权

评论回复
15
keer_zu|  楼主 | 2007-4-10 08:26 | 只看该作者

谢谢各位指教

采用并行总线方式是考虑到以后总线上还要挂其他器件,这样我的IO口才够用。

使用特权

评论回复
16
keer_zu|  楼主 | 2007-4-10 08:47 | 只看该作者

上面的几位好手

都别理论一套一套的。

我的图已经给了。

地址也算出来了。

如果错了,请给出正确的。

别光教训,拿出点干货。

使用特权

评论回复
17
keer_zu|  楼主 | 2007-4-10 09:55 | 只看该作者

上面的高手

上面的高手,说话呀!

使用特权

评论回复
18
skey79| | 2007-4-10 13:26 | 只看该作者

LZ,请把写命令和数据的地址换过来

KS0108的RS信号是高为数据寄存器,低为命令寄存器。另外,向LZ道歉一下,是不是上面的语气不好,不过我想大家的目的肯定是想帮你才那样说的,还望不要介意。我对数据总线也没什么了解,所以问出了上面的问题。你这个问题也让我有一些收获,哈哈...

使用特权

评论回复
19
xwj| | 2007-4-10 14:58 | 只看该作者

你确定你的屏CS1为高电平有效吗?如果是的话那你的电路就

那就去掉上面两个与非门,CS1、CS2直接接A2、A3


才看到你的贴
请注意你说话的语气,没人欠你的,也没人有必须回答你的义务。。。

使用特权

评论回复
20
skey79| | 2007-4-10 16:33 | 只看该作者

LS的说的极是

支持楼上的。

使用特权

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

本版积分规则

1349

主题

12425

帖子

53

粉丝