// 软件名: LED数码 电子钟
//***********************************
//
// 软件版本:V1.0.3
//
//
//***********************************
#include
#include
#define uchar unsigned char
void delay (void);
start_time ();
key_adjust ();
void alarm (void);
time_end (void);
// k1调秒 k2调分 K3调时
sbit k0=P1^0; // 电子时钟 START/STOP 键
sbit k1=P1^1; //调时
sbit k2=P1^2; //调分
sbit k3=P1^3; //调秒
sbit beep=P2^1; //蜂鸣器
bit on_off;
uchar code LOAD[8]={0xff,0xff,0xc7,0xc0,0x88,0xa1,0xff,0xff};//显示LOAD字样数据
uchar code LED_DATA[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //0~9数字数据
uchar data DATA_TEMP[8]; //显示缓存区
uchar data digit; //移位变量(动态扫描时选通)
static uchar data t,k,i;
static char data sec,min,hour;
int f,h,j;
char d;
main ()
{
TMOD=0X01; //定时器0
ET0=1; //开定时器0中断
EA=1; //开总中断
TH0=0XFC; //定时器0 定时1ms
TL0=0X18;
TR0=1; //启动定时器
RCAP2H=0X3C; //定时器2 定时50ms
RCAP2L=0XAD;
ET2=1;
digit=0xfe;
P3=0XFF; //关闭显示
d=0;
on_off=1;
//***************开机显示 LOAD *************
while (d<8)
{
DATA_TEMP[d]=LOAD[d];
d++;
}
for (h=600;h>0;h--) //开机后显示LOAD延时
{
for (j=500;j>0;j--);
}
TR2=1;//开始倒时时
//*****************************************
//******对时钟进行初始化赋值*******
hour=12;
min=0;
sec=0;
//********时间:00-00-00 *****************
start_time (); //调用调时间函数,使之对时钟进行初始化赋值
DATA_TEMP[2]=0XBF; //使之LED显示格式为xx-xx-xx
DATA_TEMP[5]=0XBF;
while (1) // 总循环
{
key_adjust ();
//*********************时钟走时部分******************
if (k0==0)
{
delay ();
while (k0==0);//等待按键释放
on_off=~on_off; //做标记,用于判断K0键状态(是继续还是暂停计数器)
if (on_off==0) TR2=0;
else TR2=1;
}
while (t==20) //到1 秒了吗?
{
t=0;
sec++;
if (sec>59) //到1 分钟了吗?
{
sec=0;
min++;
if (min>59) //到1 小时了吗?
{
min=0;
hour++;
if (hour>23) hour=0;
DATA_TEMP[1]=LED_DATA[hour%10];
if (LED_DATA[hour%10]==0) DATA_TEMP[1]=0xFF;
DATA_TEMP[0]=LED_DATA[hour/10];
}
DATA_TEMP[4]=LED_DATA[min%10];
if (LED_DATA[min%10]==0) DATA_TEMP[1]=0xFF;
DATA_TEMP[3]=LED_DATA[min/10];
}
DATA_TEMP[7]=LED_DATA[sec%10];
if (LED_DATA[sec%10]==0) DATA_TEMP[1]=0XFF;
DATA_TEMP[6]=LED_DATA[sec/10];
}
while ((hour==8)&&(min==0)&&(sec==0)) //设置闹钟
{
time_end();
}
}
//**************************************************
}
void displayscanf (void) interrupt 1 //定时器0中断服务程序,用于数码管动态显示扫描
{
TH0=0XFC;
TL0=0X18;
P0=DATA_TEMP[i];
i++;
P3=digit;
digit=_crol_(digit,1); //动态显示时,依次选通数码管
if (i>7) //扫描完一圈后,回到第一位,准备下一次扫描
{
i=0;
digit=0xfe;
}
}
void timer_server (void) interrupt 5 //时钟走时定时
{
TF2=0;
t++;
}
start_time () //对时间初始化赋值,并更新DATA_TEMP数组里的数据
{
DATA_TEMP[1]=LED_DATA[hour%10];
DATA_TEMP[0]=LED_DATA[hour/10];
DATA_TEMP[4]=LED_DATA[min%10];
DATA_TEMP[3]=LED_DATA[min/10];
DATA_TEMP[7]=LED_DATA[sec%10];
DATA_TEMP[6]=LED_DATA[sec/10];
}
key_adjust() //调时函数
{
if (k1==0) //调时
{
ET2=0;
delay ();
if (k1==0)
{
hour++;
if (hour>23) hour=0;
while (k1!=1); //等待按键释放,使每按一次,小时自动+1
delay ();
ET2=1;
start_time ();
}
}
if (k2==0) //调分
{
ET2=0;
delay ();
if (k2==0)
{
min++;
if (min>59) min=0;
while (k2!=1); //等待按键释放,使每按一次,分钟自动+1
delay ();
ET2=1;
start_time ();
}
}
if (k3==0) //调秒
{
ET2=0;
delay ();
if (k3==0)
{
sec++;
if (sec>59) sec=0;
while (k3!=1); //等待按键释放,使每按一次,秒数自动+1
delay ();
ET2=1;
start_time ();
}
}
}
void delay (void) //延时,防止键抖动
{
unsigned char data x,y;
for (x=0;x<=30;x++)
{
for (y=0;y<=130;y++)
{}
}
}
void alarm (void) //报警函数
{
for (f=0;f<=3000;f++);
beep=~beep;
}
time_end (void) //判断计时器是倒数是否数完(为0),如果是则停止计时,并报警
{
alarm();
}
上一篇:1602液晶最新驱动程序
下一篇:数码管滚动显示数字...(C程序)
推荐阅读最新更新时间:2024-03-16 15:16
设计资源 培训 开发板 精华推荐
- 【EEWORLD第二十五届】2011年04月社区明星人物揭晓!
- 任性DIY,在这等你来!
- 1月22日下午14:00Mouser携手Maxim邀您观看有奖直播:深入浅出可穿戴健康监测
- 和风暖阳,我与春天有个约会!
- ADI有奖下载活动之19:ADI可编程逻辑控制器(PLC)解决方案(更新版)
- TI首届低功耗设计大赛之玩转MSP430 FRAM MCU
- 【MPS有奖分享】便携式多功能电工台的核“芯”功能测试与结构设计
- 免费申请评测:和小伙伴们一起畅玩STM32F769I
- 注册有礼 | 施耐德电器邀请您参加EP23上海国际电力电工展线上云逛展
- 25美分实现25种功能的TI MSP430铁电超值微控制器方案即将直播!快来报名围观!