新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 點陣萬年歷(帶時間、年月日星期調整及鬧鐘功能)C程序

        點陣萬年歷(帶時間、年月日星期調整及鬧鐘功能)C程序

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

        if(f!=0)//如果標志位不為0,則執行以下內容-------調整日
        {
        xianriyue(yue,ri);
        if(key1==0)//加日部分
        {
        delay(10);
        if(key1==0)
        {
        xianriyue(yue,ri);
        ri++;
        if(ri==32)
        ri=1;
        write1302(0x8e,0x00);//去掉保護
        write1302(0x86,((ri/10)<<4)|(ri%10));//日數據寫入
        write1302(0x8e,0x80);//打開保護
        readvalue=read1302(0x87);
        ri=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);
        while(!key1);
        }
        }
        if(key2==0)//減日部分
        {
        delay(10);
        if(key2==0)
        {
        xianriyue(yue,ri);
        ri--;
        if(ri==(1-1))
        ri=31;
        write1302(0x8e,0x00);//去掉保護
        write1302(0x86,((ri/10)<<4)|(ri%10));//日數據寫入
        write1302(0x8e,0x80);//打開保護
        readvalue=read1302(0x87);
        ri=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);
        while(!key2);
        }

        }
        }
        if(g!=0)//如果標志位不為0,則執行以下內容-----星期調整部分
        {
        xi(xin);
        if(key1==0)//星期加部分
        {
        delay(10);
        if(key1==0)
        {
        xi(xin);
        xin++;//將星期+1
        if(xin==8)//如果星期到了8就清它清1
        xin=1;//清1
        write1302(0x8e,0x00);//去掉保護
        write1302(0x8a,((xin/10)<<4)|(xin%10));//顯示星期天
        write1302(0x8e,0x80);//打開保護
        readvalue=read1302(0x8b);//讀星期
        xin=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);//將星期值還原
        while(!key1);
        }
        }
        if(key2==0)//星期減部分
        {
        delay(10);
        if(key2==0)
        {
        xi(xin);
        xin--;//減1
        if(xin==(1-1))//如果到了(1-1)就給它7,因為星期只1---7
        xin=7;//將它給7
        write1302(0x8e,0x00);//去掉保護
        write1302(0x8a,((xin/10)<<4)|(xin%10));//顯示星期天
        write1302(0x8e,0x80);//打開保護
        readvalue=read1302(0x8b);
        xin=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);//讀星期值
        while(!key2);
        }

        }
        }
        if(h!=0)////如果標志位不為0,則執行以下內容------------以下是鬧鐘小時調整部分
        {
        xianniao(shin,fenn,2);//調整鬧鐘小時與分鐘顯示子程序
        if(key1==0)//鬧鐘小時加處理
        {
        delay(10);
        if(key1==0)
        {
        xianniao(shin,fenn,2);
        shin++;//將星期+1
        if(shin==24)//如果星期到了8就清它清1
        shin=0;//清1
        while(!key1);
        }
        }
        if(key2==0)//鬧鐘小時減處理
        {
        delay(10);
        if(key2==0)
        {
        xianniao(shin,fenn,2);
        shin--;
        if(shin==(0-1))
        shin=23;
        while(!key2);
        }

        }
        }
        if(i!=0)//如果標志位不為0,則執行以下內容----------鬧鐘分鐘調整
        {
        xianniao(shin,fenn,2);
        if(key1==0)//鬧鐘分鐘加處理
        {
        delay(10);
        if(key1==0)
        {
        xianniao(shin,fenn,2);
        fenn++;//將星期+1
        if(fenn==60)//如果星期到了8就清它清1
        fenn=0;//清1
        while(!key1);
        }
        }
        if(key2==0)//鬧鐘分鐘減處理
        {
        delay(10);
        if(key2==0)
        {
        xianniao(shin,fenn,2);
        fenn--;
        if(fenn==(0-1))
        fenn=59;
        while(!key2);
        }

        }
        }
        }
        /******************************************************/
        /*******************響鬧子程序*************************/
        /******************************************************/
        void xiangniao()
        {
        bit clock;//定義一個標志位
        if(clockbiao==0)//鬧鐘總標志為0時才可以執行鬧鐘處理程序
        {
        if(clock==0)//如果標志位為0,就執行下面內容
        {
        if(shin==shi)//主時間小時與鬧鐘小時相等嗎?
        {
        if(fenn==fen)//主時間分鐘與鬧鐘分鐘相等嗎?
        bbtsoud();//相等了就執行鬧鐘響一聲子程序,即小時與分鐘都相等了就執行鬧鈴
        }
        }
        if(fenn!=fen)//如果分鐘不等
        clock=0;//將標志位清0,以便下次再響鈴
        if(key1==0)//判斷加"+"按鍵有沒有被按下,如果按下了,就讓鬧鈴停止響
        {
        delay(10);
        if(key1==0)
        {
        clock=1;//將標志位清0,讓鬧鐘在響鈴時立馬停下來
        while(!key1);
        }
        }
        }
        if(key2==0)//如果減按鍵按下了,則則關閉鬧鈴全部功能
        {
        delay(10);
        if(key2==0)//如果加按鍵按下了,則全部復位
        {
        clockbiao=~clockbiao;
        bbtsoud();//蜂鳴器響一聲子程序
        while(!key2);//按鍵釋放
        }
        }
        }

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

        /******************************************************/
        /******************************************************/
        /**********主程序(包括主顯示/鬧鐘/按鍵處理)************/
        /******************************************************/
        /******************************************************/
        void main()
        {
        init1302();
        TMOD=0X11;//寄存器工作方式
        EA=1;//開總中斷
        TR0=1;//開定時器
        ET0=1;//開定時器中斷
        TH0=(65536-20000)/256;//賦值給高位
        TL0=(65536-20000)%256;//賦值給低位
        TR1=1;//開定時器
        ET1=1;//開定時器中斷
        TH1=(65536-50000)/256;//賦值給高位
        TL1=(65536-50000)%256;//賦值給低位
        while(1)
        {
        if(flag==0)//如果標志位為0,就讓它執行主程序,不讓它讀按鍵處理部分,省資源
        {
        value();//調用DS1302時間轉換子程序
        xianzhu(nian,yue,ri,xin);//調用主顯示
        xiangniao();//調用響鬧子程序
        }
        skey();//調用按鍵處理子程序
        }
        }
        /******************************************************/
        /*******************定時中斷0子程序********************/
        /******************************************************/
        void zhong() interrupt 3
        {
        uchar ding;
        TH1=(65536-50000)/256;
        TL1=(65536-50000)%256;
        ding++;
        if(ding>=10)//模擬普通鬧鐘小數閃爍處理部分
        {
        ding=0;
        dian=~dian;//0.5秒閃一次,它不參與具體計時,具體計時只是DS1302內部
        }
        }
        /******************************************************/
        /*******************定時中斷1子程序********************/
        /******************************************************/
        void zhong1() interrupt 1//T1中斷服務程序
        {
        uchar ding1,ding2;
        TH0=(65536-10000)/256;//賦值給高位
        TL0=(65536-10000)%256;//賦值給低位
        ding1++;
        ding2++;
        if(ding2>=50)//進入調整模式時閃爍標志位處理
        {
        ding2=0;
        flag1=~flag1;
        }
        switch(yin)//以下是主功能按鍵處理子程序
        {
        case 0:if(ding1>=250)//長按功能按鍵進入調整模式,否則怕誤按-------------進入查看年月日功能
        {
        ding1=0;//將定時器清0
        if(key==0)
        {
        delay(100);
        if(key==0)
        {
        yin++;//將標志位加1
        lk=8;//些句是調用"年月日星期"顯示的關鍵一步,即打開下屏顯示
        shr=1;//將標志位置1
        bbtsoud();//蜂鳴器響一聲
        while(!key);//按鍵釋放
        }
        }
        }
        break;
        case 1:if(key==0)//-----------------------------進入調整模式閃爍功能
        {
        delay(100);
        if(key==0)
        {
        yin++;//以便進入一個功能
        a=1;//標志位置1,以便進入按鍵功能
        shr=0;//將上次標志位清0,以免與現在的鍵值產生沖突
        lk=0;//將下半屏清掉
        flag=1;//將主程序中的標志位置1
        bbtsoud();//蜂鳴器響一聲
        TR1=0;//將定時器關掉
        dian=0;//將主時間中的兩位小數點標志位打開
        write1302(0x8e,0x00);//去掉DS1302保護
        write1302(0x80,0x80);//當它等于0X80時,讓DS1302時間停下來,以便調整
        write1302(0x8e,0x80);//讓DS1302保護
        while(!key);
        }
        }
        break;
        case 2: if(key==0)//-----------------------------進入主時間小時調整功能
        {
        delay(100);
        if(key==0)
        {
        yin++;//以下便進行下一功能
        b=1;//標志位置1
        a=0;
        bbtsoud();
        while(!key);
        }
        }
        break;
        case 3: if(key==0)//---------------------------進入主時間分鐘時調整功能
        {
        delay(100);
        if(key==0)
        {
        yin++;
        b=0;
        c=1;
        bbtsoud();
        while(!key);
        }
        }
        break;
        case 4: if(key==0)//---------------------------------進入日期年調整功能
        {
        delay(100);
        if(key==0)
        {
        yin++;
        c=0;
        d=1;
        bbtsoud();
        while(!key);
        }
        }
        break;
        case 5:if(key==0)//-----------------------------------進入日期月調整功能
        {
        delay(100);
        if(key==0)
        {
        yin++;
        d=0;
        e=1;
        bbtsoud();
        while(!key);
        }
        }
        break;
        case 6: if(key==0)//-----------------------------------進入日期日調整功能
        {
        delay(100);
        if(key==0)
        {
        yin++;
        e=0;
        f=1;
        bbtsoud();
        while(!key);
        }
        }
        break;
        case 7:if(key==0)//---------------------------------進入日期星期調整功能
        {
        delay(100);
        if(key==0)
        {
        yin++;
        f=0;
        g=1;
        bbtsoud();
        while(!key);
        }
        }
        break;
        case 8: if(key==0)//------------------------------進入鬧鐘小時調整功能
        {
        delay(100);
        if(key==0)
        {
        yin++;
        g=0;
        h=1;
        bbtsoud();
        while(!key);
        }
        }
        break;
        case 9:if(key==0)//------------------------------進入鬧鐘分鐘調整功能
        {
        delay(100);
        if(key==0)
        {
        yin++;
        h=0;
        i=1;
        bbtsoud();
        while(!key);
        }
        }
        break;
        case 10:if(key==0)//----------------------將系統全部復位,即回到主程序
        {
        delay(100);
        if(key==0)
        {
        yin=0;//總計數器復位為0
        i=0;//上次功能標志位清0
        flag=0;//主程序標志位清0
        TR1=1;//打開定時器
        write1302(0x8e,0x00);//去掉DS1302保護
        write1302(0x80,0x00);//當它等于0X00時,讓時間就開始走 即0X00就讓時間開始走,0X80讓時停
        write1302(0x8e,0x80);//讓時間停下來
        bbtsoud();
        while(!key);
        }
        }
        break;
        }
        }


        上一頁 1 2 3 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 平阳县| 安国市| 扎兰屯市| 曲周县| 屏东县| 古浪县| 双牌县| 霸州市| 抚远县| 西平县| 沙坪坝区| 正宁县| 丁青县| 佛坪县| 威远县| 兴文县| 南康市| 铜陵市| 五台县| 彩票| 永德县| 濮阳市| 稷山县| 台北县| 长沙市| 高唐县| 中宁县| 黄石市| 隆德县| 垦利县| 游戏| 密山市| 囊谦县| 抚松县| 五指山市| 湾仔区| 武强县| 兴化市| 如皋市| 寻乌县| 句容市|