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

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

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

        作者:我行天下   來源:本站原創   點擊數:  更新時間:2014年03月30日   【字體:

        #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<z;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()); 
        }

        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的中斷服務函數
        ********************************************/
        #pragma vector=TIMERA0_VECTOR
        __interrupt void TimerA_ISR(void)
        {
            Clock();
            write=1;
           LPM3_EXIT;
        }

        關閉窗口

        相關文章

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