使用PIC24F上的bus I2C连接6脚液晶LCD进行显示(主要是SDA, SCL的C语言编程问题)?
我现在在用一块有PIC24FKA102的XLP16位板做编程,需要从这块板连接一块6脚液晶LCD并且用板上的I2Cbus进行连接显示。这块LCD是farnell公司的BA...
我现在在用一块有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/ 展开
这块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/ 展开
3个回答
展开全部
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);
}
下面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);
}
展开全部
更多追问追答
追问
你给的第一个网站我前几天就一直在看了,正在尝试。。。
追答
COG-BTHQ-21605-02
http://www.farnell.com/datasheets/21331.pdf
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
哥么,我也在搞PCF8576驱动LED。我比你可悲多了,我连LECD的真值表都没有,晕死,搞了几天,显示的全是乱码。你怎么样了?
追问
搞了好多天了,LCD还是没显示。。。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询