|
本时钟用stc15w 系列和74hc04 加 3 个按键,实现了调整时间,定时,秒倒计时,速度 4个功能
下面是c 程序
#include <REG51.H>
#define USEC_SYS_CYCLE 2
#include "keybd.h"
#define uchar unsigned char
#define uint unsigned int
#define DSP_DOT 0xfb
#define DSP_NEG 0xfe
#define DOT 0x04
#define ST_CLOCK 0
#define ST_APPOINT 1
#define ST_CNTDWN 2
#define ST_SPEED 3
#define DSPLAY_P P3
unsigned char code DSPLAY[]={0x05,0x7D,0x46,0x54,0x3C,0x94,0x84,0x5D,
0x04,0x14,0x0C,0xA4,0x87,0x64,0x86,0x8E}; //0-f
#define up_hour(h) hour10= h/10;\
hour1= h%10
#define up_minute(m) minute10= m/10;\
minute1= m%10
#define up_speed hour10= 0xff;\
if(speed< 0) \
hour1= DSP_NEG;\
else \
hour1= 0xff;\
minute10= DSPLAY[speed/10];\
minute1=DSPLAY[speed%10]
uchar msec50= 0; //50 milisecond
uchar hour= 1, minute= 20;
uchar secs=0;
uchar app_hour=0, app_minute= 0;
uchar dwn_minute= 0, dwn_sec= 0;
char hour1,hour10;
char minute1,minute10;
char speed= 0;
char state= 0;
// the led display 0
sbit com_h10= P1^3; //the common of led bit
sbit com_h1= P1^0;
sbit com_m10= P1^1;
sbit com_m1= P1^2;
sbit btn_set= P1^7; //the set button
sbit btn_hup= P1^5; //the hour up button
sbit btn_mup= P1^6; //the minute up button
sbit p_sound= P1^4;
char abs(char x)
{
return (x<0 ? -x: x);
}
void tm0_inter() interrupt 1
{
TH0= 0x5b;
TL0= 0x70+ speed;
msec50++;
//every 0.5 sec inteval the second DOT
if( msec50> 10)
{
msec50 = 0;
secs++;
if(state== ST_CLOCK)
{
minute10^= DOT;
minute1^= DOT;
}
if(secs> 18)
{
minute++;
secs= 0;
if(minute> 59)
{
minute= 0;
hour++;
hour%= 24;
}
if(state== ST_CLOCK)
{
up_hour(hour);
up_minute(minute);
}
}
}
else
{
}
}
void main()
{
TMOD= 0x01; //set timer state,
TH0= 0x5b; //set counter init value: 65536- 50000us
TL0= 0xf4; //slow old is ed,fast old f8
ET0= 1; //enable interrupt fot timer 0.
EA= 1;
TR0= 1; //timer 0 run;
up_hour(hour);
up_minute(minute);
while(1)
{
DSPLAY_P= DSPLAY[hour10];
com_h10 = 1;
msDelay(4);
com_h10 = 0;
DSPLAY_P= DSPLAY[hour1];
com_h1 = 1;
msDelay(4);
com_h1 = 0;
DSPLAY_P= DSPLAY[minute10];
com_m10 = 1;
msDelay(4);
com_m10 = 0;
DSPLAY_P= DSPLAY[minute1];
com_m1 = 1;
msDelay(4);
com_m1 = 0;
//the button set pressed
KeyPress(btn_set,{
switch (state)
{
case ST_CLOCK:
{
up_hour(hour);
up_minute(minute);
state= ST_APPOINT;
break;
}
case ST_APPOINT:
{
up_hour(app_hour);
up_minute(app_minute);
state= ST_CNTDWN;
break;
}
case ST_CNTDWN:
{
up_hour(dwn_minute);
up_minute(dwn_sec);
if(dwn_minute && dwn_sec)
{
break;
}
else
{
state= ST_SPEED;
}
break;
}
case ST_SPEED:
{
up_speed;
state= ST_CLOCK;
break;
}
default:
state= ST_CLOCK;
up_hour(hour);
up_minute(minute);
break;
}
});
//the button hour up pressed
KeyPress(btn_hup,{
switch (state)
{
case ST_CLOCK:
{
hour++;
if(hour> 23)
hour= 0;
up_hour(hour);
break;
}
case ST_APPOINT:
{
app_hour++;
if(app_hour> 23)
app_hour= 0;
up_hour(app_hour);
break;
}
case ST_SPEED:
{
speed++;
if(speed> 60)
speed= 0;
break;
}
case ST_CNTDWN:
{
dwn_minute++;
if(dwn_minute> 59)
dwn_minute= 0;
break;
}
default:
break;
}
});
//the button minute up pressed
KeyPress(btn_mup,{
switch (state)
{
case ST_CLOCK:
{
minute++;
if(minute> 59)
minute= 0;
up_minute(minute);
break;
}
case ST_APPOINT:
{
app_minute++;
if(app_minute> 59)
app_minute= 0;
up_minute(app_minute);
break;
}
case ST_SPEED:
{
speed--;
if(speed< -60)
speed= 0;
break;
}
case ST_CNTDWN:
{
dwn_sec++;
if(dwn_sec> 59 )
dwn_sec= 0;
break;
}
default:
break;
}
});
}
}
|
评分
-
查看全部评分
|