⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unit1.~cpp

📁 通过计算机并口模拟IIC总线
💻 ~CPP
📖 第 1 页 / 共 3 页
字号:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include <stdio.h>
#include "Unit1.h"
//user include
#include <math.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "DLPortIOX"
#pragma link "YbCommDevice"
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{       
        DL->OpenDriver();
        delaytime=ScrollBar1->Position;
        Label1->Caption=ScrollBar1->Position;
        Label2->Caption=ScrollBar2->Position;
        ReadDelayTime=ScrollBar2->Position;
        SCL_Set_1;
        try
        {
         YbCommDevice1->PortNo=1;
         YbCommDevice1->Active=true;
         }
         catch(Exception &e)
         {
           ShowMessage("YbCommDevice1: "+e.Message);
         }

}

//----------------------------------------------------------------------------
void TForm1::i2cstart(void)
{
        SCL_Set_1;
        SDA_Set_1;
        DelayUS(delaytime);
        SDA_Set_0;
        DelayUS(delaytime);
}
//----------------------------------------------------------------------------
void TForm1::i2cstop(void)
{
        SCL_Set_0;
        SDA_Set_0;
        DelayUS(delaytime);
        SCL_Set_1;
        DelayUS(delaytime);
        SDA_Set_1;  
}
//----------------------------------------------------------------------------
void TForm1::mainsendask(void)
{
        SCL_Set_0;
        SDA_Set_0;
        DelayUS(delaytime);
        SCL_Set_1;
        DelayUS(delaytime);
}
//----------------------------------------------------------------------------
bool TForm1::mainreceiveask(void)
{
        int i=0;
        SCL_Set_0;
        SDA_Set_1;
        DelayUS(delaytime);
        SCL_Set_1;
        DelayUS(delaytime);
        while(SDA_Get!=0)
        {
                i++;
                if(i>20)
                {
                  ShowMessage("No ACK!"); 
                  return(0);
                }
        }
        return(1);
}
//----------------------------------------------------------------------------
bool TForm1::sendbyte(int temp)
{
        short int a=7;
        char d,e;
        while(a>=0)
        {
           d=temp>>a;
           d=d<<7;
           if(d)
           {
              SCL_Set_0;
              SDA_Set_1;
              DelayUS(delaytime);
              SCL_Set_1;
              DelayUS(delaytime);
           }
           else
           {
              SCL_Set_0;
              SDA_Set_0;
              DelayUS(delaytime);
              SCL_Set_1;
              DelayUS(delaytime);
           }
           a=a-1;
        }
        return(mainreceiveask());
}
//----------------------------------------------------------------------------
int TForm1::readbyte()
{
        unsigned short a=8;
        short d,e,f=0;
        while(a>0)
        {
                SCL_Set_0;
                SDA_Set_1;
                DelayUS(delaytime);
                SCL_Set_1;
                DelayUS(delaytime);
                e=SDA_Get;
                f=f<<1;
                f=f+e;
                a=a-1;
        }
        mainsendask();
        return(f);
}

//----------------------------------------------------------------------------
int TForm1::readlastbyte()
{
        unsigned short a=8;
        short d,e,f=0;
        while(a>0)
        {
                SCL_Set_0;
                SDA_Set_1;
                DelayUS(delaytime);
                SCL_Set_1;
                DelayUS(delaytime);
                e=SDA_Get;
                f=f<<1;
                f=f+e;
                a=a-1;
        }
        return(f);
}

//----------------------------------------------------------------------------
void TForm1::checkIICbusy()
{
     int i;
     for(i=0;i<15;i++)
     {
         Sleep(1);
         i++; 
         if(SCL_Get==0)
         {
           i=0;
         }
     }
}
//----------------------------------------------------------------------------
 bool TForm1::WriteDDC(short int i,int s[])
 {
        short int j=0;
        checkIICbusy();
        i2cstart();
        while(j<i)
        {
          if(sendbyte(s[j])==0)
                return(0);
          j++;
        }
       i2cstop();
       DelayUS(delaytime);
       return(1);
 }
//----------------------------------------------------------------------------
int *TForm1::ReadDDC(short int sendlong,int sendstr[],short int receivelong)
{
        short int i;
        bool WOKF;
        int receivestr[MaxReceiveNum];
        checkIICbusy();
        if(receivelong==0)
        {
                receivestr[0]=0x00;
                return(&receivestr[0]);
        }
        WOKF=WriteDDC(sendlong,sendstr);
        if(WOKF==0)
        {
              receivestr[0]=0x00;
              return(&receivestr[0]);
        }       
        Sleep(ReadDelayTime);
        i2cstart();
        sendbyte(sendstr[0]|0x01);
        if(receivelong==1)
                receivestr[0]=readlastbyte();
        else
        {
                for(i=0;i< (receivelong-1); i++)
                {
                        receivestr[i]=readbyte();
                }
                receivestr[i]=readlastbyte();
        }
        i2cstop();
        return(&receivestr[0]);

}
//----------------------------------------------------------------------------
void TForm1::DelayUS(double us)
{
       double delayus;
       LARGE_INTEGER litmp;
       LONGLONG QPart1,QPart2;
       double dfMinus, dfFreq, dfTim;
       if(us<20)
       {
            us=20;
       }
       delayus=(us-9)/2500000;
       QueryPerformanceFrequency(&litmp);
       dfFreq = (double)litmp.QuadPart;// 获得计数器的时钟频率
       QueryPerformanceCounter(&litmp);
       QPart1 = litmp.QuadPart;// 获得初始值
       do
       {
          QueryPerformanceCounter(&litmp);
          QPart2 = litmp.QuadPart;//获得中止值
          dfMinus = (double)(QPart2-QPart1);
          dfTim = dfMinus / dfFreq;// 获得对应的时间值,单位为秒
       }while(dfTim<delayus);
}
//-----------------------------------------------------------------------------
void __fastcall TForm1::Button13Click(TObject *Sender)
{
      int s[4]={0x58,0xef,0x00,0x00};
      WriteDDC(4,s);
      Button8->Caption="DebugEnable";
      Timer1->Enabled=false; 
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
     int s[9]={0x6e,0x51,0x85,0xc0,0x00,0xef,0x01,0x00,0x94};
     WriteDDC(9,s); 
}

//---------------------------------------------------------------------------
 /*
void __fastcall TForm1::ReadEEPROM()
{
        int *restr;
        int s[8]={0x58,0x51,0x84,0xef,0x8a,0x04,0x01,0x52};
        restr=ReadDDC(8,s,3);
}  */

//---------------------------------------------------------------------------

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
    char receivestr[27];
    unsigned char TempRStr[11];
    unsigned int TempRInt;
    bool UpdateOupFlag=false;
    int i,j,k;
    Timer1->Enabled=false;
    checkIICbusy();
        i2cstart();
        if(sendbyte(0x59|0x01)==0)
        {
                Timer1->Enabled=false;
                Button8->Caption="DebugEnable";
                return;
        }

        for(i=0;i<7; i++)
        {
                receivestr[i]=readbyte();
                TempRStr[i]=receivestr[i];
        }
        receivestr[i]=readlastbyte();
        TempRStr[i]=receivestr[i];

        i2cstop();

        receivestr[8]='\r';
        receivestr[9]='\n';
        receivestr[10]='\0';
        for (i=0;i<11;i++)
        {
            if(PreS[i]!=receivestr[i])
            {
                 PreS[i]=receivestr[i];
                 UpdateOupFlag=true;
             }
        }
        if(receivestr[4]=='=')
        {
                switch(receivestr[5])
                {
                        case 'x':
                        case 'X':
                        receivestr[5]='0';
                        receivestr[6]='x';
                        if(TempRStr[6])
                        {
                           receivestr[7]=TempRStr[6]>>4;
                           receivestr[8]=TempRStr[6]&0x0f;
                           receivestr[9]=TempRStr[7]>>4;
                           receivestr[10]=TempRStr[7]&0x0f;
                           for(j=7;j<=10;j++)
                           {
                               if(receivestr[j]<=9)
                                   receivestr[j]+=0x30;
                               else
                                   receivestr[j]+=0x37;
                           }
                           receivestr[11]='\r';
                           receivestr[12]='\n';
                           receivestr[13]='\0';
                        }
                        else
                        {
                           receivestr[7]=TempRStr[7]>>4;
                           receivestr[8]=TempRStr[7]&0x0f;
                           for(j=7;j<=8;j++)
                           {
                               if(receivestr[j]<=9)
                                   receivestr[j]+=0x30;
                               else
                                   receivestr[j]+=0x37;
                           }
                           receivestr[9]='\r';
                           receivestr[10]='\n';
                           receivestr[11]='\0';
                        }
                        break;
                        case 'd':
                        case 'D':
                        TempRInt= TempRStr[6];
                        TempRInt=(TempRInt<<8)+ TempRStr[7];
                        receivestr[5]=TempRInt/10000+0x30;
                        TempRInt%=10000;
                        receivestr[6]=TempRInt/1000+0x30;
                        TempRInt%=1000;
                        receivestr[7]=TempRInt/100+0x30;
                        TempRInt%=100;
                        receivestr[8]=TempRInt/10+0x30;
                        TempRInt%=10;
                        receivestr[9]=TempRInt+0x30;
                        for(j=5;j<=9;j++)
                        {
                                if(receivestr[j]!=0x30)
                                        break;
                        }
                        for(k=5;k<j;k++)
                        {
                                receivestr[k]=' ';
                        }
                        receivestr[10]='\r';
                        receivestr[11]='\n';
                        receivestr[12]='\0';
                        break;
                        case 'b':
                        case 'B':
                        if(TempRStr[6])
                        {
                                for(i=0;i<9;i++)
                                {
                                    if (i==4)
                                    {
                                       receivestr[5+i]=' ';  
                                       continue;
                                    }
                                    if(TempRStr[6]>>7)
                                       receivestr[5+i]=1+0x30;
                                    else
                                        receivestr[5+i]=0+0x30;
                                     TempRStr[6]<<=1;
                                }
                                receivestr[14]=' ';
                                 for(i=0;i<9;i++)
                                {
                                    if (i==4)
                                    {
                                       receivestr[15+i]=' ';
                                       continue;
                                    }
                                    if(TempRStr[7]>>7)
                                       receivestr[15+i]=1+0x30;
                                    else
                                        receivestr[15+i]=0+0x30;
                                     TempRStr[7]<<=1;
                                }
                                receivestr[24]='\r';
                                receivestr[25]='\n';
                                receivestr[26]='\0';
                        }
                        else
                        {
                                for(i=0;i<9;i++)
                                {
                                    if (i==4)
                                    {
                                       receivestr[5+i]=' ';
                                       continue;
                                    }
                                    if(TempRStr[7]>>7)
                                       receivestr[5+i]=1+0x30;
                                    else
                                        receivestr[5+i]=0+0x30;
                                     TempRStr[7]<<=1;
                                }
                                receivestr[14]='\r';
                                receivestr[15]='\n';
                                receivestr[16]='\0';
                        }
                        break;
                        default:
                        break;
                }
        }
        if(UpdateOupFlag==true)
        { 
                RichEdit1->Text=RichEdit1->Text+receivestr;
                UpdateOupFlag=false;
         }
        Timer1->Enabled=true;
}
//---------------------------------------------------------------------------


void __fastcall TForm1::Button7Click(TObject *Sender)
{
        RichEdit1->Clear();
       
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button8Click(TObject *Sender)
{
        Timer1->Enabled=true;
        Button8->Caption="DebugExit";
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ScrollBar1Scroll(TObject *Sender,
      TScrollCode ScrollCode, int &ScrollPos)
{
        Label1->Caption=ScrollBar1->Position;
        delaytime=ScrollBar1->Position;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ScrollBar2Scroll(TObject *Sender,
      TScrollCode ScrollCode, int &ScrollPos)
{
        Label2->Caption=ScrollBar2->Position;
        ReadDelayTime=ScrollBar2->Position;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
     int s[4];
     char *EndPtr;
     s[0]=0x58;
     s[1]=strtol(Edit1->Text.c_str(),&EndPtr,16);
     s[2]=strtol(Edit2->Text.c_str(),&EndPtr,16);
     s[3]=strtol(Edit3->Text.c_str(),&EndPtr,16);
     WriteDDC(4,s);
}
//---------------------------------------------------------------------------


void __fastcall TForm1::TabSheet6ContextPopup(TObject *Sender,
      TPoint &MousePos, bool &Handled)
{
    RichEdit1->Hide();   
}
//---------------------------------------------------------------------------

void __fastcall TForm1::TabSheet7ContextPopup(TObject *Sender,
      TPoint &MousePos, bool &Handled)
{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -