新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 用430寫的IIC總線協議:24C02掉電記憶程序(數碼管顯示)

        用430寫的IIC總線協議:24C02掉電記憶程序(數碼管顯示)

        作者: 時間:2016-12-02 來源:網絡 收藏
        #include <msp430x14x.h>

        #define OP_READ 0xa1 // 器件地址以及讀取操作
        #define OP_WRITE 0xa0 // 器件地址以及寫入操作
        #define uchar unsigned char
        #define uint unsigned int
        #define SDA_OUT P1DIR|=BIT3
        #define SDA_IN P1DIR&=~BIT3
        #define SCL_OUT P1DIR|=BIT2
        #define SCL_IN P1DIR&=~BIT2
        #define SDA_H P1OUT|=BIT3
        #define SDA_L P1OUT&=~BIT3
        #define SCL_H P1OUT|=BIT2
        #define SCL_L P1OUT&=~BIT2
        #define wei_h P5OUT|= BIT5
        #define wei_l P5OUT&= ~BIT5
        #define duan_l P6OUT &= ~BIT6
        #define duan_h P6OUT |= BIT6
        //數碼管7位段碼:0--f
        uchar table[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
        0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
        //記錄顯示位數的全局變量
        uchar miao;
        uchar write;
        //8M晶振時大約20us延時程序
        void delayus(uint z)
        {
        uint i,j;
        for(i = 0;i<20;i++)
        for(j=0;j {;;};
        }
        // 開始位
        void start()
        {
        SDA_OUT;
        SCL_OUT;
        SDA_H;
        SCL_H;
        delayus(1); //20
        SDA_L;
        delayus(2);//40
        SCL_L;
        }
        // 停止位
        void stop()
        {
        SDA_OUT;
        SCL_OUT;
        SDA_L;

        delayus(2);//20
        SCL_H;
        delayus(2);
        SDA_H;
        }
        // 從AT24Cxx移入數據到MCU
        uchar shin()
        {
        uchar i,read_data;
        SDA_OUT;
        SCL_OUT;
        for(i = 0; i < 8; i++)
        {
        SDA_H;
        delayus(1);
        SCL_H;
        SDA_IN;
        read_data <<= 1;
        if(P1IN&BIT3)
        read_data|=0x01;
        SDA_OUT;
        SCL_L;
        }
        return(read_data);
        }
        // 從MCU移出數據到AT24Cxx
        uchar shout(uint write_data)
        {
        uchar i;
        uchar ack_bit;
        SDA_OUT;
        SCL_OUT;
        for(i = 0; i < 8; i++) // 循環移入8個位
        {
        if(write_data&0x80)
        SDA_H;
        else
        SDA_L;
        delayus(2);//2
        SCL_H;
        delayus(2);//2
        SCL_L;
        delayus(2);//2
        write_data <<= 1;
        }

        SDA_H; // 讀取應答
        delayus(2);
        SCL_H; //注意拉高
        delayus(2);
        SDA_IN;
        if(P1IN&BIT3)
        ack_bit=1;
        else ack_bit=0;
        SCL_L;
        return ack_bit; // 返回AT24Cxx應答位
        }
        // 在指定地址addr處寫入數據write_data
        void write_byte(uchar addr, uchar write_data)
        {
        SDA_OUT;
        SCL_OUT;
        SDA_H;
        SCL_H;
        start();
        shout(OP_WRITE);
        shout(addr);
        shout(write_data);
        stop();
        delayus(1000);// 寫入周期
        }
        // 在當前地址讀取
        uint read_current()
        {
        uint read_data;
        start();
        shout(OP_READ);
        read_data = shin();
        stop();
        return read_data;
        }

        // 在指定地址讀取
        uchar read_random(uint random_addr)
        {
        SDA_IN;
        SCL_OUT;
        SDA_H;
        SCL_H;
        start();
        shout(OP_WRITE);
        shout(random_addr);
        return(read_current());
        }

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

        void display(uchar dat)
        {
        P4OUT = table[dat];//輸出段選信號
        duan_h;
        duan_l;
        P4OUT = 0x00; //設置P4,P5的輸出初值
        wei_h;
        wei_l;
        }

        void Clock(void)
        {
        miao++;
        if(miao==10)
        miao=0;
        }

        int main( void )
        {
        /*下面六行程序關閉所有的IO口*/
        P1DIR = 0XFF;P1OUT = 0XFF;
        P2DIR = 0XFF;P2OUT = 0XFF;
        P3DIR = 0XFF;P3OUT = 0XFF;
        P4DIR = 0XFF;P4OUT = 0XFF;
        P5DIR = 0XFF;P5OUT = 0XFF;
        P6DIR = 0XFF;P6OUT = 0XFF;


        SDA_OUT;
        SCL_OUT;
        SDA_H;
        SCL_H;


        WDTCTL = WDTPW + WDTHOLD;
        CCR0 = 32768 - 1;//設置定時器A的中斷時間為1S
        TACTL = TASSEL_1 + MC_1; //計數時鐘ACLK, 增計數模
        CCTL0 |= CCIE; //使能CCR0比較中斷
        _EINT();//打開全局中斷


        miao=read_random(3) ;//從地址2中讀出以前保存的數據
        if(miao>9) miao=0; //防止首次讀出錯誤數據

        while(1)
        {
        display(miao);
        if(write==1)
        {
        write=0;
        write_byte(3,miao);
        }

        LPM3;//進入LPM3低功耗模式

        }
        }

        /*******************************************
        函數名稱:TimerA_ISR
        功 能:定時器A的中斷服務函數
        ********************************************/
        #pragmavector=TIMERA0_VECTOR
        __interrupt void TimerA_ISR(void)
        {
        Clock();
        write=1;
        LPM3_EXIT;
        }



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 宝丰县| 普格县| 瑞安市| 内乡县| 大洼县| 措勤县| 泗阳县| 三门峡市| 昌黎县| 习水县| 临潭县| 东海县| 都江堰市| 富平县| 马公市| 喀什市| 报价| 香港 | 阿拉善右旗| 尚志市| 太仓市| 卢湾区| 公主岭市| 武邑县| 皋兰县| 团风县| 西乌珠穆沁旗| 宿州市| 嘉定区| 米林县| 石台县| 汤原县| 聂拉木县| 隆安县| 遵化市| 铜陵市| 沾益县| 汉沽区| 芦溪县| 重庆市| 都匀市|