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

標題: 51單片機的時鐘C語言程序,四個按鍵控制 [打印本頁]

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






歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 日韩精品| 最新中文字幕第一页视频 | 久久视频精品 | 国产一级电影在线 | 久久久精彩视频 | 69性欧美高清影院 | 国产午夜精品理论片a大结局 | 国产黄色小视频 | 青青草这里只有精品 | 亚洲精品美女 | 操久久| 女人毛片a毛片久久人人 | 日日操夜夜操视频 | 婷婷色国产偷v国产偷v小说 | 欧美日韩亚洲系列 | 一区二区三区中文字幕 | 欧美午夜精品 | 国产精品久久久久久久久久久免费看 | 欧美国产中文 | 久久综合久久综合久久综合 | 亚洲国产成人精品女人久久久 | 久久人体视频 | 天天操操操操操 | 国产精品久久亚洲 | 草久久久 | 日韩欧美视频免费在线观看 | 日韩成人av在线 | 91精品久久久久久久 | 久久精品网 | 不卡一二三区 | 亚洲精品视频一区二区三区 | 91麻豆产精品久久久久久 | 国产精品乱码一区二区三区 | 青青久久av北条麻妃海外网 | 午夜精品一区二区三区在线观看 | 久久精品91久久久久久再现 | 亚洲一区中文字幕 | 亚洲韩国精品 | 国产美女久久 | 精品欧美乱码久久久久久1区2区 | 在线观看中文字幕av |