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

2019-07-15 15:44发布

这是代码部分:
//**头文件的声明**//
#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--);  
          }
这个是原理图
1.PNG

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

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
photobike
1楼-- · 2019-07-15 19:50
你要把Key_Scan()函数放在main函数的while(1)里面,不然count的值一直都是0.
findist
2楼-- · 2019-07-16 01:48
 精彩回答 2  元偷偷看……
photobike
3楼-- · 2019-07-16 02:35
findist 发表于 2015-11-3 09:24
试过了,还是不行。。

那应该是你在点击按键时,程序在执行if...else...语句,没能进入key_scan函数。你可以试着按着按键保持一段时间,这样就保证程序能进入key_scan函数,就能实现你的切换功能了。如果要实现按一下马上就切换,就要改进程序了。
zhoukai16702969
4楼-- · 2019-07-16 05:22
你的按键检测也没在主函数里面 而且程序运行以后就停在了LED里面那个while(1)里面了 你只能吧按键检测函数放到这个死循环里面才好使

一周热门 更多>