求助dspic33读写(I2C)24c02通过(SDA,SCL高低电平)LCD1602显示

2020-02-08 09:29发布

求教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);
}
0条回答

一周热门 更多>