微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 怎样实现两个功能的切换?

怎样实现两个功能的切换?

时间:10-02 整理:3721RD 点击:
这是代码部分:
//**头文件的声明**//
#include<reg52.h>
#include <intrins.h>
#define uint unsigned int//宏定义
//**声明子函数**//
void delayms(uint);
void led();
void segment7();
uint Key_Scan();
unsigned char code DIG_CODE[16]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07,
                                 0x7F ,0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71};
sbit k1 = P3^7;
uint count=0;
/*******************************************************************************
* 函 数 名         : main
* 函数功能                   : 主函数,包含用开关切换功能函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void main()
{
while(1)
{
         if(count%2)
         segment7();
         else
         led();
}
}
/*******************************************************************************
* 函 数 名         : led
* 函数功能                   : led流水灯,4s完成8个LED灯的闪烁
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void led()
{
  unsigned char LED;
  LED = 0x01;          //即:0000 0001   低电平点亮
  while (1)
        {
             P2 = LED;
                 delayms(480);
                 LED = LED << 1;    //点亮下一个LED "<<"为左移位,右边补上0,即:0000 0001->0000 0010
                  if (P2 == 0x00)        //当它全亮的时候,重新赋值
                 {
                         LED = 0x01;          // 0000 0001
                 }
                                    
        }
}
/*******************************************************************************
* 函 数 名         : segment7
* 函数功能                   : 7段数码管(cc极)的动态显示
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void segment7()
{
        unsigned char i = 0;
        while(1)
        {
                for(i=0;i<16;i++)
                {
                         P0=DIG_CODE;
                         delayms(480);
            }                                
    }
}
/*******************************************************************************
* 函 数 名         : Key_Scan
* 函数功能                   : 按键消抖,并输出键值
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
uint Key_Scan()
{
    if (k1==0)
        {
         delayms(10);
         if (k1==0)
         {
                 while(!k1);
                 delayms(10);
                 while(!k1);
                 count++;
         }        
        }
        return count;
}
/*******************************************************************************
* 函 数 名         : delayms
* 函数功能                   : 延时函数,sec为多少,就延迟多少毫秒。
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void delayms(uint sec)//自定义的延迟函数
          {
                  uint i,j;
                  for(i=sec;i>0;i--)//sec为多少,就延迟多少毫秒。
                      for(j=110;j>0;j--);  
          }
这个是原理图


用按键不能切换LED灯和数码管,,求助。

你要把Key_Scan()函数放在main函数的while(1)里面,不然count的值一直都是0.

试过了,还是不行。

那应该是你在点击按键时,程序在执行if...else...语句,没能进入key_scan函数。你可以试着按着按键保持一段时间,这样就保证程序能进入key_scan函数,就能实现你的切换功能了。如果要实现按一下马上就切换,就要改进程序了。

你的按键检测也没在主函数里面 而且程序运行以后就停在了LED里面那个while(1)里面了 你只能吧按键检测函数放到这个死循环里面才好使

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

网站地图

Top