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

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

        MSP430與DS1302之1602顯示

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

        #include <msp430x14x.h>
        typedef unsigned char uchar;
        typedef unsigned int  uint;
        /**************宏定義***************/
        #define DataDir  P4DIR
        #define DataPort  P4OUT   
        #define Busy  0x80
        #define CtrlDir     P3DIR
        #define CLR_RS P3OUT&=~BIT0;    //RS = P3.0
        #define SET_RS P3OUT|=BIT0;
        #define CLR_RW P3OUT&=~BIT1; //RW = P3.1
        #define SET_RW P3OUT|=BIT1;
        #define CLR_EN P3OUT&=~BIT2; //EN = P3.2
        #define SET_EN P3OUT|=BIT2;

        /**************宏定義***************/
        #define DS_RST  BIT7 //DS_RST = P2.7
        #define DS_SCL  BIT5  //DS_SCL = P2.5
        #define DS_SDA  BIT6  //DS_SDA = P2.6
        #define DS_RST_IN P2DIR &= ~DS_RST
        #define DS_RST_OUT P2DIR |= DS_RST
        #define DS_RST0 P2OUT &= ~DS_RST
        #define DS_RST1 P2OUT |= DS_RST
        #define DS_SCL_IN P2DIR &= ~DS_SCL
        #define DS_SCL_OUT P2DIR |= DS_SCL
        #define DS_SCL0 P2OUT &= ~DS_SCL
        #define DS_SCL1 P2OUT |= DS_SCL
        #define DS_SDA_IN P2DIR &= ~DS_SDA
        #define DS_SDA_OUT P2DIR |= DS_SDA
        #define DS_SDA0 P2OUT &= ~DS_SDA
        #define DS_SDA1 P2OUT |= DS_SDA
        #define DS_SDA_BIT P2IN & DS_SDA
        uchar flag;//定義一個讀標志位
        uchar second,minute,hour,week,day,month,year;//秒、分、時、星期、日、月、年
        /*******************************************
        函數名稱:delay
        功    能:延時一段時間
        參    數:time--延時長度
        ********************************************/
        void delay(uint time)
        {
            uint i;
            for(i = 0;i < time;i++)     _NOP();
        }                     
        /*******************************************
        函數名稱:Delay5ms 功    能:延時約5ms
        ********************************************/
        void Delay5ms(void)
        {
            uint i=40000;
            while (i != 0)
            {
                i--;
            }
        }
        /*******************************************
        函數名稱:WaitForEnable
        功    能:等待1602液晶完成內部操作
        ********************************************/
        void WaitForEnable(void)
        {
            P4DIR &= 0x00;  //將P4口切換為輸入狀態
            CLR_RS;
            SET_RW;
            _NOP();
            SET_EN;
            _NOP();
            _NOP();
         
            while((P4IN & Busy)!=0);  //檢測忙標志
            CLR_EN;
            P4DIR |= 0xFF;  //將P4口切換為輸出狀態
        }
        /*******************************************
        函數名稱:write_com
        功    能:向液晶模塊寫入命令
        ********************************************/
        void write_com(uchar cmd)
        {
            WaitForEnable();   // 檢測忙信號?
          
            CLR_RS;
            CLR_RW;
            _NOP();
            DataPort = cmd;             //將命令字寫入數據端口
            _NOP();    
          
            SET_EN;                     //產生使能脈沖信號
            _NOP();
            _NOP();
            CLR_EN;  
        }
         
        /*******************************************
        函數名稱:write_data
        功    能:向液晶顯示的當前地址寫入顯示數據
        參    數:data--顯示字符數據
        返回值  :無
        ********************************************/
        void write_data( uchar data )
        {
            WaitForEnable();        //等待液晶不忙
            SET_RS;
            CLR_RW;
            _NOP();
            DataPort = data;        //將顯示數據寫入數據端口
            _NOP();
            SET_EN;                 //產生使能脈沖信號
            _NOP();
            _NOP();
            CLR_EN; 
        }
        void Write1602(uchar add,uchar dat)
        {
         write_com(add);
         write_data(dat);
        }
         
        void zifuchuan(uchar *ch)
        {
          while(*ch!=0)
          write_data(*ch++);
          Delay5ms();
        }

        /*******************************************
        函數名稱:LcdReset
        功    能:對1602液晶模塊進行復位操作
        ********************************************/
        void LcdReset(void)
        {
            CtrlDir |= 0x07;  //控制線端口設為輸出狀態
            DataDir  = 0xFF;  //數據端口設為輸出狀態
         
            write_com(0x38);//規定的復位操作
            Delay5ms();
            write_com(0x38); 
            Delay5ms();
            write_com(0x38);
            Delay5ms();
            write_com(0x38);//顯示模式設置 
            write_com(0x06);//寫字符時整體不移動
            write_com(0x0c);//顯示開,不開游標,不閃爍
             write_com(0x01);//顯示清屏
           
        Write1602(0x80,'2');
        Write1602(0x81,'0');
        Write1602(0x80+4,'-');
        Write1602(0x80+7,'-');
        Write1602(0x80+0x40+5,':');
        Write1602(0x80+0x40+8,':');
           
           
        }
         
        /*******************************************
        函數名稱:Reset_DS1302
        功    能:對DS1302進行復位操作
        ********************************************/
        void Reset_DS1302(void)
        {
            DS_RST_OUT;  //RST對應的IO設置為輸出狀態
            DS_SCL_OUT;  //SCLK對應的IO設置為輸出狀態
            DS_SCL0;     //SCLK=0
            DS_RST0;     //RST=0
            delay(10);
            DS_SCL1;    //SCLK=1
        }
        /*******************************************
        函數名稱:Write1Byte
        功    能:對DS1302寫入1個字節的數據
        ********************************************/
        void Write_Byte(uchar wdata)
        {
            uchar i;
            DS_SDA_OUT;  //SDA對應的IO設置為輸出狀態
            DS_RST1;  //REST=1;
            for(i = 8; i > 0; i--)
            {
                if(wdata&0x01)
                 DS_SDA1;
                else
                DS_SDA0;
                DS_SCL0;
                delay(10);
                DS_SCL1;
                delay(10);
                wdata >>= 1;
            }
        }
        /*******************************************
        函數名稱:Read1Byte
        功    能:從DS1302讀出1個字節的數據
        ********************************************/
        uchar Read_Byte()
        {
            uchar i;
            uchar rdata = 0X00;
            DS_SDA_IN;  //SDA對應的IO設置為輸入狀態
            DS_RST1;    //REST=1;
            for(i = 8; i > 0; i--)
            {
                DS_SCL1;
                delay(10);
                DS_SCL0;
                delay(10);
                rdata >>= 1;
                if(DS_SDA_BIT)
                rdata |= 0x80;
            }
          
            return(rdata);
        }
        /*******************************************
        函數名稱:Write_dat
        功    能:向某個寄存器寫入一個字節數據
        參    數:add--寄存器地址
                  dat--寫入的數據
        ********************************************/
        void Write_dat(uchar add, uchar dat)
        {
            DS_RST0;
            DS_SCL0; 
            _NOP();
            DS_RST1;
            Write_Byte(add);   //寫入地址
            Write_Byte(dat);  //寫入數據
            DS_SCL1;
            DS_RST0;
        }
        /*******************************************
        函數名稱:Read_dat
        功    能:從某個寄存器讀出一個字節數據
        參    數:addr--寄存器地址
        返回值  :讀出的數據
        ********************************************/
        uchar read_1302add(uchar add)
        {
            uchar rdata;  
            DS_RST0;
            DS_SCL0;
            _NOP();
            DS_RST1;
            Write_Byte(add);    //寫入地址
            rdata = Read_Byte();  //讀出數據
            DS_SCL1;
            DS_RST0;
          
            return(rdata);
        }
        /***********初始化1302*************/
        void init_1302()
        {
          flag=read_1302add(0x81);//讀秒寄存器最高位,讀出時鐘狀態
          if(flag&0x80);//判斷時鐘是否關閉,若內部關閉,則初始化,否則繼續走
          {
            Write_dat(0x8e,0x00);
            Write_dat(0x80,((55/10)<<4|(55%10)));//寫秒寄存器,并寫入初值55
           Write_dat(0x82,((59/10)<<4|(59%10)));//寫分寄存器,并寫入初值59
           Write_dat(0x84,((22/10)<<4|(22%10)));//寫小時寄存器,并寫入初值23
           Write_dat(0x86,((24/10)<<4|(24%10)));//寫日寄存器,并寫入初值18
           Write_dat(0x88,((2/10)<<4|(2%10)));//寫月寄存器,并寫入初值2
           Write_dat(0x8a,((5/10)<<4|(5%10)));//寫周寄存器,并寫入初值5
           Write_dat(0x8c,((12/10)<<4|(12%10)));//寫年寄存器,并寫入初值12,不能寫2012年
            Write_dat(0x90,0xa5);//寫充電方式
            Write_dat(0x8e,0x80);//加上寫保護  
         
          }
        }
        /*****************讀出秒的十進制數***************************/

        uchar readsecond()
        {
        uchar dat;
        dat=read_1302add(0x81);
        second=((dat&0x70)>>4)*10+(dat&0x0f);
        return second;
        }

        /*****************讀出分的十進制數***************************/

        uchar readminute()
        {
        uchar dat;
        dat=read_1302add(0x83);
        minute=((dat&0x70)>>4)*10+(dat&0x0f);
        return minute;
        }

        /*****************讀出小時的十進制數***************************/

        uchar readhour()
        {
        uchar dat;
        dat=read_1302add(0x85);
        hour=((dat&0x70)>>4)*10+(dat&0x0f);
        return hour;
        }
        /*****************讀出天的十進制數***************************/

        uchar readday()
        {
        uchar dat;
        dat=read_1302add(0x87);
        day=((dat&0x70)>>4)*10+(dat&0x0f);
        return day;
        }

        /*****************讀出月的十進制數***************************/

        uchar readmonth()
        {
        uchar dat;
        dat=read_1302add(0x89);
        month=((dat&0x70)>>4)*10+(dat&0x0f);
        return month;
        }
        /*****************讀出周的十進制數***************************/

        uchar readweek()
        {
        uchar dat;
        dat=read_1302add(0x8b);
        week=((dat&0x70)>>4)*10+(dat&0x0f);
        return week;
        }

        /*****************讀出年的十進制數***************************/

        uchar readyear()
        {
        uchar dat;
        dat=read_1302add(0x8d);
        year=((dat&0xf0)>>4)*10+(dat&0x0f);
        return year;
        }
         
        /************************讀出所有時間**********************/
        void  readtime()
        {
        readsecond();
        readminute();
        readhour();
        readday();
        readmonth();
        readweek();
        readyear();
        }
        /*********************向1602寫入時間****************************/
        void write_second()
        {
        uchar shi,ge;
        shi=second/10;
        ge=second%10;
        Write1602(0x80+0x40+9,0x30+shi);
        Write1602(0x80+0x40+10,0x30+ge);
        }
        void write_minute()
        {
        uchar shi,ge;
        shi=minute/10;
        ge=minute%10;
        Write1602(0x80+0x40+6,0x30+shi);
        Write1602(0x80+0x40+7,0x30+ge);
        }
        void write_hour()
        {
        uchar shi,ge;
        shi=hour/10;
        ge=hour%10;
        Write1602(0x80+0x40+3,0x30+shi);
        Write1602(0x80+0x40+4,0x30+ge);
        }

        void write_day()
        {
        uchar shi,ge;
        shi=day/10;
        ge=day%10;
        Write1602(0x80+8,0x30+shi);
        Write1602(0x80+9,0x30+ge);
        }
        void write_month()
        {
        uchar shi,ge;
        shi=month/10;
        ge=month%10;
        Write1602(0x80+5,0x30+shi);
        Write1602(0x80+6,0x30+ge);
        }
        void write_year()
        {
        uchar shi,ge;
        shi=year/10;
        ge=year%10;
        Write1602(0x80+2,0x30+shi);
        Write1602(0x80+3,0x30+ge);
        }
        void write_week()
        {
        Write1602(0x80+12,0x30+week);
        //uchar week;
        switch(week)
          {
           case 1: Write1602(0x80+12,'M');
                Write1602(0x80+13,'O');
             Write1602(0x80+14,'N');
             break;
            case 2:Write1602(0x80+12,'T');
                Write1602(0x80+13,'U');
             Write1602(0x80+14,'E');
             break;
            case 3:Write1602(0x80+12,'W');
                Write1602(0x80+13,'E');
             Write1602(0x80+14,'N');
             break;
            case 4:Write1602(0x80+12,'T');
                Write1602(0x80+13,'H');
             Write1602(0x80+14,'U');
             break;
         case 5:Write1602(0x80+12,'F');
                Write1602(0x80+13,'R');
             Write1602(0x80+14,'I');
             break;
            case 6:Write1602(0x80+12,'S');
                Write1602(0x80+13,'A');
             Write1602(0x80+14,'T');
             break;
         case 7:Write1602(0x80+12,'S');
                Write1602(0x80+13,'U');
             Write1602(0x80+14,'N');
             break;
          }
        }
         

        /*************************主函數*************************/
        void 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;
         
            WDTCTL = WDTPW + WDTHOLD;  //關狗 
            LcdReset();
         //zifuchuan("The time is:");
            //循環讀數顯示
            init_1302();
          while(1)
            {
         
          readtime();
          write_second();
          write_minute();
          write_hour();
          write_day();
          write_month();
          write_year();
          write_week();
         
             }
        }

        關閉窗口

        相關文章

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