这是修改的程序,哪个大神帮我指导一下哪里的问题,不甚感激啊!!
#include "reg52.h"
#define const_led_short 50
#define const_key_time1 30 //按键去抖动延时的时间
#define const_key_time2 30
void initial_myself();
void initial_peripheral();
void delay_long(unsigned int uidelaylong);
void T0_time();
void key_service(); //按键服务的应用程序
void key_scan(); //按键扫描程序
sbit led_dr=P1^0;
sbit key_sr1=P3^0;
sbit key_sr2=P3^1;
sbit key_gnd_dr=P3^4;
unsigned char uckeysec=0; //被触法的按键编号
unsigned char uckeystartflag1=0; //启动定时中断计数的开关
unsigned int uikeytimecnt1=0; //按键去抖动延时计数器
unsigned char uckeylock1=0; //按键触法后自锁的变量标志
unsigned char uckeystartflag2=0; //启动定时中断计数的开关
unsigned int uikeytimecnt2=0; //按键去抖动延时计数器
unsigned char uckeylock2=0; //按键触法后自锁的变量标志
unsigned int uiledtimecnt=0; //led的持续时间计数器
void main()
{
initial_myself();
delay_long(100);
initial_peripheral();
while(1)
{
key_scan();
key_service();
}
}
void key_scan()
{
if(key_sr1==1) //IO是高电平,说明按键没有按下,此时要及时清零一下标志位
{
uckeylock1=0;
uckeystartflag1=0; //停止计数器
uikeytimecnt1=0;
}
else if(uckeylock1==0) //有按键按下 且第一次
{
uckeystartflag1=1; //启动计数器
if(uikeytimecnt1>=const_key_time1)
{
uckeystartflag1=0; //停止计数器
uckeylock1=1;
uikeytimecnt1=0;
uckeysec=1;
}
}
if(key_sr2==1) //IO是高电平,说明按键没有按下,此时要及时清零一下标志位
{
uckeylock2=0;
uckeystartflag2=0; //停止计数器
uikeytimecnt2=0;
}
else if(uckeylock2==0) //有按键按下 且第一次
{
uckeystartflag2=1; //启动计数器
if(uikeytimecnt2>=const_key_time2)
{
uckeystartflag2=0; //停止计数器
uckeylock2=1;
uikeytimecnt2=0;
uckeysec=2;
}
}
}
void key_service()
{
switch(uckeysec)
{
case 1:
uiledtimecnt=const_led_short;
uckeysec=0;
break;
case 2:
uiledtimecnt=const_led_short;
uckeysec=0;
break;
}
}
void T0_time() interrupt 1
{
TF0=0;
TR0=0;
if(uckeystartflag1==1) //启动计数器
{ if(uikeytimecnt1<0xffff)
{
uikeytimecnt1++;
}
}
if(uckeystartflag2==1) //启动计数器
{ if(uikeytimecnt2<0xffff)
{
uikeytimecnt2++;
}
}
if(uiledtimecnt!=0)
{
uiledtimecnt--;
led_dr=1;
}
else
{
;
led_dr=0;
}
TH0=0xf8;
TL0=0x2f;
TR0=1;
}
void delay_long(unsigned int uidelaylong)
{
unsigned int i,j;
for(i=0;i<uidelaylong;i++)
{
for(j=0;j<500;j++)
{
;
}
}
}
void initial_myself()
{
key_gnd_dr=0;
led_dr=0;
TMOD=0x01;
TH0=0xf8;
TL0=0x2f;
}
void initial_peripheral()
{
EA=1; //开总中断
ET0=1; //允许定时中断
TR0=1; //启动定时中断
}
|