在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > s3c2440實(shí)時(shí)時(shí)鐘的應(yīng)用

            s3c2440實(shí)時(shí)時(shí)鐘的應(yīng)用

            作者: 時(shí)間:2016-11-19 來源:網(wǎng)絡(luò) 收藏
            實(shí)時(shí)時(shí)鐘RTC)的主要功能是在系統(tǒng)掉電的情況下,利用后備電源使時(shí)鐘繼續(xù)運(yùn)行,從而不會(huì)丟失時(shí)間信息。

            s3c2440內(nèi)部集成了RTC模塊,而且用起來也十分簡單。其內(nèi)部的寄存器BCDSEC,BCDMIN,BCDHOUR,BCDDAY,BCDDATE,BCDMON和BCDYEAR分別存儲(chǔ)了當(dāng)前的秒,分,小時(shí),星期,日,月和年,表示時(shí)間的數(shù)值都是BCD碼。這些寄存器的內(nèi)容可讀可寫,并且只有在寄存器RTCCON的第0位為1時(shí)才能進(jìn)行讀寫操作。為了防止誤操作,當(dāng)不進(jìn)行讀寫時(shí),要把該位清零。當(dāng)讀取這些寄存器時(shí),能夠獲知當(dāng)前的時(shí)間;當(dāng)寫入這些寄存器時(shí),能夠改變當(dāng)前的時(shí)間。另外需要注意的是,因?yàn)橛兴^的“一秒誤差”,因此當(dāng)讀取到的秒為0時(shí),需要重新再讀取一遍這些寄存器的內(nèi)容,才能保證時(shí)間的正確。

            下面的程序就是一個(gè)簡單的RTC的例子。系統(tǒng)上電,或按鍵時(shí),會(huì)在LCD上顯示當(dāng)前時(shí)間的全部信息。并且可以通過UART,在PC機(jī)上改變RTC,它們之間的協(xié)議為:當(dāng)PC機(jī)發(fā)送0xAA時(shí),表示其后的7個(gè)數(shù)據(jù)分別為年、月、日、星期、小時(shí)、分和秒,在s3c2440接收到這些數(shù)據(jù)后,發(fā)送0xAA以示確認(rèn);當(dāng)PC機(jī)發(fā)送其他數(shù)據(jù)時(shí),對于s3c2440來說沒有任何意義,s3c2440只是把該數(shù)據(jù)再傳回給PC機(jī)。為了簡潔和突出重點(diǎn),在下面程序中,會(huì)省略掉以前文章中介紹過的內(nèi)容,如不清楚,請翻看本博客中的其他相關(guān)內(nèi)容。


            unsigned char date_buffer[7];//分別表示年、月、日、星期、小時(shí)、分、秒
            unsigned char flag;//用于表示更新LCD顯示時(shí)間的標(biāo)志

            //獲取時(shí)間
            void get_date(void)
            {
            rRTCCON = 1;

            date_buffer[0] = rBCDYEAR;//年
            date_buffer[1] = rBCDMON;//月
            date_buffer[2] = rBCDDATE;//日
            date_buffer[3] = rBCDDAY;//星期
            date_buffer[4] = rBCDHOUR;//小時(shí)
            date_buffer[5] = rBCDMIN;//分
            date_buffer[6] = rBCDSEC;//秒
            //當(dāng)秒為0時(shí),重新讀取
            if(date_buffer[6]==0)
            {
            date_buffer[0] = rBCDYEAR;//年
            date_buffer[1] = rBCDMON;//月
            date_buffer[2] = rBCDDATE;//日
            date_buffer[3] = rBCDDAY;//星期
            date_buffer[4] = rBCDHOUR;//小時(shí)
            date_buffer[5] = rBCDMIN;//分
            date_buffer[6] = rBCDSEC;//秒
            }

            rRTCCON = 0;
            }

            //設(shè)置時(shí)間
            void set_date(void)
            {
            rRTCCON = 1 ;

            rBCDYEAR = date_buffer[0] ;//年
            rBCDMON= date_buffer[1] ;//月
            rBCDDATE = date_buffer[2] ;//日
            rBCDDAY= date_buffer[3] ;//星期
            rBCDHOUR = date_buffer[4] ;//小時(shí)
            rBCDMIN= date_buffer[5] ;//分
            rBCDSEC= date_buffer[6] ;//秒

            rRTCCON = 0 ;
            }

            //在LCD上顯示時(shí)間
            void show_date(void)
            {
            unsigned char String[ ]="當(dāng)前時(shí)間:";
            unsigned char String_Y[ ]="年";
            unsigned char String_M[ ]="月";
            unsigned char String_D[ ]="日";

            unsigned char ToWeek[ ][7] = {"星期日","星期一","星期二","星期三","星期四","星期五","星期六"};

            unsigned char qh,wh;
            const unsigned char *mould;
            int length = sizeof(String);
            int k,xx;

            get_date();//獲取時(shí)間

            //在LCD上寫“當(dāng)前時(shí)間:”這幾個(gè)字
            for(k=0,xx=0;k{
            qh=String[k]-0xa0;
            wh=String[k+1]-0xa0;
            mould = & __HZK[ (( qh - 1 )*94 + wh- 1 )*32 ];
            Draw_Text16(30+xx,50,0x0f,mould);
            xx+=16;
            k++;
            }

            //在下一行顯示具體的時(shí)間,形式如:2010年04月03日星期六21:52:28
            //年
            //人為加上“20”
            mould = & __ASCII[2*16];
            Draw_ASCII(30,70,0x0,mould);
            mould = & __ASCII[0*16];
            Draw_ASCII(38,70,0x0,mould);

            qh=(date_buffer[0]>>4)+48;
            wh=(date_buffer[0]&0x0f)+48;
            mould = & __ASCII[qh*16];
            Draw_ASCII(46,70,0x0,mould);
            mould = & __ASCII[wh*16];
            Draw_ASCII(54,70,0x0,mould);

            qh=String_Y[0]-0xa0;
            wh=String_Y[1]-0xa0;
            mould = & __HZK[ (( qh - 1 )*94 + wh- 1 )*32 ];
            Draw_Text16(62,70,0x0f,mould);

            //月
            qh=(date_buffer[1]>>4)+48;
            wh=(date_buffer[1]&0x0f)+48;
            mould = & __ASCII[qh*16];
            Draw_ASCII(78,70,0x0,mould);
            mould = & __ASCII[wh*16];
            Draw_ASCII(86,70,0x0,mould);

            qh=String_M[0]-0xa0;
            wh=String_M[1]-0xa0;
            mould = & __HZK[ (( qh - 1 )*94 + wh- 1 )*32 ];
            Draw_Text16(94,70,0x0f,mould);

            //日
            qh=(date_buffer[2]>>4)+48;
            wh=(date_buffer[2]&0x0f)+48;
            mould = & __ASCII[qh*16];
            Draw_ASCII(110,70,0x0,mould);
            mould = & __ASCII[wh*16];
            Draw_ASCII(118,70,0x0,mould);

            qh=String_D[0]-0xa0;
            wh=String_D[1]-0xa0;
            mould = & __HZK[ (( qh - 1 )*94 + wh- 1 )*32 ];
            Draw_Text16(126,70,0x0f,mould);

            //星期
            for(k=0,xx=0;k<7-1;k++)
            {
            qh=ToWeek[date_buffer[3]][k]-0xa0;
            wh=ToWeek[date_buffer[3]][k+1]-0xa0;
            mould = & __HZK[ (( qh - 1 )*94 + wh- 1 )*32 ];
            Draw_Text16(142+xx,70,0x0f,mould);
            xx+=16;
            k++;
            }

            //小時(shí)
            qh=(date_buffer[4]>>4)+48;
            wh=(date_buffer[4]&0x0f)+48;
            mould = & __ASCII[qh*16];
            Draw_ASCII(194,70,0x0,mould);
            mould = & __ASCII[wh*16];
            Draw_ASCII(202,70,0x0,mould);

            mould = & __ASCII[ :*16 ];
            Draw_ASCII(210,70,0x0f,mould);

            //分
            qh=(date_buffer[5]>>4)+48;
            wh=(date_buffer[5]&0x0f)+48;
            mould = & __ASCII[qh*16];
            Draw_ASCII(218,70,0x0,mould);
            mould = & __ASCII[wh*16];
            Draw_ASCII(226,70,0x0,mould);

            mould = & __ASCII[ :*16 ];
            Draw_ASCII(234,70,0x0f,mould);

            //秒
            qh=(date_buffer[6]>>4)+48;
            wh=(date_buffer[6]&0x0f)+48;
            mould = & __ASCII[qh*16];
            Draw_ASCII(242,70,0x0,mould);
            mould = & __ASCII[wh*16];
            Draw_ASCII(250,70,0x0,mould);
            }

            //按鍵中斷,用于更新LCD上顯示的時(shí)間
            void __irq Key4_ISR(void)
            {
            rSRCPND = rSRCPND | 0x1;
            rINTPND = rINTPND | 0x1;
            flag=1;//置標(biāo)志
            }

            //UART中斷,用于修改時(shí)間
            void __irq uartISP(void)
            {
            char ch;
            static char temp;
            static char count;
            rSUBSRCPND |= 0x3;
            rSRCPND |= 0x1<<28;
            rINTPND |= 0x1<<28;

            if(rUTRSTAT0 & 1)//接收數(shù)據(jù)處理部分
            {

            ch = rURXH0;//接收字節(jié)數(shù)據(jù)
            if(ch==0xaa&&temp==0)//表示接收到修改時(shí)間的命令
            {
            temp=1;
            count=0;
            }
            else if(temp==1)//接收時(shí)間數(shù)據(jù)
            {
            date_buffer[count]=ch;//依次存入時(shí)間數(shù)組內(nèi)
            count++;
            if(count==7)//7個(gè)時(shí)間數(shù)據(jù)全部接收完畢
            {
            rUTXH0=0xaa;//發(fā)送0xAA
            set_date();//設(shè)置時(shí)間
            count=0;
            temp=0;
            flag=1;//更新LCD上顯示的時(shí)間
            }
            }
            else
            rUTXH0=ch;//不是接收時(shí)間的命令

            }
            }

            void Main(void)
            {
            //初始化寄存器,內(nèi)容省略
            ……
            Brush_Background(0xffffff);//LCD背景為白色
            show_date();//在LCD上顯示時(shí)間

            flag=0;//清標(biāo)志

            while(1)
            {
            if(flag)//需要更新LCD上的顯示時(shí)間
            {
            Brush_Background(0xffffff);
            show_date();
            flag=0;//清標(biāo)志
            }
            }
            }


            評論


            技術(shù)專區(qū)

            關(guān)閉