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

標題: 51單片機一個按鍵 長、按控制程序演示 [打印本頁]

作者: GYY0529    時間: 2015-12-25 22:17
標題: 51單片機一個按鍵 長、按控制程序演示
  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


作者: 騰飛的龍    時間: 2015-12-26 17:17
好貼學習啦謝謝分享
作者: wy13043207006    時間: 2023-8-22 16:45
比較全面的代碼,值得收藏
作者: 68775899    時間: 2023-9-12 14:33
比較全面的代碼,值得好好學習




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 国产亚洲欧美日韩精品一区二区三区 | 色综合色综合 | 欧美日韩综合 | 欧美日韩中文在线观看 | 一级黄色网页 | 九九热视频这里只有精品 | 国产成人综合一区二区三区 | 精品人伦一区二区三区蜜桃网站 | 一区在线观看 | 午夜国产一级片 | 日韩av在线一区 | 久久av一区 | 国产在线一区二区三区 | 精品国产一区二区国模嫣然 | 国产欧美精品一区二区三区 | 中文字幕在线一区二区三区 | 色又黄又爽网站www久久 | 在线欧美视频 | 日美女逼逼 | 日韩一区欧美一区 | 国产精品毛片无码 | 在线观看亚洲专区 | 日日干天天操 | 一级毛片在线视频 | 国产在线观看不卡一区二区三区 | 偷拍自拍网址 | 女同久久 | 99精品久久99久久久久 | 韩日有码| 黄色一级特级片 | 岛国午夜 | 在线视频一区二区 | 完全免费在线视频 | 国内自拍视频在线观看 | 麻豆久久 | 国产一在线 | av在线影院 | 欧美精品一区二区三区在线播放 | 天天操操操操操 | 在线国产一区二区 | 天天射夜夜操 |