求一个单片机控制时钟的程序,要求一个键切换,其余两个键分别对切换好的时间进行+1或减一的操作。

之所以+1或-1是为了能够调时间,这是一个难题啊,我试了好久都没有试好啊!

// K1为时间调整按键,按一下调整小时相应位闪动,依次调整分钟,秒钟,按4下则回到正常显示模式
// K2为相应位加1
// K3为相应位减1

#include <reg51.h>

#define ys 180
#define led_dat P0
#define led P2

unsigned char code dis_xs[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //显示缓冲区
unsigned char time[3]={12,30,0}; //时间数据
unsigned char cont_set=0,cont_sec=0; //调整时间位以及闪动时间
unsigned int cont_num;
bit flag; //半秒闪动
sbit set=P1^4; //k1
sbit up=P1^5; //k2
sbit down=P1^6; //k3
sbit xsd=P0^7; //小数点

void delay(unsigned int num) //延时程序
{
while(--num);
}

void hand_time(void) //时间调整 //时间数据调整
{
if(time[2]==60) {time[1]++;time[2]=0;}
else if (time[2]>60) time[2]=59;
if(time[1]==60) {time[0]++;time[1]=0;}
else if (time[1]>60) time[1]=59;
if(time[0]==24) time[0]=0;
else if(time[0]>24) time[0]=23;
}

void dis_time(void) //时间显示 //显示时间子函数
{
if((time[0]<10)||(flag&&(cont_set==1))) {led=0xff;delay(ys);}
else {led_dat=dis_xs[time[0]/10];led=0xdf;delay(ys);}
if(flag&&(cont_set==1)) {led=0xff;delay(ys);}
else {led_dat=dis_xs[time[0]%10];xsd=flag;led=0xef;delay(ys);}
if(flag&&(cont_set==2)) {led=0xff;delay(ys);}
else {led_dat=dis_xs[time[1]/10];led=0xf7;delay(ys);}
if(flag&&(cont_set==2)) {led=0xff;delay(ys);}
else {led_dat=dis_xs[B];xsd=flag;led=0xfb;delay(ys);}
if(flag&&(cont_set==3)) {led=0xff;delay(ys);}
else {led_dat=dis_xs[time[2]/10];led=0xfd;delay(ys);}
if(flag&&(cont_set==3)) {led=0xff;delay(ys);}
else {led_dat=dis_xs[B];led=0xfe;delay(ys);}
hand_time();
}

check_key(unsigned char i) //键盘扫描 //扫描按键按下及时间调整
{
if(!up)
{
delay(500);
if(!up)
{
while(!up) dis_time();
time[i]++;
cont_sec=0;
if(time[0]==24) time[0]=0;
if(time[1]==60) time[1]=0;
if(i==2) time[2]=0;
}
}
if(!down)
{
delay(500);
if(!down)
{
while(!down) dis_time();
time[i]--;
cont_sec=0;
if(time[0]>24) time[0]=23;
if(time[1]>60) time[1]=59;
if(i==2) time[2]=0;
}
}
if(!set)
{
delay(500);
if(!set)
{
while(!set) dis_time();
cont_set++;
cont_sec=0;
}
}
}

void scan_key(void)
{
dis_time();
if(!set)
{
delay(500);
if(!set)
{
while(!set) dis_time();
cont_sec=0;
cont_set=1;
while(cont_sec<10&&cont_set<4)
{
dis_time();
if(cont_set==1) check_key(0);
if(cont_set==2) check_key(1);
if(cont_set==3) check_key(2);
}
cont_set=0;
}
}
}

void timer0() interrupt 1 using 2 //中断服务程序
{
if(++cont_num==3949) {time[2]++;cont_num=0;cont_sec++;}
if(cont_num<2000) flag=0;
else flag=1;
}

main()
{
IE=0x82; //定时器T0中断初始化,采用工作方式2
TMOD=0x02;
TH0=0x27; //定时器初值为6
TL0=0x27;
TR0=1;
while(1)
scan_key();
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2017-10-16
可以用proteus仿真
懂事电子设计 Vgz
第2个回答  2011-06-28
请问直接用单片机写 还是用到时钟芯片
相似回答