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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

請教單片機按鍵時間長短控制程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:634487 發表于 2019-11-4 01:20 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
剛開始學習  看到論壇里一個程序。想修改下,折騰一天。沒搞明白,特發帖請教。原貼地址在http://www.zg4o1577.cn/bbs/dpj-97912-1.html


#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
sbit keyback=P1^0;
sbit k=P1^4;
sbit key1=P1^1;
sbit key2=P1^2;
sbit key3=P1^3;
static uint i=0;
uchar keystay=0x00;
uchar T0RH;
uchar T0RL;

void configtimer0(uchar ms)
{
ulong tmp;
tmp=11059200/12;
tmp=(ms*tmp)/1000;
tmp=65536-tmp+10;
T0RH=(unsigned char)(tmp>>8);
T0RL=(unsigned char)tmp;
TMOD &=0xF0;
TMOD |=0x01;
TH0=T0RH;
TL0=T0RL;
ET0=1;
TR0=1;
}


void Judge(uint num)
{
if((5<num)&&(num<=50))
{                                          
key1=0;
key2=1;
key3=1;
i=0;
}
if((50<num)&&(num<=120))
{
key2=0;
key1=1;
key3=1;
i=0;
}
if(num>120)   //在第三個狀態這里怎么改成120時間內沒有信號做出KEY3輸出控制呢?
{
key3=0;
key1=1;
key2=1;
i=0;
}
}



main()
{
EA=1;
configtimer0(10);
while(1)
{
  if((keystay&0xFF)==0x00)
{
Judge(i);
          }
         }
}




void keyscan()
{
keystay=(keystay<<1) | (!keyback);
}

void interrupt_timer0()interrupt 1
{
TH0=T0RH;
TL0=T0RL;
keyscan();
if((keystay&0xFF)==0xFF)
{
  i++;

  if(i>400)
  {
   i=0;
         }
      }

  }





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

使用道具 舉報

沙發
ID:634487 發表于 2019-11-4 01:21 | 只看該作者
if(num>120)   //在第三個狀態這里怎么改成120時間內沒有信號做出KEY3輸出控制呢?
{
key3=0;
key1=1;
key2=1;
i=0;
}  想修改這部分  
回復

使用道具 舉報

板凳
ID:634487 發表于 2019-11-4 01:22 | 只看該作者
在第三個狀態這里怎么改成130時間內沒有信號做出KEY3輸出控制呢?
回復

使用道具 舉報

地板
ID:332444 發表于 2019-11-4 10:26 | 只看該作者
改為 if((50<num)&&(num<=120)){}else {}這樣試看
回復

使用道具 舉報

5#
ID:213173 發表于 2019-11-4 22:35 | 只看該作者
秋風涼 發表于 2019-11-4 01:22
在第三個狀態這里怎么改成130時間內沒有信號做出KEY3輸出控制呢?

給你改了一下,詳細注釋,能夠滿足你的要求。
  1. #include<reg52.h>

  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. sbit key =P1^0;
  5. sbit LED1=P1^1;
  6. sbit LED2=P1^2;
  7. sbit LED3=P1^3;

  8. uchar count=0;//計數變量
  9. uchar keystay=0;//中間變量
  10. bit sign=0;//按鍵操作標志

  11. void Timer0Init() //10毫秒@12.000MHz
  12. {
  13.         TMOD= 0x01;                //設置定時器模式
  14.         TL0 = 0xF0;                //設置定時初值
  15.         TH0 = 0xD8;                //設置定時初值
  16.         TR0 = 1;                        //定時器0開始計時
  17.         EA  = 1;                        //開總中斷
  18.         ET0 = 1;                        //開T0中斷
  19. }

  20. void keyscan()//放在中斷里
  21. {
  22.         if(!key)//鍵按下
  23.         {
  24.                 count++;
  25.                 if(count>=2)//20ms防抖
  26.                 {
  27.                         sign=1;//按鍵操作標志1
  28.                         if(count>131)
  29.                                 count=131;//防止溢出
  30.                 }
  31.         }
  32.         else//鍵松手
  33.         {
  34.                 if(sign==1)
  35.                 {
  36.                         sign=0;//按鍵操作標志清0
  37.                         keystay=count;//保存計數值
  38.                 }
  39.                 count=0;//計數清0
  40.         }
  41. }

  42. void Judge(uint num)
  43. {
  44.         if(num>2 && num<=50)        //20~500ms 短按
  45.         {
  46.                 LED1=0;
  47.                 LED2=1;
  48.                 LED3=1;
  49.                 keystay=0;//中間變量清0
  50.         }
  51.         else if(num>50 && num<=130)//500~1300ms 略長按
  52.         {
  53.                 LED2=0;
  54.                 LED1=1;
  55.                 LED3=1;
  56.                 keystay=0;//中間變量清0
  57.         }
  58.         else if(num>130)//1.3s以上 長按
  59.         {
  60.                 LED3=0;
  61.                 LED1=1;
  62.                 LED2=1;
  63.                 keystay=0;//中間變量清0
  64.         }
  65. }

  66. void main()
  67. {
  68.         Timer0Init();
  69.         while(1)
  70.         {
  71.                 if(keystay!=0)//如果按鍵有效操作
  72.                 {
  73.                         Judge(keystay);
  74.                 }
  75.         }
  76. }
  77. void interrupt_timer0()interrupt 1
  78. {
  79.         TL0 = 0xF0;                //設置定時初值
  80.         TH0 = 0xD8;                //設置定時初值
  81.         keyscan();
  82. }
復制代碼
回復

使用道具 舉報

6#
ID:230975 發表于 2019-11-22 15:23 | 只看該作者
wulin 發表于 2019-11-4 22:35
給你改了一下,詳細注釋,能夠滿足你的要求。

師傅num在哪里體現自加的,是不是應該是count.void Judge(uint num)
{
        if(num>2 && num<=50)
是不是應該是count
回復

使用道具 舉報

7#
ID:230975 發表于 2019-11-22 15:26 | 只看該作者
wulin 發表于 2019-11-4 22:35
給你改了一下,詳細注釋,能夠滿足你的要求。

不意思師傅。上面的沒看完。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产毛片毛片 | 日韩中文字幕 | 久久综合九色综合欧美狠狠 | 国产原创视频 | 91免费版在线观看 | 91成人免费 | 色噜噜色综合 | 久久久久久综合 | 亚洲欧美日韩成人在线 | 九九热在线视频免费观看 | 91精品国产色综合久久 | 亚洲在线免费观看 | 日韩亚洲一区二区 | 国产一二区免费视频 | 国产一区二区毛片 | 亚洲精品在线免费看 | 第一区在线观看免费国语入口 | 亚洲一区二区三区久久久 | 亚洲国产精品一区二区第一页 | 亚洲三区视频 | 91在线第一页 | 欧美一区二区在线 | 天天干在线播放 | 国产精品久久久久久中文字 | 日韩在线免费观看视频 | 日日做夜夜爽毛片麻豆 | 欧美日韩国产一区二区三区 | 精品久久久久久久人人人人传媒 | 成人av免费播放 | 亚洲电影免费 | 91精品国产乱码麻豆白嫩 | 古装三级在线播放 | 最新中文字幕在线 | 亚洲视频一区在线观看 | 成年人视频在线免费观看 | 网黄在线 | 国产免费拔擦拔擦8x高清 | 在线播放国产一区二区三区 | 免费的av网站 | 羞羞的视频免费在线观看 | 日韩免费一区二区 |