*/
}
} { }
} { }
P0=num[i]; /*将要显示的数字i作为七段码表
的序号(段码数组下标),取出显示码送显示*/
if(k==1) /*如果送显示的LED为分的个位*/ P0=num[i] | 0x80; /*则将分的个显示码附加小数
delay(100);
点*/
/*显示延时,让LED充分点亮*/
else /*后90次消隐*/
P0=num[10];/*送LED消隐段码*/
if(k==1) /*如果要消隐的是分的个位*/ P0=num[10] | 0x80;
/*则将分的个位后的小数
点点亮(小数点不闪烁)*/
P2=tv[k]; /*送消隐的位码(即哪个LED需要闪delay(100);
/*消隐延时,让其充分消隐*/
烁)*/
else /*如果送显示的位不调整的位,则不需要闪烁显示*/
i=led[k]; /*将该LED位需要显示的数存于i中*/ P0=num[10]; /*该LED位不显示(短时消隐),送消隐P2=tv[k]; /*送需要显示的LED位码*/ delay(10); P0=num[i];
/*短时消隐延时,有利于显示位的切换/*将要显示的数字i作为七段码表的序
段码*/
号(段码数组下标),取出显示码送显示*/
if(k==1) /*如果送显示的LED为分的个位*/ { P0=num[i] | 0x80;}/*则将分的个显示码附加小数点*/
delay(100);
/*显示延时,让LED充分点
亮*/
else /*如果不是处在设置模式,则正常显示*/
{ load_LED(h_data, m_data); /*调用将实际时间代码装LED显示区的子程
i=led[k];
/*将该LED位需要显示的数存于i中*/
/*该LED位不显示(短时消隐),送消隐段
11
序,分离个位和十位*/
P0=num[10];
码*/
/********************************************************************************************************/
void adjust(void)
{
if(P3_0==0)
{
delay(100);
while(P3_0==0) {flag1++; display();} /*当调整键按下时,延时消抖,flag1控制
/*调整函数定义*/
}
delay(100);
/*显示延时,让LED充分点亮*/
}
P2=tv[k]; delay(10); P0=num[i]; if(k==1)
/*送需要显示的LED位码*/
/*短时消隐延时,有利于显示位的切换*/ /*将要显示的数字i作为七段码表的序号(段
}
码数组下标),取出显示码送显示*/
/*如果送显示的LED为分的个位*/ /*则将分的个显示码附加小数点*/
{ P0=num[i] | 0x80;}
延迟时间*/
if(flag1>50)
{
flag1=0;
flag++; /*用flag对调整键按下次数计数,目的是通过一个按键实现
多种功能 */
if(flag>=10) {flag=0;} }
}
/*************************************************************************************/
if(P3_1==0) /*移位控制键,在4个LED上来回移动,选择需要设置的LED
{
delay(100); display();
/*当flag不等于0时,说明处于调整状态,此时通过移位键 /*消抖*/
位*/
while(P3_1==0)
if(flag)
{
选择调整哪一个LED*/
12
**/
}
w=w+1; /*移位键控制w加1,用于修改位码,w代表4个LED
数码管的某一位*/
if(w>=4) w=0; }
/*****************************************************************************
if(P3_2==0) /*加1操作*/
if(flag) /*当处于调整模式时,对所选择的LED进行加1*/
{
switch(flag)
{
case 1:{ if(w==0) {h_data=H1_set(h_data);display();} /*校准时间的
}
if(w==0) {hdata1_on=H1_set(hdata1_on);display();} /*if(w==1) {hdata1_on=H0_set(hdata1_on);display();} if(w==2) {mdata1_on=M1_set(mdata1_on);display();} if(w==3) {mdata1_on=M0_set(mdata1_on);display();} break;
if(w==0) {hdata1_off=H1_set(hdata1_off);display();} /*if(w==1) {hdata1_off=H0_set(hdata1_off);display();} if(w==2) {mdata1_off=M1_set(mdata1_off);display();} if(w==3) {mdata1_off=M0_set(mdata1_off);display();} break;
13
{
/*消抖*/
delay(100); display();
while(P3_2==0)
时、分*/
if(w==1) {h_data=H0_set(h_data);display();} if(w==2) {m_data=M1_set(m_data);display();} if(w==3) {m_data=M0_set(m_data);display();} break;
case 2: {
}
设置开关1开启时间的时、分*/
case 3: {
设置开关1关断时间的时、分*/
}
}
if(w==0) {hdata2_on=H1_set(hdata2_on);display();} if(w==1) {hdata2_on=H0_set(hdata2_on);display();} if(w==2) {mdata2_on=M1_set(mdata2_on);display();} if(w==3) {mdata2_on=M0_set(mdata2_on);display();} break;
case 4: {
}
/*设置开关2开启时间的时、分*/
case 5: {
}
if(w==0) {hdata2_off=H1_set(hdata2_off);display();} /*if(w==1) {hdata2_off=H0_set(hdata2_off);display();} if(w==2) {mdata2_off=M1_set(mdata2_off);display();} if(w==3) {mdata2_off=M0_set(mdata2_off);display();} break;
设置开关2关断时间的时、分*/
default:{TR0=1;break;} }
}
}
void timer0() interrupt 1 /*定时器中断1服务子程序*/
{
counter++; {
s_data++; /*个位秒向十位秒进位*/ counter=0; }
/*如果秒计满60则向分进位,并将秒清0*/
s_data=0; /*秒清0*/ m_data++;
/*分进位 */
{ }
/*如果分计满60则向时进位,并将分清0*/
14
/*counter对定时中断进行计数,10000次中断为1秒*/
if(counter==10000
if(s_data==60)
if(m_data==60)
{
} {
}
m_data=0; h_data++;
/*分清0*/ /*时进位 */
if(h_data==24)
{ }
/*如果时计满24则将时清0*/
/*时清0*/
h_data=0;
main(void)
IE=0x8a; /*EA|-|-|ES|ET1|EX1|ET0|EX0=10001010中断允许控制*/
TMOD=0x02; /*GATE1|C/T|M1|M0|GATE0|C/T|M1|M0=00000010只由TR0来启动T0,TH0=176/*计数常数寄存器设置,中断定时时间为(256+200)x12/f0 */ TL0=-176/*定时计数器装初值*/
TR0=1; /*启动定时器T0,TCON为TF1|TR1|TF0|TR0|IE1|IT1|IE0|IT0*/ P3_6=1; /*关断定时开关1*/ P3_7=1; /*关断定时开关2*/ {
adjust(); /*调用调整函数*/
/*以下程序语句作用是:将设定的开启时间和关断时间分别跟当前时间进行比较, 当大于开启时间小于关断时间则在P3.6或P3.7输出低电平使开关接通,否则输出
K1_on=h_data>hdata1_on&&h_data T0工作于方式2,(自动再装入的8位计数器)*/ while(1) /*以下为死循环*/ 高电平使开关断开*/ m_data>=mdata1_on&&m_data K2_on=h_data>hdata2_on&&h_data m_data>=mdata2_on&&m_data } } if(K1_on) P3_6=0; else P3_6=1; if(K2_on) P3_7=0; else P3_7=1; 15 display();