📄 dianzishizhong.txt
字号:
#include"c:\stc54\stc54.h"
#include"c:\stc54\LedCode-P.h"
// 定义输入按键I/O
sbit set = P3^4;
sbit inc = P2^6;
sbit ring = P0^3;
sbit led0 = P2^1; // 闹铃
bit set_sec, set_min, set_hour; // 设置时,分,秒标志
bit set_ring0, set_ring1, set_ring2; // 设置闹铃1,闹铃2,闹铃3标志
bit set_ring; // 开始设置闹铃标志
bit sec; // 秒标志
bit half; // 半秒标志,调整时间时为被调数的闪动作准备
bit run; // 时间运行标志,时间调整时设置为run = 0
bit key_mark; // 按键标志
bit store_ring0,store_ring1, store_ring2; // 存储闹铃1,闹铃2,闹铃3标志
bit store_ring; // 存储闹铃标志
bit ring_call; // 闹铃响应按键
bit ring_re; // 不响应闹铃,闹铃不能停止
bit time_recall; // 看完闹铃,恢复正常
bit ring0_see, ring1_see, ring2_see; // 观察闹铃1,闹铃2,闹铃2标志
bit ring_see;
bit ring_full; // 闹铃存储满标志
bit ring0_lock, ring1_lock, ring2_lock; // 关闭闹铃1,闹铃2,闹铃3标志
unchar second, minute, hour;
unchar second_before, minute_before, hour_before;
unchar second_ring_before, minute_ring_before, hour_ring_before;
unchar second_set_before, minute_set_before, hour_set_before;
unchar ring0, ring1, ring2; // 闹铃1,闹铃2, 闹铃3
unchar count;
unchar count_second; // 观察闹铃,调整时表自行计数
unchar dip[6]; // 显示变量,数码管需要显示的内容存入此变量
unchar status; // 二极管状态
extern dsp(unchar); // dsp是用汇编语言编写的外部函数,用extern声明
void key_func(); // 按键功能函数
void dspfull();
void dspplay();
void delay(); // 延时函数
void change(); // 控制二极管亮灭函数
// 由于中断函数任务较多,为了保护现场中断函数工作寄存器用1区
void time0() interrupt 1
{
TL0 = TL0 + (-50000 & 0xff); // 设置初值
TH0 = -50000>>8;
// 运行时间
if (++count > 19)
{
count = 0;
sec = 1;
if(++second > 59)
{
second = 0;
if (++minute > 59)
{
minute = 0;
if (++hour > 23)
{
hour = 0;
}
}
}
}
if(count == 10)
half = 1;
}
void main()
{
TMOD = 1; // 初始化SFR
IE = 0x82;
TR0 = 1;
run = 1; // 通电时工
time_recall = 1;
// 由于C51初始化时内部RAM都为零,因此系统初始为零的值都不用赋值
dspplay();
for( ; ; )
{
if(!key_mark && (!set || !inc || !ring))
{
// 键功能调用
delay(); // 防止干扰
if (!set || !inc || !ring) // 防干扰
{
key_mark = 1; // 设置标志,确保每次按键只执行1次
key_func();
}
}
else if(set && inc && ring)
key_mark = 0; // 抬键清标志,以便下次按键
if (sec)
{
// 显示功能调用
if(run && !ring_see )
dspfull(); // 时钟运行,显示时间
dspplay();
sec =0;
count_second++;
}
else if(half)
{
if(!run)
dspplay();
half = 0;
}
}
}
void dspfull()
{
// 拆数程序,将需要显示的内容送入各自的寄存器
dip[0] = hour / 10;
dip[1] = hour % 10;
dip[2] = minute / 10;
dip[3] = minute % 10;
dip[4] = second / 10;
dip[5] = second % 10;
if (((ring0 == dip[0]*1000 + dip[1]*100 + dip[2]*10 + dip[3]) && !ring0_lock)
|| ((ring1 == dip[0]*1000 + dip[1]*100 + dip[2]*10 + dip[3]) && !ring1_lock)
|| ((ring2 == dip[0]*1000 + dip[1]*100 + dip[2]*10 + dip[3]) && !ring2_lock) )
{
change();
}
}
void dspplay()
{
unchar n;
if(ring0_see)
{
for(n=0;n<6;n++)
{
if(set_ring)
{
if(!run && half && ((set_hour && (n == 0 || n == 1))
|| (set_min && (n == 2 || n == 3))
|| (set_sec && (n == 4 || n == 5)))) // 显示黑屏的条件
{
dsp(0xff);
}
else
{
dip[4] = 0;
dip[5] = 0;
dsp(dspc[dip[n]]);
}
}
else
{
if(n==0 || n==1 || n==2 || n==3)
{
dip[0] = ring0 / 1000;
dip[1] = ring0 % 1000 /100;
dip[2] = ring0 % 100 / 10;
dip[3] = ring0 % 10;
}
if(n==4 || n==5)
{
dip[4] = 0;
dip[5] = 0;
}
dsp(dspc[dip[n]]);
}
}
}
else if(ring1_see)
{
for(n=0;n<6;n++)
{
if(set_ring)
{
if(!run && half && ((set_hour && (n == 0 || n == 1))
|| (set_min && (n == 2 || n == 3))
|| (set_sec && (n == 4 || n == 5)))) // 显示黑屏的条件
{
dsp(0xff);
}
else
{
dip[4] = 0;
dip[5] = 0;
dsp(dspc[dip[n]]);
}
}
else
{
if(n==0 || n==1 || n==2 || n==3)
{
dip[0] = ring1 / 1000;
dip[1] = ring1 % 1000 /100;
dip[2] = ring1 % 100 / 10;
dip[3] = ring1 % 10;
}
if(n==4 || n==5)
{
dip[4] = 0;
dip[5] = 0;
}
dsp(dspc[dip[n]]);
}
}
}
else if(ring2_see)
{
for(n=0;n<6;n++)
{
if(set_ring)
{
if(!run && half && ((set_hour && (n == 0 || n == 1))
|| (set_min && (n == 2 || n == 3))
|| (set_sec && (n == 4 || n == 5)))) // 显示黑屏的条件
{
dsp(0xff);
}
else
{
dip[4] = 0;
dip[5] = 0;
dsp(dspc[dip[n]]);
}
}
else
{
if(n==0 || n==1 || n==2 || n==3)
{
dip[0] = ring2 / 1000;
dip[1] = ring2 % 1000 /100;
dip[2] = ring2 % 100 / 10;
dip[3] = ring2 % 10;
}
if(n==4 || n==5)
{
dip[4] = 0;
dip[5] = 0;
}
dsp(dspc[dip[n]]);
}
}
}
else if(ring_full)
{
for(n = 0; n < 6; n++)
{
if(!run && half ) // 显示黑屏的条件
{
dsp(0xff);
}
else
{
dsp(dspc[dip[n]]); // 正常显示
}
}
}
else if(!ring0_see && !ring1_see && !ring2_see && !ring_full)
{
for(n = 0; n < 6; n++)
{
if(!run && half && ((set_hour && (n == 0 || n == 1))
|| (set_min && (n == 2 || n == 3))
|| (set_sec && (n == 4 || n == 5)))) // 显示黑屏的条件
{
dsp(0xff);
}
else
{
dsp(dspc[dip[n]]); // 正常显示
}
}
}
}
void key_func()
{
if (!set) // 设置键
{
if(run)
{
if(set_ring0 || set_ring1 || set_ring2)
{
set_ring = 1;
if(set_ring0)
{
ring0_lock = 0;
hour = ring0 / 100;
minute = ring0 % 100;
}
if(set_ring1)
{
ring1_lock = 0;
hour = ring1 / 100;
minute = ring1 % 100;
}
if(set_ring2)
{
ring2_lock = 0;
hour = ring2 / 100;
minute = ring2 % 100;
}
hour_set_before = hour_ring_before;
minute_set_before = minute_ring_before;
second_set_before = second_ring_before;
}
else
{
hour_set_before = dip[0]*10 + dip[1];
minute_set_before = dip[2]*10 + dip[3];
second_set_before = dip[4]*10 + dip[5];
}
set_sec = 1;
set_min = 0;
set_hour = 0;
run = 0;
}
else if(set_sec)
{
set_sec = 0;
set_min = 1;
set_hour = 0;
}
else if(set_min)
{
set_sec = 0;
set_min = 0;
set_hour = 1;
}
else if(set_hour)
{
if(set_ring0 || set_ring1 || set_ring2)
{
}
else
{
hour = hour_before;
minute = minute_before ;
second = second_before ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -