// K1为时间调整按键,按一下调整小时相应位闪动,依次调整分钟,秒钟,按4下则回到正常显示模式
// K2为相应位加1
// K3为相应位减1
#include <reg51h>
#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 可以通过“设置”功能将轮钟改为点钟
2 在电脑上打开时钟应用程序,点击“设置”选项,找到“时间格式”或“时钟类型”等选项,选择“点钟”即可将时间格式从轮钟改为点钟。
3 如果您使用的是不同的 *** 作系统或不同的时钟应用程序,可能需要在不同的位置进行设置,但基本上都可以通过“设置”功能进行修改。
把按键检测,和执行按键功能,分开。
参考如下程序:
void main(){
mm = 0, kk = 0;
while(1) {
kk = keyscan(); //返回0、1、2、3
if(kk == 0) display(shi, fen, miao); //没有按就正常走时
if(kk == 1) {mm++; if(mm == 4) mm = 0;} //改变项目
if(kk == 2) {
switch(mm) {
case 1 : if(miao < 59) miao++; break;
case 2 : if(fen < 59) fen++; break;
case 3 : if(shi < 23) shi++; break;
}
}
if(kk == 3) {
switch(mm) {
case 1 : //相应项目--; break;
case 2 : //相应项目--; break;
case 3 : //相应项目--; break;
}
}
}
}
以上就是关于求一个单片机控制时钟的程序,要求一个键切换,其余两个键分别对切换好的时间进行+1或减一的 *** 作。全部的内容,包括:求一个单片机控制时钟的程序,要求一个键切换,其余两个键分别对切换好的时间进行+1或减一的 *** 作。、电脑从那个软件把轮钟改点钟、求助一单片机程序,可通过键盘设置时钟和闹钟等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)