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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機一個按鍵 長、按控制程序演示

[復制鏈接]
跳轉到指定樓層
樓主
ID:99600 發表于 2015-12-25 22:17 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. /*-----------------------------------------------
  2.   名稱:單個獨立按鍵控制
  3.   編寫:shifang
  4.   日期:2009.5
  5.   修改:無
  6.   內容:按鍵加減數字,多個數碼管顯示,使用定時器做數碼管動態掃描 并區別長按短按效果,完全可以應用的實際生產中
  7. ------------------------------------------------*/
  8. #include<reg52.h> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義

  9. sbit KEY_ADD=P3^3;  //定義按鍵輸入端口
  10. sbit KEY_DEC=P3^4;

  11. #define DataPort P0 //定義數據端口 程序中遇到DataPort 則用P0 替換
  12. sbit LATCH1=P2^2;//定義鎖存使能端口 段鎖存
  13. sbit LATCH2=P2^3;//                 位鎖存

  14. unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 顯示段碼值0~9
  15. unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分別對應相應的數碼管點亮,即位碼
  16. unsigned char TempData[8]; //存儲顯示值的全局變量

  17. void DelayUs2x(unsigned char t);//函數聲明
  18. void DelayMs(unsigned char t);
  19. void Display(unsigned char FirstBit,unsigned char Num);
  20. void Init_Timer0(void);
  21. /*------------------------------------------------
  22.                     主函數
  23. ------------------------------------------------*/
  24. void main (void)
  25. {
  26. unsigned char num=0,key_press_num;               
  27. KEY_ADD=1; //按鍵輸入端口電平置高
  28. KEY_DEC=1;
  29. Init_Timer0();

  30. while (1)         //主循環
  31.   {

  32.   if(!KEY_ADD)  //如果檢測到低電平,說明按鍵按下
  33.     {
  34.          DelayMs(10); //延時去抖,一般10-20ms
  35.      if(!KEY_ADD)     //再次確認按鍵是否按下,沒有按下則退出
  36.            {
  37.            while(!KEY_ADD)
  38.             {
  39.                 key_press_num++;
  40.         DelayMs(10);           //10x200=2000ms=2s
  41.                 if(key_press_num==200) //大約2s
  42.                   {
  43.                    key_press_num=0;    //如果達到長按鍵標準
  44.                                //則進入長按鍵動作
  45.            while(!KEY_ADD)     //這里用于識別是否按
  46.                                                            //鍵還在按下,如果按
  47.                                              //下執行相關動作,否則退出
  48.                        {
  49.                                if(num<99)    //加操作
  50.                       num++;
  51.                                 //即時把顯示數據處理,如果去掉下面2
  52.                 //句處理信息,實際上看不到漸變效果,
  53.                 //而是看到跳變效果
  54.                                 //用戶可以自行屏蔽測試
  55.      //分解顯示信息,如要顯示68,則68/10=6  68%10=8
  56.                                 TempData[0]=dofly_DuanMa[num/10];  
  57.                     TempData[1]=dofly_DuanMa[num%10];
  58.                 DelayMs(50);//用于調節長按循環操作
  59.      //的速度,可以自行調整此值以便達到最佳效果
  60.                                 }
  61.                     }
  62.                 }
  63.       key_press_num=0;//防止累加造成錯誤識別
  64.                    if(num<99)    //加操作
  65.                   num++;
  66.            }
  67.         }

  68. if(!KEY_DEC)  //如果檢測到低電平,說明按鍵按下
  69.     {
  70.          DelayMs(10); //延時去抖,一般10-20ms
  71.      if(!KEY_DEC) //再次確認按鍵是否按下,沒有
  72.                   //按下則退出
  73.            {
  74.            while(!KEY_DEC)
  75.             {
  76.                 key_press_num++;
  77.         DelayMs(10);
  78.                 if(key_press_num==200) //大約2s
  79.                   {
  80.                    key_press_num=0;
  81.            while(!KEY_DEC)
  82.                        {
  83.                                if(num>0)  //減操作
  84.                        num--;
  85. //分解顯示信息,如要顯示68,則68/10=6  68%10=8
  86.                                 TempData[0]=dofly_DuanMa[num/10];  
  87.                     TempData[1]=dofly_DuanMa[num%10];
  88.                 DelayMs(50);
  89. //用于調節長按循環操作的速度
  90.                                 }
  91.                     }
  92.                 }
  93.       key_press_num=0;//防止累加造成錯誤識別
  94.                if(num>0)  //減操作
  95.                   num--;
  96.                  
  97.            }
  98.         }
  99. //分解顯示信息,如要顯示68,則68/10=6  68%10=8  
  100.            TempData[0]=dofly_DuanMa[num/10];
  101.            TempData[1]=dofly_DuanMa[num%10];
  102.           // Display(0,8); //顯示全部8位
  103.      //主循環中添加其他需要一直工作的程序
  104.         
  105.   }
  106. }
  107. /*------------------------------------------------
  108. uS延時函數,含有輸入參數 unsigned char t,無返回值
  109. unsigned char 是定義無符號字符變量,其值的范圍是
  110. 0~255 這里使用晶振12M,精確延時請使用匯編,大致延時
  111. 長度如下 T=tx2+5 uS
  112. ------------------------------------------------*/
  113. void DelayUs2x(unsigned char t)
  114. {   
  115. while(--t);
  116. }
  117. /*------------------------------------------------
  118. mS延時函數,含有輸入參數 unsigned char t,無返回值
  119. unsigned char 是定義無符號字符變量,其值的范圍是
  120. 0~255 這里使用晶振12M,精確延時請使用匯編
  121. ------------------------------------------------*/
  122. void DelayMs(unsigned char t)
  123. {
  124.      
  125. while(t--)
  126. {
  127.      //大致延時1mS
  128.      DelayUs2x(245);
  129.          DelayUs2x(245);
  130. }
  131. }
  132. /*------------------------------------------------
  133. 顯示函數,用于動態掃描數碼管
  134. 輸入參數 FirstBit 表示需要顯示的第一位,如賦值2表示從第三個數碼管開始顯示
  135. 如輸入0表示從第一個顯示。
  136. Num表示需要顯示的位數,如需要顯示99兩位數值則該值輸入2
  137. ------------------------------------------------*/
  138. void Display(unsigned char FirstBit,unsigned char Num)
  139. {
  140.       static unsigned char i=0;
  141.          

  142.            DataPort=0;   //清空數據,防止有交替重影
  143.        LATCH1=1;     //段鎖存
  144.        LATCH1=0;

  145.        DataPort=dofly_WeiMa[i+FirstBit]; //取位碼
  146.        LATCH2=1;     //位鎖存
  147.        LATCH2=0;

  148.        DataPort=TempData[i]; //取顯示數據,段碼
  149.        LATCH1=1;     //段鎖存
  150.        LATCH1=0;
  151.       
  152.            i++;
  153.        if(i==Num)
  154.               i=0;


  155. }
  156. /*------------------------------------------------
  157.                     定時器初始化子程序
  158. ------------------------------------------------*/
  159. void Init_Timer0(void)
  160. {
  161. TMOD |= 0x01;          //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響                     
  162. //TH0=0x00;              //給定初值
  163. //TL0=0x00;
  164. EA=1;            //總中斷打開
  165. ET0=1;           //定時器中斷打開
  166. TR0=1;           //定時器開關打開
  167. }
  168. /*------------------------------------------------
  169.                  定時器中斷子程序
  170. ------------------------------------------------*/
  171. void Timer0_isr(void) interrupt 1
  172. {
  173. TH0=(65536-2000)/256;                  //重新賦值 2ms
  174. TL0=(65536-2000)%256;

  175. Display(0,8);

  176. }
復制代碼


57-按鍵長按短按效果.zip

17.26 KB, 下載次數: 34, 下載積分: 黑幣 -5

評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:79544 發表于 2015-12-26 17:17 | 只看該作者
好貼學習啦謝謝分享
回復

使用道具 舉報

板凳
ID:59300 發表于 2023-8-22 16:45 | 只看該作者
比較全面的代碼,值得收藏
回復

使用道具 舉報

地板
ID:375055 發表于 2023-9-12 14:33 | 只看該作者
比較全面的代碼,值得好好學習
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一区二区三区四区不卡 | 91久久精品一区 | 久久99久久99精品免视看婷婷 | 免费黄色a级毛片 | 日韩视频a | 日韩视频在线一区 | 欧美性网 | 国产综合精品一区二区三区 | 一区二区三区在线播放 | 在线免费观看色 | 欧美高清视频 | 国产中文视频 | 久久久久久网站 | 欧美激情欧美激情在线五月 | 亚洲国产欧美一区 | 日本黄色短片 | 天天精品综合 | 欧美午夜剧场 | 精品毛片| 成人久久 | 91国内视频在线 | 亚洲综合三区 | 亚洲国产成人av好男人在线观看 | 久久婷婷麻豆国产91天堂 | 欧美黄色一区 | 欧美亚洲另类在线 | 91人人爽| av天天干| 久久中文一区二区 | 日韩成人av在线 | 日日夜夜草 | 香蕉一区| 久久精品日产第一区二区三区 | 国产欧美日韩视频 | 国产精品久久久久国产a级 欧美日本韩国一区二区 | 亚洲一区二区三区视频 | 久久精品久久精品久久精品 | 国产特级毛片aaaaaa喷潮 | 亚洲一区精品视频 | 欧美日日| 免费观看一级特黄欧美大片 |