新聞中心

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

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

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

        void SPI_INT(void) //SPI初始化
        {
        SPI0CFG=0x40;
        SPI0CN=0x01; //0000 0001最后一位是SPI使能位 SPI工作在三線主方式
        SPI0CKR=0x0f; //SPI 時鐘頻率設置為100kHz 0x63

        IE &= 0xbf; //關閉SPI中斷
        }

        void SMB_INT(void) //SMB初始化
        {
        SMB0CF=0x5f; //使能SMB 允許時間擴充 定時器2低字節溢出時鐘源

        SMB0CF|=0x80;
        }


        void TIME01_INT(void) //定時器初始化
        {
        TCON=0x10; //定時器0允許
        TMOD=0x01; //定時器0在16位工作方式
        CKCON &= 0xf8;
        CKCON |= 0x01; //定時器0使用系統4分頻

        TL0=0x03;
        TH0=0x03;

        IE|=0x02;
        }


        void TIME2_INT(void) //定時器2用于配置SMB的時鐘頻率
        {
        TMR2CN=0x00;
        CKCON |= 0x00;

        TMR2RLL = 0xef;
        TMR2RLH = 0xff;
        TMR2L = 0xef;
        TMR2H = 0xff;

        TMR2CN |= 0x0c;
        }

        void TIME3_INT(void)//用于I2C的超時檢測
        {
        TMR3CN = 0x00; //定時器3為16位自動重載
        CKCON &= ~0x40;

        TMR3RLL = 0xaf;
        TMR3RLH = 0x57;
        TMR3L = 0xaf;
        TMR3H = 0x57;

        EIE1|=0x00;
        TMR3CN |= 0x04;
        }

        void pio_int(void) // 端口配置
        {
        XBR0=0x06;
        XBR1=0x40;

        P0MDIN=0xff; //禁止模擬輸入,0為模擬,1為數字
        P0MDOUT=0x0d; //0為開漏,1為推挽(ff)
        P0SKIP=0x08;

        P1MDIN=0xff;
        P1MDOUT=0xff; //低四位用于138
        P1SKIP=0x00;

        P0=0xff;
        P1=0xff;

        }


        /*************呈現各種顯示效果的函數集****************/
        //void Jump_Word(uchar a) 立即跳顯示一個字或一張圖案
        //void M_Word(uchar a)卷簾出顯示一個字或一張圖案
        //void M_Words(number) 顯示幾個交換的字
        //void UP_Run(number) 向上滾屏n個字
        //void L_Removeout(number) 右入左出n個字
        //void M_Black(void) 黑屏
        //void R_Removeout(number) 左入右出n個字
        /*****************************************************/

        /****************立即跳顯示一個字或一張圖案***************/
        void Jump_Word(uchar a)
        {register uchar i,q;
        for(i=0;i<32;i++)
        {
        for(q=0;q {dispram[i+q*32]=Bmp[a][i];}
        //if(i%2)delay(SPEED);
        }
        }
        /****************卷簾出顯示一個字或一張圖案***************/
        void M_Word(uchar a)
        {register uchar i,q;
        for(i=0;i<32;i++)
        {
        for(q=0;q {dispram[i+q*32]=Bmp1[a][i];}
        if(i%2)delay(SPEED);
        }
        }

        /****************卷簾出顯示number個字***************/
        void M_Words(number)
        {register uchar i,q,w;
        for(w=0;w{
        for(i=0;i<32;i++)
        {
        for(q=0;q if(i%2)delay(SPEED);
        }
        delay(TIME);
        }
        }

        /****************向上滾屏number個字***************/
        void UP_Run(number)
        {register uchar i,j,k,q;
        for(i=0;i{
        for(j=0;j<16;j++)
        {
        for(k=0;k<15;k++)
        {
        for(q=0;q {
        dispram[k*2+q*32]=dispram[(k+1)*2+q*32];
        dispram[k*2+1+q*32]=dispram[(k+1)*2+1+q*32];
        }
        }
        for(q=0;q {
        dispram[30+q*32]=Bmp[q+i*BLKN/2][j*2];
        dispram[31+q*32]=Bmp[q+i*BLKN/2][j*2+1];
        }
        delay(2*SPEED);
        }
        delay(2*TIME);
        }
        }

        /****************左移出顯示number個字*******************/
        void L_Removeout(number)
        {register uchar i,j,k,l,q;
        for(i=0;i{
        for(j=0;j<2;j++)
        for(k=0;k<8;k++)
        {
        for(l=0;l<16;l++)
        {
        for(q=0;q {
        dispram[l*2+q*32]=dispram[l*2+q*32]<<1|dispram[l*2+1+q*32]>>7;
        if(q==BLKN/2-1)
        dispram[l*2+1+q*32]=dispram[l*2+1+q*32]<<1|Bmp[i][l*2+j]>>(7-k);
        else
        dispram[l*2+1+q*32]=dispram[l*2+1+q*32]<<1|dispram[l*2+(q+1)*32]>>7;
        }
        }
        delay(2*SPEED);
        }
        }
        }

        /****************卷簾出黑屏***************/
        void M_Black(void)
        {register uchar i,q;
        for(i=0;i<32;i++)
        {
        for(q=0;q {dispram[i+q*32]=0x00;}
        if(i%2)delay(SPEED);
        }
        }
        /****************右移出顯示number個字*******************/
        void R_Removeout(number)
        {register uchar i,j,k,l,q;
        for(i=0;i{
        for(j=2;j>0;j--)
        for(k=0;k<8;k++)
        {
        for(l=0;l<16;l++)
        {
        for(q=0;q {
        dispram[l*2+1+q*32]=dispram[l*2+1+q*32]>>1|dispram[l*2+q*32]<<7;
        if(q==0)
        dispram[l*2+q*32]=dispram[l*2+q*32]>>1|Bmp[i][l*2+j-1]<<(7-k);
        else
        dispram[l*2+q*32]=dispram[l*2+q*32]>>1|dispram[l*2+1+(q-1)*32]<<7;
        }
        }
        delay(2*SPEED);
        }
        }
        }


        /*************用于時鐘芯片操作的函數集****************/
        //void write_pcf8563(void)寫時鐘芯片
        //void read_pcf8563(void)讀時鐘芯片
        /*****************************************************/
        void write_pcf8563(void)
        {
        SPI0CN &=~0x01; //暫時關掉SPI通訊

        send =0xa2; //送子器件地址
        while(BUSY);
        BUSY=1;
        SMB_RW=0;control=5;
        STA=1; //開始傳送

        while(BUSY);
        SPI0CN |=0x01; //重新開啟SPI
        }

        void read_pcf8563(void) //讀當時的時,分,鈔
        {

        SPI0CN &=~0x01;
        send =0xa2; //送子器件地址
        while(BUSY);
        BUSY=1;
        SMB_RW=0;
        STA=1;

        send=0x02;
        while(!SI);
        BUSY=1;

        send=0xa2;
        while(BUSY);
        BUSY=1;
        SMB_RW=1;
        STA=1;


        while(BUSY);
        BUSY=1;
        sec=receive1[2]&0x7f;//讀秒
        min=receive1[1]&0x7f;//讀分
        hou=receive1[0]&0x3f;//讀時

        SPI0CN |=0x01;
        }

        void spit_time(void)//分別計算時、分、秒的各位數字
        {
        sg=(int)hou/16;
        sd=(int)hou%16;

        fg=(int)min/16;
        fd=(int)min%16;

        mg=(int)sec/16;
        md=(int)sec%16;
        }

        void dat_int(void) //數據初始化
        {
        scyx=1;
        CLK=0;
        }

        void sysclk_int(void);
        void delay(unsigned n);
        void pio_int(void);
        void SPI_INT(void);
        void SMB_INT(void);
        void dat_int(void);
        void TIME01_INT(void);
        void TIME2_INT(void);
        void TIME3_INT(void);
        void write_pcf8563(void);
        void read_pcf8563(void);
        void spit_time(void);

        /**************主函數**************/
        void main(void) //主程序
        {
        register uchar i;
        PCA0MD &= ~0x40;// 關閉看門狗
        sysclk_int();
        OSCICN |= 0x02;

        /****************初始化檢測pcf8563****************/
        while(!pcf8563_sda)
        {
        XBR1 = 0x40;
        pcf8563_scl = 0;
        for(i = 0; i < 255; i++);
        pcf8563_scl = 1;
        while(!pcf8563_scl);

        for(i = 0; i < 10; i++);
        XBR1 = 0x00;
        }



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 炉霍县| 双城市| 隆昌县| 武义县| 乐平市| 育儿| 渑池县| 望都县| 获嘉县| 稷山县| 黎川县| 四川省| 连平县| 聂拉木县| 景谷| 梅河口市| 霍邱县| 缙云县| 瑞安市| 吉安县| 天柱县| 上蔡县| 驻马店市| 沐川县| 扬州市| 安新县| 双流县| 隆化县| 拜城县| 安顺市| 建始县| 汉沽区| 保山市| 临澧县| 焉耆| 华蓥市| 青铜峡市| 云浮市| 开江县| 新和县| 留坝县|