微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 求教...怎么用一个按键切换两种流水灯状态,

求教...怎么用一个按键切换两种流水灯状态,

时间:10-02 整理:3721RD 点击:
初学单片机,真的不太懂,希望有大神指导下

设置一个位变量,每按一次键变量取反一次,为0执行A程序,为1执行B程序。

可以记录按键的次数,根据次数来选择执行状态,这样可以在多状态中进行切换,当到达最后一个状态时记得要回零,再从头开始循环

能不能帮我写出一个大概的框架?、万分感谢

怎么记录呀

比如设一个key_times的 变量,初始值为0,检测到一次按键按下,key_times就加一,这样key_times=1是第一次按键按下,=2就是第二次,以此类推,就可以根据key_times的值来判断该做什么。
假如按键按下10次为一循环,那当key_times=10,再加一时,就设置key_times=1,就可以一直循环了

//单键控制流水灯方向,可以参考,举一反三。
#include<reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit key=P3^7;                                        //按键端口
uchar num=0;                                        //按键计次标志
void keyscan()                                        //按键识别子程序
{
        static bit key_sign=0;                //按键自锁标志
        static uchar count=0;                //计数变量                       
        if(key==0)                                        //检测按键按下
        {
                count++;                                        //消抖计数
                if(count>=100)                        //100次检测按键如果为0
                {                       
                        count=100;                        //防止溢出
                        if(key_sign==0)                //按键自锁标志为0
                        {
                                key_sign=1;                //按键自锁标志置1,防止重复响应
                                num++;
                                if(num>=3)                //按任务取数
                                        num=0;
                        }
                }
        }
        else                                                        //按键抬起
        {
                key_sign=0;                                //按键自锁标志清0
                count=0;                                        //消抖计数清0
        }
}
void display()                                        //显示子程序
{
        static uint count1=0;                       //计数变量
        count1++;                                        //计数延时
        if(count1>=10000)
        {
                count1=0;
                switch(num)                                //多重分支
                {
                        case 0:
                        P1=0xfe;                                //固定显示
                        break;
                        case 1:
                        P1=_crol_(P1,1);                   //循环左移位
                        break;
       
                        case 2:
                        P1=_cror_(P1,1);        //循环右移位
                        break;
//                        case N:
//                        N任务
//                        break;
                }
        }
}               
void main()
{
//        P1=0xfe;
        while(1)
        {
                keyscan();                                //按键识别子程序
                display();                                //显示子程序
        }
}

一个变量就搞定了

谢谢

请问怎么切换程序呀

我在7楼给你的程序中已经很清楚的表述了这个问题,设置变量num就是为了记忆按键的操作状态,初学期间要多实验,只看程序不一定能完全理解。设置变量的数据类型是根据实际需要选择的,可以是bit位变量,也可以是unsigned char 无符号字符型以及其他类型,随着学习的深入逐渐掌握,给你的按键处理程序是完全可以用于实战的,并且非常容易扩展运用,而不是初级教科书上常用的delay,那是要占用系统运行时间影响运行效率的。

恩恩,,

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top