找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3735|回复: 9
收起左侧

单片机单独按键时间长短控制请教

[复制链接]
ID:634487 发表于 2019-12-18 22:54 | 显示全部楼层 |阅读模式
https://blog.csdn.net/Mr_jianfeng/article/details/79507108

按照这个抄的,关键新手没抄好 。  现在 否则为短按有效果 不知道哪里没抄到位。求大神指导。

程序见2楼
回复

使用道具 举报

ID:634487 发表于 2019-12-18 22:56 | 显示全部楼层
#include <STC15Wxx.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define count unsigned int
sbit key=P1^7;               
sbit k=P3^1;                       
sbit key1=P3^0;                       
sbit key2=P3^2;                       
sbit key3=P0^3;                                 

uchar key_flag = 0;
ulong numl;

void delayms (uint xms)           //添加延时
        {
          uint i, j;
                for(i=xms;i>0;i--)
                  for(j=110;j>0;j--);
        }


main()
{

           TMOD=0x01;
        TH0 = 0xB8;
        TL0 = 0x00;
         ET0=1;
     TR0=1;
     EA = 1;
while(1)
{
static key_flag;
   if(key == 0)
     {
            delayms (10);
                if(key == 0)
                {
                  key_flag = 1;
                   TR0 = 1;
                  while(!key);
                   TR0 = 0;
                }
           }
         if(key_flag)
           {
                  if(numl>= 10)
                  {
                   key2 = 0 ;
                              numl =0 ;
                   key_flag = 0;
                  }
                  else
                  {
                    key3 = ~key3 ;
                                numl =0 ;
                    key_flag = 0;
                  }
           }
           numl =0 ;
           key_flag = 0;
         }
}




回复

使用道具 举报

ID:634487 发表于 2019-12-18 22:59 | 显示全部楼层
怎么发程序    我这发的都是乱码了
回复

使用道具 举报

ID:210017 发表于 2019-12-18 23:19 | 显示全部楼层
程序改成,按键按下后这个变量numl自加,然后判断这个变量大小,确定是长按还是短按
回复

使用道具 举报

ID:634487 发表于 2019-12-19 01:11 | 显示全部楼层
问题解决了  管理删了吧
回复

使用道具 举报

ID:332444 发表于 2019-12-19 04:28 | 显示全部楼层
回复

使用道具 举报

ID:164602 发表于 2019-12-19 08:19 | 显示全部楼层
可以看看我的程序:
                if (Agoto==1)//如果相应的键按下
                {
                        n=0;//时间计数复位
                        while(Agoto)//如果键一直按着
                        {
                                n++;//时间开始计数
                                Delay10ms(1);//计时一次0.01s
                                if (n>200)//如果长时间按着不放,大于2s
                                {
                                        break;//则退出
                                }
                        }
                        if (n>30)//如果时间次数大于30次小于200,即大于0.3s小于2s
                        {
                                PWMD();//执行这个
                        }
                        else//否则,时间小于0.3s
                        {
                                PU();//执行这个
                        }
                }
是一键双功能吧。
这个程序已经在我的无线电遥控小车上真实使用通过。
对了,延时程序也给你:
void Delay10ms(unsigned int c)
{
    unsigned char a,b;
    for(c;c>0;c--)
        for(b=38;b>0;b--)
            for(a=130;a>0;a--);
}
回复

使用道具 举报

ID:213173 发表于 2019-12-19 10:11 | 显示全部楼层
楼主按照原作示例写的程序不成功是没有充分理解原作意图。楼主的头文件#include <STC15Wxx.h>,想必是使用了STC15系列单片机,由于STC15系列是1T单片机,速度比51快许多,所以原来的延时函数要修改。原作是用定时器中断计数的方式判断长、短按时间,楼主没有开中断,所以numl不可能>= 10,也就不会有长按响应。
给你的代码补充完整:
  1. #include <STC15Wxx.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #define ulong unsigned long

  6. sbit key        =P1^7;               
  7. sbit LED1=P3^0;                        
  8. sbit LED2=P3^1;                        
  9.                                 
  10. bit key_flag = 0;//按键有效标志位变量
  11. uchar count = 0;//中断计数变量
  12. /*
  13. void delayms(uint xms) //添加延时
  14. {
  15.         uint i, j;
  16.         for(i=xms;i>0;i--)
  17.                 for(j=110;j>0;j--);//12T单片机
  18. }*/
  19. void delayms(uint xms) //添加延时
  20. {
  21.         uint i, j;
  22.         for(i=xms;i>0;i--)
  23.                 for(j=1150;j>0;j--);//1T单片机
  24. }

  25. void main()
  26. {       
  27.         //初始化定时器0
  28.         TMOD= 0x01;                //设置定时器模式
  29.         TH0 = 0xDC;                //10毫秒@11.0592MHz
  30.         TL0 = 0x00;                //10毫秒@11.0592MHz
  31.         TR0 = 0;                        //定时器0关闭
  32.         ET0 = 1;                        //开定时器0中断
  33.         EA  = 1;                        //开总中断
  34.         while(1)
  35.         {
  36.                 if(key == 0)//判断键按下
  37.                 {
  38.                         delayms(10);//延时10ms防抖
  39.                         if(key == 0)//确认键按下
  40.                         {
  41.                                 key_flag = 1; //有效标志位置1
  42.                                 TR0 = 1;                        //开定时器
  43.                                 while(!key);        //等待松手
  44.                                 TR0 = 0;                        //关定时器
  45.                         }
  46.                 }
  47.                 if(key_flag)                        //判断按键有效
  48.                 {
  49.                         if(count>=100)        //超过1秒算长按
  50.                         {
  51.                                 LED1=~LED1;        //LED1取反
  52.                         }
  53.                         else                                //小于1秒算短按
  54.                         {
  55.                                 LED2=~LED2;        //LED2取反
  56.                         }
  57.                 }
  58.                 count=0;                                //中断计数变量清0
  59.                 key_flag = 0;                //按键有效标志位清0
  60.         }
  61. }
  62. //定时器0 中断服务函数
  63. void Timer0Interrupt(void) interrupt 1
  64. {
  65.         TH0 = 0xDC;                //10毫秒@11.0592MHz
  66.         TL0 = 0x00;                //10毫秒@11.0592MHz
  67.         if(count<250)        //防止溢出
  68.                 count++;                //中断计数变量自+1
  69. }
复制代码
回复

使用道具 举报

ID:634487 发表于 2019-12-19 13:24 | 显示全部楼层
HC6800-ES-V2.0 发表于 2019-12-19 08:19
可以看看我的程序:
                if (Agoto==1)//如果相应的键按下
                {

多谢你的例程,我现在主要是实验在主程序运行的时候。按键中断可以随时的中断。
回复

使用道具 举报

ID:634487 发表于 2019-12-19 13:47 | 显示全部楼层
wulin 发表于 2019-12-19 10:11
楼主按照原作示例写的程序不成功是没有充分理解原作意图。楼主的头文件#include ,想必是使用了STC15系列单 ...

多谢你的指导,我想在主程序加入别的程序。也就是没有中断的时候干别的事情。
我现在加了后,按键按下去后很难进入到中断程序里。也就是反应迟钝。不能够随时中断。中断后执行中断程序 一直到中断程序结束,中间不在接受中断。



加在while(1)下面的
k2 = 0;
for(i=3000;i>0;i--)
for(j=110;j>0;j--);
k2 = 1;  
for(i=3000;i>0;i--)
for(j=110;j>0;j--);




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表