求教dspic33读写(I2C)24c02通过(SDA,SCL高低电平)LCD1602显示问题。调了好久没出来,请各位大侠指点下。显示部分没有问题,是之前调试过加入的。
#include<p33fj64mc506.h>
#define uint unsigned int
#define uchar unsigned char
#define LCD_RS LATDbits.LATD5
#define LCD_RW LATDbits.LATD6
#define LCD_E LATDbits.LATD7
#define WP LATDbits.LATD9
#define SCL LATDbits.LATD10 //I2C Clock PORTG pin 2
#define SDA LATDbits.LATD11 //I2C Data PORTG pin 3
const uchar table1[]="dspic33fj64mc506";
uchar kkk,aaa,j;
void init();
void start();
void stop();
void writebyte(uchar data);
uchar readbyte();
void testack();
void write_add(uchar add,uchar *num);
uchar read_add(uchar add);
void Read_2402(unsigned char addr,unsigned char *p,unsigned char num);
void delay(uint x);
void LCD_init();
void LCD_wcom(uchar com);
void LCD_wdat(uchar dat);
union
{
unsigned char savedata16;
unsigned char savedata8[2];
}savepara;
uchar *buff,asc[3],tab[4];
//*****************************主函数************************//
int main()
{
//Configure Oscillator to operate the device at 7.37Mhz
PLLFBD=41; // M=43 Fosc=Fin*M/(N1*N2),Fcy=Fosc/2 Fosc=7.37M*43/(2*2)=79.2275
CLKDIVbits.PLLPOST=0; // N1=2 Fcy=Fosc/2=39.61375
CLKDIVbits.PLLPRE=0; // N2=2
// Clock switching to incorporate PLL
__builtin_write_OSCCONH(0x01); //Initiate Clock Switch to Primary
//FRC with PLL (NOSC=0b001)
__builtin_write_OSCCONL(0x01); //Start clock switching
while (OSCCONbits.COSC!=0b001); // Wait for Clock switch to occur
init();
LCD_init();
uchar w;
w=0;
while(1)
{
if(kkk>15)kkk=0;
savepara.savedata16=table1[kkk];
write_add(16,savepara.savedata8); //把table1中内容写入地址16
delay(40);
Read_2402(16,savepara.savedata8,2); //再将其读出 (这句) 我从观察寄存器中发现好像是这里出了问题,
kkk++; //之前savepara.savedata8的值为table1内容对应的十六进制数
delay(200); //之后savepara.savedata8的值就变成0X00FF,不知道怎么改好
LCD_wcom(0x80); //求指点
delay(100);
tab[3]=savepara.savedata16;
asc[0]=(tab[3]/100)|0x30; //把十六进制转换为十进制,lcd显示对应的ascall码
asc[1]=(tab[3]/10)|0x30;
asc[2]=(tab[3]%10)|0x30;
aaa=asc[0]*100+asc[1]*10+asc[2];
LCD_wdat(aaa);
delay(25);
}
}
//*************************初始化*****************//
void init()
{
TRISD=0x00f;
TRISE=0;
//I2C init
SCL=1;
SDA=1;
}
//===========================24C02===============//
//*************************开始*****************//
void start()
{
TRISDbits.TRISD11=0;
SDA=1;
delay(2);
SCL=1;
delay(2);
SDA=0;
delay(4);
SCL=0;
}
//*************************停止*****************//
void stop()
{
TRISDbits.TRISD11=0;
SDA=0;
delay(2);
SCL=1;
delay(2);
SDA=0;
delay(2);
SCL=1;
delay(4);
SDA=1;
delay(1000);
}
//*************************写一字节**************************//
void writebyte(uchar data)
{
uchar i;
TRISDbits.TRISD11=0;
delay(2);
for (i=0;i<8;i++)
{
if ((data<<i)&0x80)
SDA=1;
else
SDA=0;
delay(2);
SCL=1;
delay(4);
SCL=0;
}
delay(2);
SDA=1;
delay(2);
SCL=1;
delay(4);
SCL=0;
delay(2);
}
//*************************读一字节************************//
unsigned char readbyte()
{
unsigned char retc,bit_count;
retc=0;
SDA=1;
TRISDbits.TRISD11=1;
for (bit_count=0;bit_count<8;bit_count++)
{
delay(2);
SCL=0;
delay(4);
SCL=1;
delay(2);
retc=retc<<1;
if (PORTDbits.RD11==1)
retc=retc+1;
delay(2);
}
SCL=0;
delay(2);
return (retc);
}
//*************************应答*****************************//
void testack()
{
WP=0;
/* SCL=1;
delay(2);
while(SDA==1);
SCL=0;
delay(2);*/
uchar i=0;SCL=1;delay(2);
while((SDA==1)&&(i<255))i++;
SCL=0;delay(2);
}
//**********************指定地址写一个字节数据*****************//
void write_add(uchar add,uchar *num)
{
WP=0;
start();
writebyte(0xa0);
delay(20);
testack();
writebyte(add);
testack();
delay(20);
writebyte(*num);
testack();
delay(80);
stop();
delay(10);
}
//***********************指定地址读一个字节数据*****************//
void Read_2402(unsigned char addr,unsigned char *p,unsigned char num)
{
unsigned char i;
start();
writebyte(0xa0); // send device address
writebyte(addr); //send unit address
start(); //start I2C again
writebyte(0xa1);
for(i=0;i<num;i++)
{
*p=readbyte();
p++;
if(i==(num-1))
{
stop();
}
else
{
TRISDbits.TRISD11=0;
delay(20);
SDA=0;
delay(20);
SCL=1;
delay(40);
SCL=0;
delay(20);
}
}
}
//******************延时*************************//
void delay(uint x)
{
uint a,b;
for(a=x;a>0;a--)
for(b=3962;b>0;b--);
}
//====================LCD1602=========================//
//******************LCD初始化*************************//
void LCD_init()
{
LCD_wcom(0x38);
delay(25);
LCD_wcom(0x01);//清屏
delay(25);
LCD_wcom(0x0c);//关显示
delay(25);
LCD_wcom(0x06);//光标设定模式
delay(25);
}
//*******************写指令************************//
void LCD_wcom(uchar com)
{
LCD_RS=0;
LCD_RW=0;
LATE=com;
delay(25);
LCD_E=1;
delay(25);
LCD_E=0;
delay(25);
}
//****************** 写数据************************//
void LCD_wdat(uchar dat)
{
LCD_RS=1;
LCD_RW=0;
LATE=dat;
delay(25);
LCD_E=1;
delay(25);
LCD_E=0;
delay(25);
}
一周热门 更多>