新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 1602LCD液晶數字電子鐘 時鐘表 C語言

        1602LCD液晶數字電子鐘 時鐘表 C語言

        作者: 時間:2016-11-18 來源:網絡 收藏
        1602LCD液晶數字電子鐘 基本設計思路:
        1. 1602LCD顯示:
        第一行: 年, 月, 日 2012-01-22
        第二行: 時, 分, 秒 23:59:00
        2. 獨立按鍵功能:
        Key1 恢復單片機調時之前的實際時間, 由于在調整時間期間,定時器T0暫停, 則啟動定時器T1, 保證單片機的時間正確.(即 取消調時)
        Key2 進入調整時間狀態: 停止定時器T0,啟動定時器T1.
        Key3 退出調整時間狀態: 啟動定時器T0,停止定時器T1.
        Key4 選擇調整時間: 秒, 分, 時, 日, 月, 年
        Key5 調時: 遞增 同時啟動蜂鳴器
        Key6 調時: 遞減 同時啟動蜂鳴器
        花了2天半的時間,終于按照自己的設計思路來實現了 時鐘表, 在這兩天多的時間, 感覺最難的就是,當發生錯誤的時候,不知道如何進行調試,差錯,因為有些錯誤無法進行調試,因此往往都要換一個方向思考問題,所以面對困惑就必須要檢測了, 自己的錯誤,只能自己解決,因為別人對你的錯誤往往都不容易理解。 哎,像我這樣獨自一個奮斗,真是寂寞啊, 遇到困惑,要么放棄,要么堅持,可是卻不知道要堅持多久, 心里總是害怕 這樣 浪費時間。
        目前,還有一個問題沒有解決: 如果調整時間,不合理,則必須恢復 原來的時間,并且有錯誤提示。
        比如時間: 2012-2-34 , 若更改為這個日期,那么必須要有錯誤提示,并且要取消 這個時間。
        #include
        #include"MyFuntion.h" //自定義頭文件
        //掃描這些按鍵是否被按下
        void Keycan()
        {
        if(Key1==0) //進入調整時間狀態
        {
        Delay();
        if(Key1==0) //停止定時器T0 啟動定時器T1
        {
        ButtonBeep();
        SaveCurrentTime(); //進入調整時間狀態 必須保存當前時間 若取消調時 則可以恢復時間
        TR0=0;//停止定時器T0
        TR1=1;//啟動定時器T1
        tempSecond=0;
        }
        while(!Key1);
        }
        if(Key2==0)
        {
        Delay();
        if(Key2==0) // 取消調時 恢復單片機調時之前的實際時間
        {
        if(TR0==0) //在調整時間狀態下 恢復時間
        {
        ButtonBeep();
        CurrentTime();
        }
        }
        while(!Key2);
        }
        if(Key3==0) //退出調整時間狀態:
        {
        Delay();
        if(Key3==0)
        {
        ButtonBeep(); //停止定時器T1 啟動定時器T0
        TR0=1;//啟動定時器T0
        TR1=0;//停止定時器T1
        Write_Command(0x0c); //設置開顯示 不顯示光標
        }
        while(!Key3);
        }
        //當定時器T0 停止時 才能 進行下面的各個按鍵的操作
        if(TR0==0) //定時器T0 停止
        {
        if(Key4==0) // Key4 控制光標往右移動
        {
        Delay();
        if(Key4==0)
        {
        AdjustCursorRight(); //控制光標往右移動
        ButtonBeep();
        }
        while(!Key4);
        }
        if(Key5==0) // Key5 控制光標往左移動
        {
        Delay();
        if(Key5==0)
        {
        AdjustCursorLeft(); //控制光標往左移動
        ButtonBeep();
        }
        while(!Key5);
        }
        if(Key6==0) // 遞增
        {
        Delay();
        if(Key6==0)
        {
        UpDown=1;
        ButtonSetTime();
        ButtonBeep();
        }
        while(!Key6);
        }
        if(Key7==0) // 遞減
        {
        Delay();
        if(Key7==0)
        {
        UpDown=0;
        ButtonSetTime();
        ButtonBeep();
        }
        while(!Key7);
        }
        }
        }
        void main()
        {
        TMOD=0X01;
        EA=1;
        ET0=1;
        ET1=1;
        TR0=1; //啟動定時器T0
        // TR1=0; //停止定時器T1 即暫時不啟動定時器T1
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        TH1=(65536-50000)/256;
        TL1=(65536-50000)%256;
        InitLCD(); //初始化LCD
        Init_Table_YMD(table1); // LCD 時間表 年月日
        Init_Table_HMS(table2); // LCD 時間表 時分秒
        DisplayLCD_YMD(table1, 10); //LCD顯示時間 年月日
        DisplayLCD_HMS(table2, 8); //LCD顯示時間 時分秒
        while(1)
        {
        Keycan();
        if(t0==20)
        {
        t0=0;
        IncreaseHMS(); // 時分秒 遞增
        }
        }
        }
        //定時器T0 實現自動 計時
        void LCD_Timer0() interrupt 1 using 0
        {
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        t0++;
        }
        //定時器T1 實現自動 計時 從而減少調整時間產生的誤差
        void LCD_Timer1() interrupt 3 using 1
        {
        TH1=(65536-50000)/256;
        TL1=(65536-50000)%256;
        t1++;
        if(t1==20)
        {
        t1=0;
        tempSecond++;
        }
        }



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 武定县| 田东县| 横峰县| 玛曲县| 安乡县| 行唐县| 威海市| 长治县| 新兴县| 资阳市| 武定县| 西贡区| 凤城市| 东明县| 固始县| 顺昌县| 恩施市| 山东省| 鱼台县| 邻水| 封开县| 郓城县| 河津市| 肃南| 信宜市| 嵊泗县| 嘉峪关市| 芒康县| 华蓥市| 华亭县| 贞丰县| 威远县| 莲花县| 凉山| 平江县| 安康市| 崇礼县| 静安区| 会昌县| 郴州市| 尉氏县|