怎样实现两个功能的切换?
时间: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灯和数码管,,求助。
//**头文件的声明**//
#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)里面了 你只能吧按键检测函数放到这个死循环里面才好使