利用单片机的定时器,中断可通过按键+或-时间的分、时,比分通过按键扫描函数实现+或-,这些LCD1602显示都够了,报警的话可设置成定时或者按键人工控制警告,用蜂鸣器,例如24s或者8s为例等。
以上能够简单实现功能了,这东西具体我也没完整做过,方案是没问题,具体还是自己动手,找到相关函数,整合下就好了。功能加强的话要好点的单片机,需要显示多的话上LCD。git什么的没注册,也没放代码,我相信常用的驱动函数你还是有的。
贴一个51按键控制时,分,1602显示的工程,里面有些函数可以直接用了。
void delayms(uchar ms)
{
uchar i;
while(ms--)
for(i=0;i<123;i++);
}
void w_com(uchar com)
{
RS = 0;
RW = 0;
E = 1;
P0= com;
E = 0;
delayms(1);
}
void w_dat(uchar dat)
{
RS = 1;
RW = 0;
E = 1;
P0= dat;
E = 0;
delayms(1);
}
void lcd_ini( void )
{
delayms(10);
w_com(0x38); //功能设置:8位口,2行,5*7点阵
delayms(10);
w_com(0x0c); //显示设置:开显示,关光标,无闪烁
delayms(10);
w_com(0x06); //输入模式:右移一格,地址加1
delayms(10);
w_com(0x01); //清显示
delayms(10);
w_com(0x38); //功能设置:8位口,2行,5*7点阵
delayms(10);
}
void s1_fun(void)
{
hour=hour++;
if(hour==24)
hour=0;
}
void s2_fun(void)
{
hour--;
if(hour==255)
hour=23;
}
void s3_fun(void)
{
min++;
if(min==60)
min=0;
}
void s4_fun(void)
{
min--;
if(min==255)
min=59;
}
void key(void)
{
static bit kp=0;
if((P3&0X0F)!=0X0F)
{ delayms(10);
if(((P3&0X0F)!=0X0F)&&(kp==0))
{
kp=1;
if((P3&0X0F)==0X0E)s1_fun();
if((P3&0X0F)==0X0D)s2_fun();
if((P3&0X0F)==0X0B)s3_fun();
if((P3&0X0F)==0X07)s4_fun();
}
}
else kp=0;
}
void main(void)
{
TMOD|=0X10;
TH1=15536/256; TL1=15536%256;
TR1=1; EA=1; ET1=1;
lcd_ini();
while(1)
{
key();
w_com(0x84);
w_dat(hour/10+48);
w_dat(hour%10+48);
if(flag==0)
w_dat(':');
else
w_dat(' ');
w_dat(min/10+48);
w_dat(min%10+48);
if(flag==0)
w_dat(':');
else
w_dat(' ');
w_dat(sec/10+48);
w_dat(sec%10+48);
}
}
void t1_int(void) interrupt 3
{
TH1=15536/256; TL1=15536%256;
++t1_counter;
if((t1_counter==10)||(t1_counter==20))flag=~flag;
if(t1_counter==20)
{
t1_counter=0;
if(++sec==60)
{
sec=0;
if(++min==60)
{
min=0;
if(++hour==24)hour=0;
}
}
}
}