切换到宽版
爱科技/爱创意/爱折腾;电子/数码爱好者的家!欢迎访问新版数码之家网站
  • 2583阅读
  • 12回复

向坛友请教下如何用一个按键换内容, [复制链接]

上一主题 下一主题
离线小向
 

发帖
1451
M币
4306
专家
1
粉丝
36
只看楼主 倒序阅读 我要置顶 楼主  发表于: 2014-07-01
帮我已经写了程序但还没达到我的要求,我是想用一个按键切换多种花样的流水灯,但写出来后程序不是按我的意思走,按了一下按键就走一下花样然后就黑了,我想让他一直显示,直到下一个花样指令发出来。
在这发上程序,请各位前辈指导下,谢谢。

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
unsigned int t;
sbit k1=P0^0;
void delay(uint x)
{
     uchar i;
    while(x--)
    {
         for(i=120;i>0;i--);
    }
}

void huayang1()
{
    P1=0xf0;
     delay(50);
    P1=0xff;
     delay(70);
    
    P1=0xf0;
     delay(50);
    P1=0xff;
     delay(70);

    P1=0xf0;
     delay(50);
    P1=0xff;
     delay(70);

    P1=0x0f;
    delay(50);
    P1=0xff;
    delay(70);

    P1=0x0f;
    delay(50);
    P1=0xff;
    delay(70);

        P1=0x0f;
    delay(50);
    P1=0xff;
    delay(70);
    
    
}
void huayang2()
{
   P1=0xc3;
   delay(50);
   P1=0xff;
  delay(50);
P1=0xc3;
   delay(50);
   P1=0xff;
  delay(50);
  P1=0xc3;
   delay(50);
   P1=0xff;
  delay(50);
  

   P1=0x3c;
   delay(50);
   P1=0xff;
  delay(50);

  P1=0x3c;
   delay(50);
   P1=0xff;
  delay(50);
  P1=0x3c;
   delay(50);
   P1=0xff;
  delay(50);


}

void main()
{
    k1=1;
    while(1)
           {
            if(!k1)
                    {
                       t++;
                        if(t>8)t=0;
                       if(t==1){huayang1();}
                        else{huayang2();}
                      
                        
                            }
                
            }
}
本帖最近打赏记录:共1条打赏M币+5

发帖
1592
M币
1534
专家
2
粉丝
50
只看该作者 1楼 发表于: 2014-07-01
你应该试一试中断按键吧
本帖最近打赏记录:共1条打赏M币+1
离线lxh2626

发帖
198
M币
2136
专家
0
粉丝
10
只看该作者 2楼 发表于: 2014-07-02
void main()
{
    unsigned char flag = 0;
    k1=1;
    while(1)
    {
        if(!k1)
        {
            t++;
            if(t>=2)
                t=0;
            flag = ~flag;
        }
        if(flag == 0)
        {
            huayang1();
        }
        else
        {
            huayang2();
        }
    }
}
试试吧    不过你这按键检测是个问题 不过先给你解决一个问题
本帖最近打赏记录:共1条打赏M币+1
离线ylxlove

发帖
398
M币
1220
专家
6
粉丝
19
只看该作者 3楼 发表于: 2014-07-02
你是想实现 按下一次按键 循环运行huayang1   按下一个按键  循环运行huayang2    再按一下按键 循环运行huayang1吧

这个程序很简单的,如果需要,我可以给你提供思路  你自己解决程序的问题  有什么问题提问。    
本帖最近打赏记录:共1条打赏M币+1
离线ylxlove

发帖
398
M币
1220
专家
6
粉丝
19
只看该作者 4楼 发表于: 2014-07-02
你之前写的程序实现的效果是。

当你把按键一直按着的时候,花样程序是一直运行的。
当你按下案件后再放开,花样程序会运行一段时间。之后保持P1=0xff。也就是全黑的状态。  
离线jkj

发帖
1320
M币
6665
专家
7
粉丝
39
只看该作者 5楼 发表于: 2014-07-02
原来程序有几个问题:
1.  t没有明确赋初值。
2. 按键没有防抖动处理。
3. 实际只有2个花样,但是程序里是if(t>8) t=0;。存在t没有对应花样的情况。
4. 在while循环中检测按键,但是在显示花样huayang1()或huayang2时,huayang1()或huayang2()中有很多个delay(50),总体耗时较长,使得按键不能及时响应。可以把按键的响应改为用中断方式。
本帖最近打赏记录:共1条打赏M币+1
离线小向

发帖
1451
M币
4306
专家
1
粉丝
36
只看该作者 6楼 发表于: 2014-07-02
回 ylxlove 的帖子
ylxlove:你是想实现 按下一次按键 循环运行huayang1   按下一个按键  循环运行huayang2    再按一下按键 循环运行huayang1吧
这个程序很简单的,如果需要,我可以给你提供思路  你自己解决程序的问题  有什么问题提问。&nb .. (2014-07-02 00:29) 回 ylxlove 的帖子

就是按一下一个花样,然后再按就又循环一个花样,这样的
离线406670216

发帖
211
M币
1406
专家
1
粉丝
9
只看该作者 7楼 发表于: 2014-07-02
不要将子函数放到按键检测的if里面,用按键检测来改变一个标志位。再在按键检测外面判断标志位来执行子函数。上面坛友说了将按键检测放到中断,这无疑是最好的方法!因为子函数太多延时,导致执行时间很长,假设单片机在执行子函数期间,你按了按键,当松开按键了,单片机还没跳出子函数回到while里,所有根本没检测到你按键的操作。可以用外部中断,要么用定时器中断(一段时间后,进中断检测按键),要么将按键检测放到延时函数里(最简单易行)。
本帖最近打赏记录:共1条打赏M币+1
离线ylxlove

发帖
398
M币
1220
专家
6
粉丝
19
只看该作者 8楼 发表于: 2014-07-03
回 小向 的帖子
小向:就是按一下一个花样,然后再按就又循环一个花样,这样的 (2014-07-02 20:35) 回 小向 的帖子

对,就是需要在定义一个标志位。用于区分你按了几下,比如 你定义一个字符变量i
   。。。 i的初值为0,按一下i+1;再按一下i再加1.
你再在程序判断i的值来判断该调用哪个花样函数。
本帖最近打赏记录:共1条打赏M币+1
离线jinesc

发帖
2005
M币
5570
专家
9
粉丝
107
只看该作者 9楼 发表于: 2014-07-03
全局变量 记录按键次数呀
本帖最近打赏记录:共1条打赏M币+1
快速回复
限80 字节
温馨提示:所有技术区严禁灌水,“沙发”“顶”字样;禁止广告贴;以免被删除
 
上一个 下一个