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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2654|回復: 0
打印 上一主題 下一主題
收起左側

基于51單片機四位一體數碼管顯示短按加或減數值及長按連加或連減數值的項目工程

[復制鏈接]
跳轉到指定樓層
樓主
本帖最后由 51黑電子會員 于 2020-5-22 08:40 編輯
  1. //按鍵短按加或減,長按連加或連減,四位一體數碼管顯示0~9999。
  2. #include<reg52.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #define key_short 10//宏定義短按20ms
  6. #define key_long 50//宏定義長按100ms
  7. #define key_middle 40//宏定義長按間隔80ms
  8. sbit led=P1^4;//啟停指示燈
  9. sbit addkey=P3^0;//位定義加鍵
  10. sbit deckey=P3^2;//位定義減鍵
  11. sbit qiting=P3^4;//位定義啟動按鍵端口
  12. sbit tingzhi=P3^6;//位定義停止按鍵端口
  13. //uchar i;//數碼管位數變量
  14. uchar flag;//顯示函數標志位變量
  15. uchar qitingnum;//聲明啟停次數變量
  16. uint num;//數值變量
  17. uint addcount,deccount;//計數變量
  18. uint qian,bai,shi,ge;//定義拆字變量
  19. //uchar code weima[]={0xfe,0xfd,0xfb,0xf7};//數碼管位碼表
  20. uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f} ; //共陰數碼管段碼數字0~9字碼表,高電平點亮數碼管段碼數字0~9。
  21. /**ms級延時子程序**/
  22.   void delay(uint x)
  23. {
  24.    uint i,j;                       
  25.    for(i=0;i<x;i++)     
  26.     for(j=0;j<110;j++);
  27.   }
  28.   void display()
  29. {
  30.    qian=num/1000;//取得千位數字
  31.    bai=num%1000/100;//取得百位數字
  32.    shi=num%100/10;//取得十位數字
  33.    ge=num%10;//取得個位數字

  34.    P2=0xfe;//數碼管千位顯示位
  35.    P0=table[qian];//數碼管千位數值顯示
  36.    delay(2);//延時

  37.    P2=0xfd;//數碼管百位顯示位
  38.    P0=table[bai];//數碼管百位數值顯示
  39.    delay(2);//延時

  40.    P2=0xfb;//數碼管十位顯示位
  41.    P0=table[shi];//數碼管十位數值顯示
  42.    delay(2);//延時

  43.    P2=0xf7;//數碼管個位顯示位
  44.    P0=table[ge];//數碼管個位數值顯示
  45.    delay(2);//延時
  46. }
  47.   void qidongkeyscan()//啟動函數
  48. {
  49.    if(qiting==0)
  50. {
  51.     delay(15);
  52.     if(qiting==0)
  53.   {
  54.      qitingnum++;
  55.      TR0=1;
  56.      flag=0;
  57.      while(qiting==1);
  58.     }
  59.    }
  60. }
  61.   void tingzhikeyscan()//關掉函數
  62. {
  63.    if(tingzhi==0)
  64. {
  65.     delay(15);
  66.     if(tingzhi==0)
  67.   {
  68.      led=1;
  69.      flag=1;
  70.      TR0=0;
  71.      P2=0xff;
  72.      P0=0x00;
  73.      qitingnum=0;
  74.      while(tingzhi==1);
  75.     }
  76.    }
  77. }
  78.   void keyscan()//設置函數
  79. {
  80.    if(qitingnum==1)
  81. {
  82.     led=0;
  83.     if(!addkey)
  84.   {
  85.      addcount++;
  86. //   delay(10);
  87.      if(addcount>=key_long)//增加長按
  88.    {
  89.       if(num<9999)
  90.       num++;        
  91.       addcount=key_middle;//為什么存在addcount=key_middle,由于一直按著按鍵,addcount計數會溢出,設定addcount=key_middle能讓addcount在這個addcount=key_middle基礎上反復累積計數,從而不會出現計數溢出的情況。
  92.      }
  93.     }
  94.      else
  95.    {
  96.       if(key_short<addcount&&addcount<key_long)//增加短按,為什么不可以是key_short<addcount<key_long,假若是key_short<addcount<key_long,就相當于按鍵還沒按下,條件已經滿足,按鍵再按下去就沒意義啦。
  97.     {
  98.        if(num<9999)
  99.        num++;        
  100.       }
  101.       addcount=0;
  102.     }
  103.     if(!deckey)
  104.   {
  105.      deccount++;
  106. //   delay(10);
  107.      if(deccount>=key_long)//減少長按
  108.    {
  109.       if(num>0)
  110.       num--;        
  111.       deccount=key_middle;//為什么存在deccount=key_middle,由于一直按著按鍵,deccount計數會溢出,設定deccount=key_middle能讓addcount在這個deccount=key_middle基礎上反復累積計數,從而不會出現計數溢出的情況。
  112.      }
  113.     }
  114.      else
  115.    {
  116.       if(key_short<deccount&&deccount<key_long)//減少短按,為什么if條件不可以是key_short<deccount<key_long,假若是key_short<deccount<key_long,就相當于按鍵還沒按下,條件已經滿足,按鍵再按下去就沒意義啦。
  117.     {
  118.        if(num>0)
  119.        num--;        
  120.       }
  121.       deccount=0;
  122.     }
  123.    }
  124.   }
  125. //  void display()//顯示程序
  126. //{
  127. //// static uchar i;
  128. //   P0=0x00;
  129. //   P2=weima[i];
  130. //   switch(i)
  131. // {
  132. //    case 0:
  133. //           P0=table[num/1000];
  134. //           break;
  135. //    case 1:
  136. //           P0=table[num%1000/100];
  137. //           break;
  138. //    case 2:
  139. //           P0=table[num%100/10];
  140. //           break;
  141. //    case 3:
  142. //           P0=table[num%10];
  143. //           break;
  144. //  }
  145. //   i++;
  146. //   i%=4;
  147. // }
  148.   /**定時器0初始化子程序**/
  149.   void Time0_init()
  150. {
  151.    TMOD=0X01;//模式選定時器0、計數器1,工作方式選定時器0定時模式1、計數器1計數模式1。
  152.    TH0=(65536-5000)/256;//定時器0高8位定時50毫秒
  153.    TL0=(65536-5000)%256;//定時器0低8位定時50毫秒
  154.    EA=1;//打開總中斷
  155.    ET0=1;//打開定時器0的中斷
  156.    TR0=0;//打開定時器0
  157.   }
  158.   void Timer0() interrupt 1//定時器0中斷子程序
  159. {
  160.    TH0=(65536-5000)/256;//重裝定時器0高8位定時50毫秒
  161.    TL0=(65536-5000)%256;//重裝定時器0低8位定時50毫秒
  162.    keyscan();//設置函數
  163.    if(flag==0)
  164.    display();//顯示函數
  165.    tingzhikeyscan();//關掉函數
  166.   }
  167.   void main()//主函數
  168. {
  169.    Time0_init();//定時器0初始化子程序
  170.    while(1)
  171. {
  172.     qidongkeyscan();//啟動函數
  173.   }
  174. }
復制代碼

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

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

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久免费小视频 | 亚洲一区二区免费 | 亚洲欧美在线免费观看 | 国产精品久久国产精品 | 一区二区三区欧美 | 日本久草| 亚洲欧美中文字幕在线观看 | 香蕉视频一区二区 | 国产精品久久久久久妇女 | 亚洲国产精品一区二区三区 | 欧美成人精品欧美一级 | 91资源在线 | 91亚洲免费 | 午夜精品影院 | 国产农村妇女毛片精品久久麻豆 | 精品一区二区在线观看 | 欧美综合自拍 | 欧美人妇做爰xxxⅹ性高电影 | 国产视频1区2区 | 久久久精品一区 | 日韩欧美国产精品综合嫩v 一区中文字幕 | 亚洲一区二区在线 | 超碰在线亚洲 | 国产欧美日韩一区 | 日韩av在线免费 | 最近最新中文字幕 | 久久精品天堂 | 日韩久久久久 | 午夜三级在线观看 | 亚洲综合色丁香婷婷六月图片 | 国产成人免费视频网站高清观看视频 | 久久99成人 | 欧美狠狠操 | 国产专区在线 | 在线国产一区二区 | 欧美视频一区二区三区 | 嫩草懂你的影院入口 | 古典武侠第一页久久777 | 免费毛片网站在线观看 | 免费国产视频在线观看 | www.日韩在线 |