求高手来帮忙修改下
请教各位大虾,我这个程式怎样桥接PB和DC,我试说一下我的要求,求各位大虾指教下.一、正常状态下当按下PB键,没其它操作时,时间完了回复正常状态。
二、正常状态下按DC键,对应ALARM(P1.1)脚有输出。
三、正常状态下先按PB键,在它的时间还未完成时再按DC键,这时要求要数SWITCH的时间,请问要怎样修改才可以做到这个效果。
注意:PB为轻触式开关,DC为自锁式开关。
程式如下:
// -----------------------------
// 6 mins timer board
// Each Button 1 mins
// -----------------------------
#include <reg52.h>
#include <stdio.h>
#include <stdlib.h>
#define uchar unsigned char
#define uint unsigned int
sbit dc=P3^1; //D/C为NO时,CPU-3脚为1
sbit pb=P3^0; //按PB时CPU-2脚为0
sbit runled=P3^2;
sbit lamp=P3^5; //1 fo ON
sbit alarm=P1^1; //0 for ON , 1 for Off
sbit time1=P1^2; //0 for on
sbit time2=P1^3;
sbit time3=P1^4;
sbit time4=P1^5;
sbit time5=P1^6;
sbit time6=P1^7;
void init();
void delayms(uint xms);
void run_led();
void delays(uint xms1);
void check_timer();
void check_dc();
void check_pb();
uint delay_time;
uint x50ms=6;
bit start_flag;
bit end_flag;
/**************初始化********************************/
void init()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
IE=0x82;
TR0=1;
alarm=1;
delayms(10);
lamp=1;
delayms(10);
delay_time=0;
start_flag=0;
end_flag=0;
}
/************RUN燈***************************/
void timer1() interrupt 1 using 1
{
run_led();
}
/****************RUN燈子函數********************/
void run_led()
{
x50ms--;
if(x50ms==0){
x50ms=6;
//TH0=(65536-50000)/256;
//TL0=(65536-50000)%256;
delayms(100);
runled=~runled;
}
}
/***************大延時******************/
void delays(uint xms1) //xms1=1000約为1分钟
{
uint i,j,k;
for(i=xms1;i>0; i--)
for(j=110; j>0; j--)
for(k=50;k>0;k--);
}
/***************小延時******************/
void delayms(uint xms) //xms=1000約为1秒
{
uint i,j;
for(i=xms;i>0; i--)
for(j=110; j>0; j--);
}
/*********按下PB數時間,約10秒還原)************/
void check_pb()
{
if(pb==0)
{
delayms(10);
if(pb==0)
{
start_flag=1;
lamp=0;
delayms(10000); //約10 SEC
lamp=1;
delayms(10);
}
}
}
/****************check_timer********************/
void check_timer()
{
delay_time=0;
if (time1==0)
{
delay_time=delay_time+1;
}
delayms(5);
if (time2==0)
{
delay_time=delay_time+1;
}
delayms(5);
if (time3==0)
{
delay_time=delay_time+1;
}
delayms(5);
if (time4==0)
{
delay_time=delay_time+1;
}
delayms(5);
if (time5==0)
{
delay_time=delay_time+1;
}
delayms(5);
if (time6==0)
{
delay_time=delay_time+1;
}
delayms(5);
}
/***************扫描dc*************************/
void check_dc()
{
if (dc==1)
{
delayms(10);
if (dc==1)
{
end_flag=dc; //不知道是不是这里出了问题
if(start_flag==1 && end_flag==1) //不知道是不是这里出了问题
{
lamp=0;
delayms(50);
switch(delay_time)
{
case 1:
delays(1000); //1 MIN
break;
case 2:
delays(2000); //2 MIN
break;
case 3:
delays(3000); //3 MIN
break;
case 4:
delays(4000); //4 MIN
break;
case 5:
delays(5000); //5 MIN
break;
case 6:
delays(6000); //6 MIN
break;
default:
delayms(1000); //1 SEC
break;
}
}
}
alarm=0;
delayms(10);
while(!dc);
}
}
/***************主函數**************************/
void main()
{
init();
while(1)
{
check_pb();
delayms(10);
check_timer();
check_dc();
}
}