<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

        SLE4442卡_IC的51單片機驅動程序

        作者:liumei   來源:本站原創   點擊數:  更新時間:2014年03月31日   【字體:

        整理了最初的實驗草稿版,將端口宏定義,函數聲明以及常用的函數聲明建立頭文件,感覺清楚多了,在不斷地修改中凝練,在不停的實踐中提高,滿眼的思緒,在小小的Readme中劃過一筆~~~~~~~~
        char data_RST[4], ErrorCount[4];

        void IC_RST(void)
        {
        uchar value,i,count;
        DATA_IN;  //IC輸入
        RST_LOW;  //復位時序
        CLK_LOW;
        DATA_HIGH;
        DelayUs(5);
        RST_HIGH;
        DelayUs(5);
        CLK_HIGH;
        DelayUs(5);
        CLK_LOW;
        DelayUs(5);
        RST_LOW;
        DelayUs(2);
        for(i=0;i<4;i++) //讀4個BYTE  可用后面的Byte_Read()代替
        {
          value = 0xff;
          for(count=0;count<8;count++)
          {
           value = value >> 1;
           DelayUs(2);
           CLK_LOW;
           DelayUs(2);
           CLK_HIGH;
           DelayUs(2);
           if(RD5 == 1)
           {
            value |= 0x80; //判斷IO腳是否為1,是則位置1
           }
           else
           {
            value &= 0x7f; //否則位置0
           }
           DelayUs(2);

          }
          data_RST[i] = value;
          DelayUs(2);
        }
        DelayUs(2);
        CLK_LOW;
        DelayUs(2);
        DATA_HIGH;
        }

        void IC_Init(void)  //初始化
        {
        TRISD1 = 0;
        RD1 = 0;  //上電
        TRISD4 = 0;  //時鐘輸出
        TRISD3 = 0;  //RST輸出
        DelayMs(5);  //上電的必要延時,否則程序出錯
        }


        void Start(void)
        {
        DATA_OUT; //開始時序
        CLK_LOW;
        DATA_HIGH;
        DelayUs(2);
        CLK_HIGH;
        DelayUs(2);
        DATA_LOW;
        DelayUs(2);
        CLK_LOW;
        }

        void Stop(void) //結束時序
        {
        DATA_OUT;
        CLK_LOW;
        NOP();
        NOP();
        DATA_LOW;
        DelayUs(2);
        CLK_HIGH;
        DelayUs(2);
        DATA_HIGH;
        DelayUs(2);
        }

        uchar Byte_Read(void) //讀字節
        {
        uchar count;
        uchar value;
        DATA_IN;
        DelayUs(2);
        value = 0xff;
        for(count=0;count<8;count++)
        {
          value = value >> 1;  //循環右移,從最低位開始讀
          DelayUs(2);
          CLK_LOW;
          DelayUs(2);
          CLK_HIGH;
          DelayUs(2);
          if(RD5 == 1)
          {
           value |= 0x80;//判斷IO腳是否為1
          }
          else
          {
           value &= 0x7f;
          }
          DelayUs(2);
        }
        return (value);
        }


        void Byte_WRT(uchar Xdata)   //寫字節
        {
        uchar count;
        DATA_OUT;
        DelayUs(2);
        for(count=8;count!=0;count--)
        {
          CLK_LOW;
          DelayUs(2);
          if((Xdata)&0x01)
          {
           DATA_HIGH;
          }
          else
          {
           DATA_LOW;
          }
          DelayUs(2);
          CLK_HIGH;
          DelayUs(2);
          Xdata = Xdata >> 1;  //循環右移,從最低位開始寫
        }
        }


        void Command(uchar command,uchar address,uchar IC_data)
        {
        Start();
        Byte_WRT(command);         //發送命令
        Byte_WRT(address);         //發送地址
        Byte_WRT(IC_data);   //發送數據
        Stop();                 //操作命令結束
        }

        void Process(void)
        {
        uint j;  //寫指令后的處理過程
        DATA_OUT;
          DelayUs(2);
          CLK_LOW;
          DATA_LOW;
          DelayUs(2);
          for(j = 0;j < 255;j++)
          {
           CLK_HIGH;
           DelayUs(2);
           CLK_LOW;
           DelayUs(2);
          }
        DATA_HIGH;
        }

        void Process2(void)
        {
        uint j;  //寫指令后的短處理過程
        DATA_OUT;
          DelayUs(2);
          CLK_LOW;
          DATA_LOW;
          DelayUs(2);
          for(j = 0;j < 2;j++)
          {
           CLK_HIGH;
           DelayUs(2);
           CLK_LOW;
           DelayUs(2);
          }
        DATA_HIGH;
        }

        uchar Code_Check(uchar Code1,uchar Code2,uchar Code3)  //密碼校驗函數
        {
        uchar i;
        Command(0x31,0x00,0x00);
        for(i = 0;i < 4;i++)
        {
          ErrorCount[i] = Byte_Read();
        }
        if(ErrorCount[0] == 0)
        {
          return 0;
        }
        else
        {
          if((ErrorCount[0]&0x01) == 1)
          {
           ErrorCount[0] &= 0x06;      //bit0=0;
          }
          else if((ErrorCount[0]&0x02) == 1)
          {
           ErrorCount[0] &= 0x05;      //bit1=0;
          }
          else
          {
           ErrorCount[0] &= 0x03;      //bit2=0
          }
        }
        Command(0x39,0x00,ErrorCount[0]);
        Process();

        Command(0x33,0x01,Code1);
        Process2();

        Command(0x33,0x02,Code2);
        Process2();

        Command(0x33,0x03,Code3);
        Process2();

        Command(0x39,0x00,0xff);
        Process();

        Command(0x31,0x00,0x00);
        for(i = 0;i < 4;i ++)
        {
          ErrorCount[i] = Byte_Read();
        }
        if(ErrorCount[0] == 0x07)
        {
          return 1;
        }
        else
        {
          return 0;
        }
        }


        void ReadMainROM(uchar addr,uchar *p,uchar N)  //讀主存區
        {
        Command(0x30,addr,0xff);
        while(N--)

          *p=Byte_Read();
             p++;
            }
        }


        void WriteMainROM(uchar addr,uchar *t,uchar N)  //寫主存區
        {
        while(N--)
        {
          Command(0x38,addr,*t);
          Process();
          addr++;
          t++;
            }
        }

        void ReadProROM(uchar addr,uchar *p,uchar N)  //讀保護區
        {
        Command(0x34,addr,0xff);
        while(N--)

          *p=Byte_Read();
             p++;
            }
        }


        void WriteProROM(uchar addr,uchar *t,uchar N)  //寫保護區
        {
        while(N--)
        {
          Command(0x3c,addr,*t);
          Process();
          addr++;
          t++;
            }
        }

        void ReadCode(uchar addr,uchar *p,uchar N)  //讀密碼
        {
        Command(0x31,addr,0xff);
        while(N--)

          *p=Byte_Read();
             p++;
            }
        }

        void WriteCode(uchar addr,uchar *t,uchar N)  //寫密碼
        {
        while(N--)
        {
          Command(0x39,addr,*t);
          Process();
          addr++;
          t++;
            }
        }

        }
         

        關閉窗口

        相關文章

        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮