久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5759|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

51單片機的時鐘C語言程序,四個按鍵控制

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:452400 發(fā)表于 2018-12-22 23:17 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最后由 diehualong 于 2018-12-22 23:19 編輯

#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int
sbit we = P2^7;
sbit du = P2^6;
sbit key_1 = P3^4;
sbit key_2 = P3^5;
sbit key_3 = P3^6;
sbit key_4 = P3^7;
uchar n1 = 0;//控制多長時間閃爍一次。
uchar  shi = 0;
uchar shi_1,shi_2;
uchar  fen = 0;
uchar fen_1,fen_2;
uchar  miao = 0;
uchar miao_1,miao_2;
uchar  n = 0;
bit shezhi = 0;
bit flag = 0;//控制設(shè)置時某些位的閃爍
uchar m = 0;//不亮的位置
uchar code leddata[]={

                0x3F,  //"0"
                0x06,  //"1"
                0x5B,  //"2"
                0x4F,  //"3"
                0x66,  //"4"
                0x6D,  //"5"
                0x7D,  //"6"
                0x07,  //"7"
                0x7F,  //"8"
                0x6F,  //"9"
                0x40,  //"-"
                         };
uchar code pos[] = {
                                                0xfe,
                                                0xfd,
                                                0xfb,
                                                0xf7,
                                                0xef,
                                                0xdf
                                        };
一部分:參數(shù)初始化函數(shù)
void init()
{
      TMOD = 0x11;//將定時器0和定時器1設(shè)為工作方式1,16位定時器
      TH0 = 0x4B;
      TL0 = 0xFC;  //設(shè)置定時器0的中斷周期是50ms
      TH1 = 0x4B;
      TL1 = 0xFC;  //設(shè)置定時器1的中斷周期是50ms
      PT0 = 1;         //設(shè)置定時器0中斷的優(yōu)先級高于定時器1中斷
      ET0 = 1;         //開啟定時器0中斷
      ET1 = 1;         //開啟定時器1中斷
      TR1 = 1;         //定時器1開始計數(shù)
      TR0 = 1;         //定時器0開始計數(shù)
EA = 1;         //開啟總中斷
}   
第二部分:關(guān)于數(shù)碼管點亮的函數(shù)
//--------------將小時對應(yīng)的數(shù)碼管的點亮的函數(shù)---------------//
voidhour_display()
{
      shi_1 = shi/10;         //將小時的十位數(shù)字賦值給shi_1
      shi_2 = shi%10;     //將小時的個位數(shù)字賦值給shi_2
      P0 = pos[0];        
      we = 1;
      we = 0;
      P0 = leddata[shi_1];
      du = 1;
      du = 0;
      delay(1);                     //將最左邊的數(shù)碼管點亮并顯示小時的十位數(shù)字
      P0 = pos[1];
      we = 1;
      we = 0;
      P0 = leddata[shi_2];
      du = 1;
      du = 0;            //將左邊第二個數(shù)碼管點亮并顯示小時的個位數(shù)字
      delay(1);
}   
//----------------將分鐘對應(yīng)的數(shù)碼管的點亮的函數(shù)----------------//     
voidfen_display()
{
      fen_1 = fen/10;           //將分鐘的十位數(shù)字賦值給fen_1
      fen_2 = fen%10;         //將分鐘的個位數(shù)字賦值給fen_2
      P0 = pos[2];               
      we = 1;
      we = 0;
      P0 = leddata[fen_1];
      du = 1;
      du = 0;
      delay(1);                     //將左邊第三個數(shù)碼管點亮并顯示分鐘的十位數(shù)字
      P0 = pos[3];
      we = 1;
      we = 0;
      P0 = leddata[fen_2];
      du = 1;
      du = 0;
      delay(1);                  //將左邊第四個數(shù)碼管點亮并顯示分鐘的個位數(shù)字    }
//-------------將秒數(shù)對應(yīng)的數(shù)碼管的點亮的函數(shù)-------------//
voidmiao_display()
{
      miao_1 = miao/10;     //將秒數(shù)的十位數(shù)字賦值給miao_1
      miao_2 = miao%10;   //將秒數(shù)的個位數(shù)字賦值給miao_2
      P0 = pos[4];
      we = 1;
      we = 0;
      P0 = leddata[miao_1];
      du = 1;
      du = 0;
      delay(1);                     //將右邊第二個數(shù)碼管點亮并顯示秒數(shù)的十位數(shù)字
      P0 = pos[5];
      we = 1;
      we = 0;
      P0 = leddata[miao_2];
      du = 1;
      du = 0;
      delay(1);                     //將右邊第一個數(shù)碼管點亮并顯示秒數(shù)的個位數(shù)字
}
//------------判斷當(dāng)參數(shù)shezhi等于1時將小時、分鐘、秒數(shù)所對應(yīng)的數(shù)碼管點亮并顯示出相應(yīng)數(shù)字的函數(shù)-------------//
void alldis()
{
      if(shezhi == 0)      //當(dāng)參數(shù)shezhi等于0的時候所有數(shù)碼管被點亮,并
      {                           //將小時、分鐘、秒數(shù)所對應(yīng)數(shù)碼管顯示出對應(yīng)的數(shù)字
             hour_display();   
             fen_display ();
             miao_display();
      }     
}
//------------判斷當(dāng)參數(shù)shezhi等于0時將要修改的位(即小時或分鐘或秒數(shù)對應(yīng)的某兩位數(shù)碼管)出現(xiàn)閃爍效果的函數(shù)--------------//
void fourdis()
{
      if(shezhi == 1)
      {
             P0 = 0xff;
             we = 0;                //將所有的數(shù)碼管關(guān)閉,以防受到前一次數(shù)碼管打開
             we = 1;                //的影響,并為下面出現(xiàn)閃爍效果做準(zhǔn)備
             if(flag == 0)        //判斷當(dāng)參數(shù)flag等于0時將所有數(shù)碼管點亮
             {
                    hour_display();   
                    fen_display ();
                    miao_display();   
             }
             if(flag == 1)        //判斷當(dāng)數(shù)碼管等于1時使需要修改的位置(即小時
             {                          //或分鐘或秒數(shù)對應(yīng)的某兩位數(shù)碼管)關(guān)閉
                    if(m == 0)    //判斷當(dāng)參數(shù)m為0時將小時對應(yīng)的兩位數(shù)碼管關(guān)閉
                    {
                           fen_display ();
                           miao_display();
                    }
                    if(m == 1)   //判斷當(dāng)參數(shù)m為1時將分鐘對應(yīng)的兩位數(shù)碼管關(guān)閉
                    {
                           hour_display();
                           miao_display();
                    }
                    if(m == 2)   //判斷當(dāng)參數(shù)m為2時將秒數(shù)對應(yīng)的兩位數(shù)碼管關(guān)閉
                    {
                           hour_display();
                           fen_display ();
                    }
             }            
      }     
}
//------------------匯總以上將數(shù)碼管點亮的函數(shù)(數(shù)碼管的狀態(tài)將隨參數(shù)的改變而變化----------------------//
void display()
{
      alldis() ;
      fourdis();      
}
第三部分:延時類函數(shù)
//---------通過數(shù)碼管顯示來做到延遲的函數(shù),為按鍵延時消抖做準(zhǔn)備---------//
voiddelay0(uchar z)
{
      for(;z > 0;z--)
             display();      //將數(shù)碼管以現(xiàn)在的狀態(tài)點亮的函數(shù)        
}
//------毫秒級延時函數(shù);當(dāng)z = 1時,即delay(1)代表運行時間為1ms-----//
void delay(uintz)                                   
{                                                            
      uint x,y;
      for(x = z;x > 0;x--)
             for(y = 114;y > 0;y--);
}   
第四部分:中斷類函數(shù)
//-------------------定時器0中斷函數(shù)(控制每秒秒數(shù)增1,秒數(shù)、分鐘為60進(jìn)制,小時為24進(jìn)制)----------------------//
void timer_0()interrupt 1
{
      TH0 = 0x4B;
      TL0 = 0xFC;       //將定時器0設(shè)置為計時50ms中斷1次
      n++;                     //參數(shù)n存儲定時器0中斷次數(shù),來計時是否過1s
      n1++;                   //參數(shù)n1存儲定時器0中斷次數(shù)控制數(shù)碼管閃爍頻率
      if(n1 == 5)           //當(dāng)n1等于5時將要修改位對應(yīng)的數(shù)碼管點亮(或關(guān)閉)
             flag = ~flag,n1 = 0;
      if(n >= 20)           //當(dāng)n等于20時說明已中斷1s,將n清零并使秒數(shù)增1
      {
             n = 0;
             miao++;
      }
      if(miao >= 60)     //當(dāng)秒數(shù)等于60時使秒數(shù)清零并使分鐘增1,使秒數(shù)滿
      {                          //足60進(jìn)制
             miao = 0;
             fen++;   
      }
      if(fen >= 60)       //當(dāng)分鐘等于60時使分鐘清零并使小時增1,使分鐘滿                 {                          //足60進(jìn)制
             fen = 0;
             shi++;
      }
      if(shi >= 24)        //當(dāng)小時等于24時使小時清零,使小時滿足24進(jìn)制
             shi = 0;
}
//-----定時器1中斷函數(shù),每50ms中斷1次,判斷是否有按鍵按下-----//
void timer1()interrupt 3
{
      TH1 = 0x4B;
      TL1 = 0xFC;              //將定時器1設(shè)置為50ms計數(shù)
      if(key_3 == 0)            //判斷K3按鍵是否按下
      {
             m = 0;
             delay0(10);          //按鍵延時消抖
             if(key_3 == 0)
                    shezhi = ~shezhi;      //打開數(shù)值設(shè)置或者關(guān)閉數(shù)值設(shè)置     
delay0(10);          //延時消抖
           //     while(!key_3)
      //            display();      
      }
      if(key_4 == 0&&shezhi == 1) //判斷在開啟設(shè)置數(shù)值狀態(tài)K4是否按下
      {
             delay0(10);                        //按鍵延時消抖
             if(key_4 == 0)     
                    m++;                           //當(dāng)K4按鍵按下使閃爍位后移兩個
             if(m >= 3)                         //當(dāng)閃爍位超過秒數(shù)兩位時時,使之重新回
m = 0;                         //到小時對應(yīng)的兩位數(shù)碼管使之閃爍
      delay0(10);                        //按鍵延時消抖
      //     while(!key_4)
      //            display();
      }
      if(key_2 == 0&&shezhi == 1)//判斷在開始數(shù)值設(shè)置K2是否按下
      {
//--------此參數(shù)flag可以設(shè)置當(dāng)按鍵按下時對應(yīng)數(shù)碼管是否閃爍---------//
flag = 1;        
             delay0(8);                         //延時消抖
             if(key_2 == 0)                  
             {
                    if(m == 0)                  //當(dāng)m等于0,說明此時設(shè)置的是小時,
                           shi++;                  //小時數(shù)值上增1
                    if(m == 1)                  //當(dāng)m等于1,說明此時設(shè)置的是分鐘,
                           fen++;                  //分鐘數(shù)值上增1
                    if(m == 2)                  //當(dāng)m等于2,說明此時設(shè)置的是秒數(shù),
                           miao++;               //秒數(shù)數(shù)值上增1
             }
//------這條語句可使在設(shè)置數(shù)值狀態(tài)下,長按按鍵時數(shù)值連續(xù)增長------//
             delay0(8);                          //按鍵消抖延時
//------------------------------------------------------------------------------------------//
           //---這兩條語句可以使在設(shè)置數(shù)值狀態(tài)下,長按按鍵閃爍位也只增1---//
      //     while(!key_2)
           //     display();
           //------------------------------------------------------------------------------------------//
      }
      if(key_1 == 0&&shezhi == 1) //判斷在開始數(shù)值設(shè)置K1是否按下
      {
      //--------此參數(shù)flag可以設(shè)置當(dāng)按鍵按下時對應(yīng)數(shù)碼管是否閃爍---------//
flag = 0;                      //此時對應(yīng)的數(shù)碼管處于長亮狀態(tài)
             delay0(8);                   //按鍵延時消抖
             if(key_1 == 0)
             {
                    if(m == 0)                         //當(dāng)m等于0,說明此時設(shè)置的是小時,
                           shi--;                           //小時數(shù)值減1
                           if(shi == 255)
                                  shi = 23;
                    if(m == 1)                         //當(dāng)m等于1,說明此時設(shè)置的是分鐘,
                           fen--;                           //分鐘數(shù)值減1
                           if(fen == 255)
                                  fen = 59;
                    if(m == 2)                         //當(dāng)m等于2,說明此時設(shè)置的是秒數(shù)
                           miao--;                        //秒數(shù)數(shù)值減1
                           if(miao == 255)
                                  miao = 59;
             }
//------這條語句可使在設(shè)置數(shù)值狀態(tài)下,長按按鍵時數(shù)值連續(xù)增長------//
             delay0(8);                                 
//------------------------------------------------------------------------------------------//
//---這兩條語句可以使在設(shè)置數(shù)值狀態(tài)下,長按按鍵閃爍位也只增1---//
             //while(!key_1)
             //     display();
//------------------------------------------------------------------------------------------//
      }     
}
void main()
{
        init();
        while(1)
                display();                                                                 
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲综合视频 | 成人av一区二区亚洲精 | 精品国产一区二区在线 | 91在线视频播放 | 337p日韩 | 欧美精选一区二区 | 久久久久久久久一区 | 粉嫩av久久一区二区三区 | 亚洲精品综合 | 国产资源在线播放 | 日韩在线视频一区 | 女人夜夜春 | 国产一区二区欧美 | 羞羞色网站 | 日本欧美在线 | 国产色| 亚洲综合首页 | 手机av在线 | 成人久草 | 天天操天天射天天 | 成人永久免费视频 | 亚洲精品乱码久久久久久蜜桃91 | 成人在线国产 | 国产成人免费网站 | 在线一区 | 久久av网 | 日韩免费福利视频 | 色婷婷亚洲一区二区三区 | 久久视频免费观看 | 羞羞视频在线观免费观看 | 日韩在线国产 | 国产欧美一区二区三区久久手机版 | 玖玖玖在线观看 | 暖暖成人免费视频 | 伊人网伊人| 99国产精品一区二区三区 | 久久久久国产 | 国产精品久久久久久久午夜 | 亚洲欧美日韩在线一区二区 | 亚洲一区二区精品 | 久久久久av|