使用PIC24F上的bus I2C连接6脚液晶LCD进行显示(主要是SDA, SCL的C语言编程问题)?

我现在在用一块有PIC24FKA102的XLP 16位板做编程,需要从这块板连接一块6脚液晶LCD并且用板上的I2C bus进行连接显示。
这块LCD是farnell 公司的 BATRON COG系列,2X16,具体型号晚点补充。1到6脚分别是VLCD, VSS, VDD, SCL, POR(可以从单片机输出信号对屏幕进行重置), SDA (不记得SCL 和 SDA的顺序了。。。)
我现在的问题是不知道该怎么编程才能通过SDA和SCL让LCD显示点东西出来,怎么初始化怎么控制SCL。。。我目前给VLCD试过0——4.7V的电压,VDD用3.3V,屏幕没有任何显示,就连背景那种淡淡的小方块都没有。。。。

拜托各位给我提供几个例子,或者指条明路,给个链接什么的都行,先提前谢谢啦~
LCD 型号 : COG-BTHQ-21605-02
网站地址:http://fr.farnell.com/batron/bthq21605v-cog-fsre-i2c/module-lcd-2x16/dp/1220409
是基于 PHILIPS PCF 2119的LCD
我做完LCD初始化之后还是没有显示。。。。用的是这里的设置http://www.data-modul.com/de/support/driver/pdf/PCF2119_BT21605_.txt

最后我找到了这个网站:http://www.engscope.com/pic24-tutorial/10-2-i2c-basic-functions/

i2c有现成的库,你在lcd的网站上或者是单片机网上可以下到,然后按照lcd的pdf对它初始话,我给个简单的几个函数,可以实现初始化
下面3个就是lcd的初始化配置,下面3个函数是找到的i2c库代码,你按照这个lcd的pdf进行对应的修改就行
#define pcf8576 0x70

ISendByte(pcf8576,0x48); //设置背级方式
ISendByte(pcf8576,0x70); //设置闪烁
ISendByte(pcf8576,0x60); //设置器件子地址
你可以把lcd当成一个接口,向这个接口地址发送数据就可以让它进行对应的操作,这个是我写过的lcd显示模块,pcf8576是lcd的地址,这个你可以在lcd的pdf里找到
显示的话,就是向对应的lcd寄存器写入数据,比如要显示第一个数字,就是将lcd的显示数据里修改,然后发送显示数据到lcd的对应寄存器里,下面的lcdnum就是8576的显示数据数组
void Refresh_LCD()
{
ISendByte(pcf8576,0x60);
ISendStr(pcf8576,0x00,lcdnum,9);
}
void Start_I2c()
{
SDA=1; /*发送起始条件的数据信号*/
_Nop();

SCL=1;
_Nop(); /*起始条件建立时间大于4.7us,延时*/
_Nop();
_Nop();
_Nop();
_Nop();

SDA=0; /*发送起始信号*/
_Nop(); /* 起始条件锁定时间大于4μs*/
_Nop();
_Nop();
_Nop();
_Nop();

SCL=0; /*钳住I2C总线,准备发送或接收数据 */
_Nop();
_Nop();
}

/*******************************************************************
结束总线函数
函数原型: void Stop_I2c();
功能: 结束I2C总线,即发送I2C结束条件.

********************************************************************/
void Stop_I2c()
{
SDA=0; /*发送结束条件的数据信号*/
_Nop(); /*发送结束条件的时钟信号*/

SCL=1; /*结束条件建立时间大于4μs*/
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();

SDA=1; /*发送I2C总线结束信号*/
_Nop();
_Nop();
_Nop();
_Nop();
}
bit ISendByte(unsigned char sla,unsigned char c)
{
Start_I2c(); /*启动总线*/

SendByte(sla); /*发送器件地址*/

if(ack==0)
return(0);

SendByte(c); /*发送数据*/

if(ack==0)
return(0);

Stop_I2c(); /*结束总线*/

return(1);
}追问

你漏发了ISendStr这个函数吧。。。
刚刚开始那三行ISEND我看不明白,因为我在pdf里面找不到对应描述。
在我给的型号连接里面的那个pdf是我能找到的唯一LCD的资料。。。
你能帮我找到一个包含iic_write reset delay_ms 的库文件吗?我找不到。。。

追答

开始那3个是lcd的初始化,lcd控制器的pdf里有啊,哦,对了,有的单片机里自带lcd控制器,有的没有,这个代码是lcd控制器ht1621的,道理是一样的
一个是器件地址,一个是初始化设置,根据初始化设置的背级模式(或者说lcd驱动器偏压)和lcd的pdf里的显示模块地址映射表来计算出lcd的显示寄存器有多少个字节,每个字节的每位对应什么段,上面的lcdnum数组有9个字节,每个字节的每位我都通过发送数据然后观察lcd的显示后检测过的,背级模式的不同,控制显示的字节数组也不一样,具体的你可以看lcd的pdf,这里几百字不够说的.....
delay函数你可以根据单片机cpu频率或者晶振的频率来计算出需要循环的次数来实现,或者就用定时器做啊....这个很简单的,我给你个24m晶振的函数吧,单片机是stc12c5410,12t模式
void Delay1ms(int delay)
{
uint16 i;

if(delay <= 0)
return;

while(delay--)
{
for(i=0;i<1140;i++);
}
}
bit ISendStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no)
{
unsigned char i;

Start_I2c(); /*启动总线*/

SendByte(sla); /*发送器件地址*/

if(ack==0)
return(0);

SendByte(suba); /*发送器件子地址*/

if(ack==0)
return(0);

for(i=0;i<no;i++)
{
SendByte(*s); /*发送数据*/

if(ack==0)
return(0);

s++;
}

Stop_I2c(); /*结束总线*/

return(1);
}

追问

为什么 (delay--) ?
初始化设置我在PCF2119那个pdf里面看到了,

追答

.......delay就是你要延迟的毫秒数,在24m,12t的时候,通过计算得出1140次for循环大约是1ms,所以循环delay次就是延迟了delay毫秒啊,delay--是因为你输入的延迟数肯定是个正数列,延迟1ms就减1,一直到0。。。。。这个是最基本的列
lcd的初始化你要看pdf,我这个是pcf8576的初始化,写上来只是给你做个借鉴

追问

LCD的初始化我在PCF2119那个pdf里面看到了, 上面已经说了.......
我之前是想说,while()里面不是作为条件的嘛,所以才觉得奇怪。。。
你1140是怎么计算出来的?(1ms/6*10^6hz)?!!那应该是166才对啊......

追答

。。。。。while里是条件啊,为真是继续,为假(0)时就跳出啊,非零既真啊
24000000/(12*1000)这个是24m晶振1mscpu走的时钟数,然后根据while单次循环的汇编命令来计算出一次循环走的时钟数,最后用1ms的时钟数除以while单次循环的时钟数就是需要循环的数值了,你要看单片机的pdf,里面有汇编命令对应的时钟数

追问

我的意思是,既然括号里面的条件的话,应该不是一个执行动作啊,但是为什么我写完函数之后delay会开始自己减1.。。。。
在你回答之前我也是通过看汇编命令算出来了。。。。用定时器不好弄,太麻烦。
不过我做完初始化还是不行啊,什么东西都显示不出来。用的初始化还是pdf里面给的,应该能行,链接我给在开头的补充问题里面了。
我现在主要是有一个问题,就是这个LCD的sda和scl线用不用另外借上拉电阻?还是说LCD自带有了?

追答

你可以用示波器看看,sda和scl有高电平输出时就不需要上拉电阻,我的电路图里没有接,这个你看io口的说明,lcd初始化完了是什么都没有啊,需要你向显示寄存器写入数据后才有显示,你可以发ff命令,多发几个看能不能显示,while 的问题你可以看看c的基本资料,这种常识性问题实在是不想多说了。。。。

追问

现在郁闷了,代码在模拟模式的时候寄存器能被代码设定,真把代码烧入到卡上的时候却没反应了。。。。我试过写入代码到其他寄存器,能行得通的啊,说明芯片还是好的啊。。。郁闷了。。。

温馨提示:答案为网友推荐,仅供参考
第2个回答  2011-05-11
哥么,我也在搞PCF8576驱动LED。我比你可悲多了,我连LECD的真值表都没有,晕死,搞了几天,显示的全是乱码。你怎么样了?追问

搞了好多天了,LCD还是没显示。。。。

相似回答