|
//主程序
void main()
{
TMOD=0X11; //定时器设置
TH1=0X3C;
TL1=0XB0;
TH0=0X3C; //定时器0置初值 0.05S
TL0=0XB0;
EA=1; //开总中断
ET0=1; //定时器0中断开启
ET1=1; //定时器1中断开启
TR0=1; //启动定时0
TR1=0; //关闭定时1
EX0=1; //开外部中断0
EX1=1; //开外部中断1
P2=0Xc3; // 开始默认状态,东西绿灯,南北黄灯
sec_nb=sec_dx+5; //默认南北通行时间比东西多5秒
while(1) //主循环
{
key(); //调用按键扫描程序
display(); //调用显示程序
}
}
//函数的定义部分
void key(void) //按键扫描子程序
{
if(k1!=1) //当K1(禁止)键按下时
{
display(); //调用显示,用于延时消抖
if(k1!=1) //如果确定按下
{
TR0=0; //关定时器
Red_dx=1;
Red_nb=1; //全部置红灯
TR1=0;
sec_dx=00; //四个方向的时间都为00
sec_nb=00;
do
{
display(); //调用显示,用于延时
}
while(k1!=1); //等待按键释放
}
}
if(k2!=1) //当K2(确认)键按下时
{
display(); //调用显示,用于延时消抖
if(k2!=1) //如果确定按下
{
TR0=1; //启动定时器0
sec_nb=set_timenb; //从中断回复,仍显示设置过的数值
sec_dx=set_timedx; //显示设置过的时间
TR1=0; //关定时器1
if(set==0) //时间倒时到0时
{
P2=0X00; //灭显示
Green_dx=1; //东西绿灯亮
Red_nb=1; //南北红灯亮
sec_nb=sec_dx+5; //回到初值
}
else
{
P2=0x00; //南北绿灯,东西红灯
Green_nb=1;
Red_dx=1;
sec_dx=sec_nb+5;
}
}
}
}
void display(void) //显示子程序
{
buf[1]=sec_nb/10; //第1位 东西秒十位
buf[2]=sec_nb%10; //第2位 东西秒个位
buf[3]=sec_dx/10; //第3位 南北秒十位
buf[0]=sec_dx%10; //第4位 南北秒个位
P1=0xff; // 初始灯为灭的
P0=0x00; //灭显示
P1=0xfe; //片选LED1
P0=table[buf[1]]; //送东西时间十位的数码管编码
delay(1); //延时
P1=0xff; //关显示
P0=0x00; //灭显示
P1=0xfd; //片选LED2
P0=table[buf[2]]; //送东西时间个位的数码管编码
delay(1); //延时
P1=0xff; //关显示
P0=0x00; //关显示
P1=0Xfb; //片选LED3
P0=table[buf[3]]; //送南北时间十位的数码管编码
delay(1); //延时
P1=0xff; //关显示
P0=0x00; //关显示
P1=0Xf7; //片选LED4
P0=table[buf[0]]; //送南北时间个位的数码管编码
delay(1); //延时
}
|
|