新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > C8051F330 16*16點陣(SPI 、SMBus、I2C)PCF8563

        C8051F330 16*16點陣(SPI 、SMBus、I2C)PCF8563

        作者: 時間:2016-11-30 來源:網絡 收藏

        /****************初始化檢測pcf8563****************/

        本文引用地址:http://www.104case.com/article/201611/324045.htm

        pio_int();
        TIME01_INT();
        TIME2_INT();
        TIME3_INT();
        SPI_INT(); //SPI0DAT是SPI的數據寄存
        SMB_INT();
        spit_time();
        EIE1|=0x01;
        EA=1;
        dat_int();

        led=0;

        TR0=0;
        delay(1000);
        write_pcf8563();

        while(1)
        {
        TR0=0;
        BUSY=0;
        read_pcf8563();
        spit_time();
        TR0=1;


        //Jump_Word(sg);
        //Jump_Word(sd);
        //Jump_Word(fg);
        //Jump_Word(fd);
        //Jump_Word(md);
        //M_Word(md);
        M_Word(4);
        delay(10*TIME);

        M_Words(TOTAL);

        UP_Run(TOTAL);

        M_Black();
        delay(10*TIME);

        L_Removeout(TOTAL);
        delay(3*TIME);

        M_Black();
        delay(10*TIME);


        R_Removeout(TOTAL);
        delay(3*TIME);

        }//總while循環的結束
        }//main函數的結束

        void t0(void) interrupt 1 //定時器0的中斷服務程序
        {
        register uchar m,n=BLKN;
        TH0 = 0xfc;
        TL0 = 0x18;
        m = CONIO;
        m = (++m)&0x0f;
        for(n=0;n{
        SPI0DAT = dispram[30-m*2+n];//dispram[((BLKN-)n/2+1)*30-m*2-(n/2)*30+n]
        while(!SPIF);
        SPIF=0;
        }
        CONIO &= 0xf0;
        CLK = 1;
        CONIO |= m;
        CLK = 0;
        scyx=1;

        }

        void SMBus_ISR (void) interrupt 7
        {
        bit FAIL = 0;

        if (ARBLOST == 0) //如果贏得總線
        {
        switch (SMB0CN & 0xF0) //確定中斷來源
        {
        case 0xe0: //主發送方式下產生開始條件
        SMB0DAT = send;
        SMB0DAT &= 0xFE;
        SMB0DAT |= SMB_RW; //對發送的數據進行處理
        STA = 0;
        break;

        case 0xc0: //主方式下發送
        if (ACK)
        {
        if (SMB_RW == 0)
        {
        if(send_number<=3)
        {
        if(control==0)
        {
        SMB0DAT = send;
        send_number+=5;
        }
        else
        {
        SMB0DAT = send1[send_number];
        send_number++;
        }
        }
        else
        {
        send_number=0;control=0;
        STO = 1;
        BUSY = 0;
        }
        }
        else {;} //BUSY=0
        }
        else
        {
        STO = 1;
        STA = 1;
        }
        break;


        case 0x80: //主方式下接收
        if (receive_number-1>0) //控制接收3個數據就結束
        {
        receive1[receive_number-1] = SMB0DAT;
        ACK = 1;
        receive_number--;
        }
        else
        {
        receive1[receive_number-1] = SMB0DAT;
        receive_number=3;
        BUSY = 0;
        ACK = 0;
        STO = 1;
        }
        break;

        default:
        FAIL = 1;
        break;
        }
        }

        else //輸掉總線
        {
        FAIL = 1;
        }


        if (FAIL) //SMBUS通訊失敗后的處理
        {
        SMB0CF &= ~0x80;
        SMB0CF |= 0x80;
        STA = 0;
        STO = 0;
        ACK = 0;
        BUSY = 0;
        FAIL = 0;

        }

        SI = 0;
        }


        void T3_ISR() interrupt 14 //定時器3中斷服務程序 用于檢測SMBus是否超時
        {
        SMB0CF &= ~0x80;
        SMB0CF |= 0x80;
        TMR3CN &=~0x80;

        STA = 0;
        BUSY = 0;
        pcf8563_scl=1;
        }


        上一頁 1 2 3 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 延吉市| 辽中县| 大厂| 渑池县| 开江县| 新津县| 宣恩县| 色达县| 普兰店市| 汽车| 鞍山市| 金乡县| 崇仁县| 怀集县| 湘阴县| 宜州市| 乐昌市| 诸暨市| 东海县| 历史| 云安县| 鄂州市| 铁岭市| 延吉市| 隆德县| 岳池县| 庆安县| 彭水| 安仁县| 即墨市| 柞水县| 沙洋县| 康乐县| 界首市| 金阳县| 琼中| 翼城县| 凤凰县| 怀集县| 丽江市| 马公市|