标题:
这个单片机程序为什么按下key2按键,小灯不进行呼吸?
[打印本页]
作者:
6010010
时间:
2019-3-7 22:50
标题:
这个单片机程序为什么按下key2按键,小灯不进行呼吸?
#include<REG52.h>
#define uchar unsigned char
unsigned char PWM_COUNT;
unsigned int HUXI_COUNT;
unsigned char PWM_VLAUE;
bit direc_flag;
sbit led1=P0^0;
sbit led2=P0^1;
sbit led3=P0^2;
sbit led4=P0^3;
sbit led5=P0^4;
sbit led6=P0^5;
sbit led7=P0^6;
sbit led8=P0^7;
sbit w1=P2^4;
sbit key1 = P2^0;
sbit key2 = P2^1;
unsigned char smg_date[]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,
0x82,0xf8,0x80,0x98,0x88,0x83,
0xa7,0xa1,0x86,0x8e};
uchar an = 0;
void keyscan();
void delayms (uchar time)//???
{
for(time; time>0; time--)
{
TMOD = 0x01;
TH0 = 0xfc;
TL0 = 0x18;
TR0 = 1; //?????????0
while(TF0!=1);//???????
EA=1;
ET0 = 1;
TR0 = 0;
}
}
void scan_key (void)
{
if (!key1)
{
delayms (10);
if (!key1)
{
delayms (5);
while (!key1);
an++;
if (an==9)
{
an = 0;
}
}
}
}
void main (void)
{
w1=0;
while (1)
{
scan_key ();
if (an==0)
{
led1 = 1;
led2 = 1;
led3 = 1;
led4 = 1;
led5 = 1;
led6 = 1;
led7 = 1;
led8 = 1;
P1=smg_date[0];
an=0;
}
if (an==1)
{
led1 = 0;
led2 = 1;
led3 = 1;
led4 = 1;
led5 = 1;
led6 = 1;
led7 = 1;
led8 = 1;
P1=smg_date[1];
an=1;
}
if (an==2)
{
led1 = 1;
led2 = 0;
led3 = 1;
led4 = 1;
led5 = 1;
led6 = 1;
led7 = 1;
led8 = 1;
P1=smg_date[2];
an=2;
}
if (an==3)
{
led1 = 1;
led2 = 1;
led3 = 0;
led4 = 1;
led5 = 1;
led6 = 1;
led7 = 1;
led8 = 1;
P1=smg_date[3];
an=3;
}
if (an==4)
{
led1 = 1;
led2 = 1;
led3 = 1;
led4 = 0;
led5 = 1;
led6 = 1;
led7 = 1;
led8 = 1;
P1=smg_date[4];
an=4;
}
if (an==5)
{
led1 = 1;
led2 = 1;
led3 = 1;
led4 = 1;
led5 = 0;
led6 = 1;
led7 = 1;
led8 = 1;
P1=smg_date[5];
an=5;
}
if (an==6)
{
led1 = 1;
led2 = 1;
led3 = 1;
led4 = 1;
led5 = 1;
led6 = 0;
led7 = 1;
led8 = 1;
P1=smg_date[6];
an=6;
}
if (an==7)
{
led1 = 1;
led2 = 1;
led3 = 1;
led4 = 1;
led5 = 1;
led6 = 1;
led7 = 0;
led8 = 1;
P1=smg_date[7];
an=7;
}
if (an==8)
{
led1 = 1;
led2 = 1;
led3 = 1;
led4 = 1;
led5 = 1;
led6 = 1;
led7 = 1;
led8 = 0;
P1=smg_date[8];
}
if (an==9)
{
led1 = 1;
led2 = 1;
led3 = 1;
led4 = 1;
led5 = 1;
led6 = 1;
led7 = 1;
led8 = 1;
P1=smg_date[9];
}
if(key2==0)
{
delayms(5);
if(key2==0)
{
while(!key2);
TR0=1;
}
}
}
switch(an)
{
case 1: if (PWM_COUNT==PWM_VLAUE)
{
led1=1;
}
if(PWM_COUNT==10)
{
led1=0;
PWM_COUNT=0;
}
break;
case 2: if (PWM_COUNT==PWM_VLAUE)
{
led2=1;
}
if(PWM_COUNT==10)
{
led2=0;
PWM_COUNT=0;
}
break;
case 3: if (PWM_COUNT==PWM_VLAUE)
{
led3=1;
}
if(PWM_COUNT==10)
{
led3=0;
PWM_COUNT=0;
}
break;
case 4: if (PWM_COUNT==PWM_VLAUE)
{
led4=1;
}
if(PWM_COUNT==10)
{
led4=0;
PWM_COUNT=0;
}
break;
case 5: if (PWM_COUNT==PWM_VLAUE)
{
led5=1;
}
if(PWM_COUNT==10)
{
led5=0;
PWM_COUNT=0;
}
break;
case 6: if (PWM_COUNT==PWM_VLAUE)
{
led6=1;
}
if(PWM_COUNT==10)
{
led6=0;
PWM_COUNT=0;
}
break;
case 7: if (PWM_COUNT==PWM_VLAUE)
{
led7=1;
}
if(PWM_COUNT==10)
{
led7=0;
PWM_COUNT=0;
}
break;
case 8: if (PWM_COUNT==PWM_VLAUE)
{
led8=1;
}
if(PWM_COUNT==10)
{
led8=0;
PWM_COUNT=0;
}
break;
}
}
void T0_timer() interrupt 1
{
PWM_COUNT++;
HUXI_COUNT++;
if((HUXI_COUNT==600)&&(direc_flag==1))
{
HUXI_COUNT=0;
PWM_VLAUE--;
if(PWM_VLAUE==1)
direc_flag=0;
}
if((HUXI_COUNT==600)&&(direc_flag==0))
{
HUXI_COUNT=0;
PWM_VLAUE++;
if(PWM_VLAUE==9)
direc_flag=1;
}
}
复制代码
作者:
HC6800-ES-V2.0
时间:
2019-3-8 08:37
一般的高手都不会看你的程序的,我嘛,看看了。
问题一:为什么不呼吸?因为你的switch部分,全部在主循环外,根本没有执行到嘛。
问题二:就是把它放入主循环了,也要等好一会,灯才会闪,注意,是闪,亮一个很短时间就灭了,不是呼吸。说明呼吸这部分程序是有问题的。看不懂你的呼吸程序,你这个呼吸程序好像太复杂了。
建议:你先做一个只让灯呼吸起来的程序吧,单一功能看能不能实现。
作者:
yaoji123
时间:
2019-3-8 08:54
可能有二个问题:定时器定时值中断后未重装,主程序在执行过程时间长,可能判断值过程起不到作用。如果定时器只是为延时,不好用空操作作为延时。
作者:
lfc315
时间:
2019-3-8 10:16
应该是按下按键后,程序就进入到void scan_key里面出不来了,程序在等你放开按键;
检测按键的函数改一下
作者:
良秀绵绵
时间:
2019-3-8 10:58
程序有大问题,慢慢找吧啊
作者:
static
时间:
2019-3-8 11:35
本帖最后由 static 于 2019-3-22 10:04 编辑
程式逻辑没理
作者:
static
时间:
2019-3-8 11:37
本帖最后由 static 于 2019-3-22 10:03 编辑
这经里有别人处理按键与被执行事物处理的例子
作者:
lfc315
时间:
2019-3-8 11:48
应该是 while(!key2); 这句的问题?
作者:
菜用鸡
时间:
2019-3-8 22:39
以后加点注释,才有人愿意看,不然看得难受
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1