用单片机写一个C语言程序关于电子时钟,用键盘调制时分秒的加减 第一个键控制模式,第二个为加,第三个减 20
1个回答
展开全部
我给你一个保证好用的,KEY_COM调模式,按一下进入调时 ,在按一下调分,再按一下退出调时模式,这时加减按键都无效,在调时模式时会产生闪烁方式,这段程序是我自己想的办法实现的,可能有点笨拙,但效果很好,我建议你用DS1302做时钟,用单片机计数器由于晶振等原因会有很大的误差,实际中没有用直接用单片机做的,希望对你有帮助。
(段选和位选接的都是8位的D触发器,如果你的开发板电路结构有区别,改一下显示部分的程序就行了)
#include<reg51.h>
#define uchar unsigned char
sbit duan=P0^0;
sbit wei=P0^1;
sbit KEY_ADD=P3^3;
sbit KEY_DEC=P3^4;
sbit KEY_COM=P3^5;
uchar code a[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40, 0x00 };
char hour=0,minute=0,second=0,i=0,flag=0;
unsigned char t=0,t1=0,t2=0,t3=0;
unsigned int count=0;
void delays()//10ms延时子程序
{unsigned char i,j;
for(i=20;i>0;i--)
for(j=248;j>0;j--);
}
void start()
{
TMOD=0x01;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
ET0=1;
EA=1;
TR0=1;
}
void main()
{
start();
KEY_ADD=1;
KEY_DEC=1;
KEY_COM=1;
while(1){
if(!KEY_COM)
{
delays();
if(!KEY_COM)
{while(!KEY_COM);
flag++;if(flag==3)flag=0;
}
}
if(!KEY_ADD)
{
delays();
if(!KEY_ADD)
{
while(!KEY_ADD);
if(flag==1)
{hour++;if(hour==24)hour=0;}
if (flag==2)
{minute++;if(minute==60)minute=0;}
}
}
if(!KEY_DEC)
{
delays();
if(!KEY_DEC)
{while(!KEY_DEC);
if(flag==1)
{hour--;if(hour<0)hour=23;}
if(flag==2)
{minute--;if(minute<0)minute=59;}
}
}
}
}
void t0() interrupt 1
{
TH0=(65536-2000)/256;
TL0=(65536-2000)%256;
count++;
switch(i)
{case 0: {if(flag==1){t++;if(t==60)t=0; if(t<30) {P1=a[hour/10];duan=1;duan=0;P1=~0x01;wei=1;wei=0;}
else {P1=0x00;duan=1;duan=0;P1=~0x01;wei=1;wei=0;} } else {P1=a[hour/10];duan=1;duan=0;P1=~0x01;wei=1;wei=0;} } break;
case 1: {if(flag==1) {t1++;if(t1==60)t1=0; if(t1<30) {P1=a[hour%10];duan=1;duan=0;P1=~0x02;wei=1;wei=0;}
else {P1=0x00;duan=1;duan=0;P1=~0x01;wei=1;wei=0;} } else {P1=a[hour%10];duan=1;duan=0;P1=~0x02;wei=1;wei=0;} } break;
case 2:{P1=0x40;duan=1;duan=0;P1=~0x04;wei=1;wei=0;}break;
case 3: {if(flag==2) {t2++;if(t2==60)t2=0; if(t2<30) {P1=a[minute/10];duan=1;duan=0;P1=~0x08;wei=1;wei=0;}
else {P1=0x00;duan=1;duan=0;P1=~0x01;wei=1;wei=0;} } else {P1=a[minute/10];duan=1;duan=0;P1=~0x08;wei=1;wei=0;} } break;
case 4: {if(flag==2) {t3++;if(t3==60)t3=0; if(t3<30) {P1=a[minute%10];duan=1;duan=0;P1=~0x10;wei=1;wei=0;}
else {P1=0x00;duan=1;duan=0;P1=~0x01;wei=1;wei=0;} } else {P1=a[minute%10];duan=1;duan=0;P1=~0x10;wei=1;wei=0;} } break;
case 5:{P1=0x40;duan=1;duan=0;P1=~0x20;wei=1;wei=0;}break;
case 6:{P1=a[second/10];duan=1;duan=0;P1=~0x40;wei=1;wei=0;}break;
case 7:{P1=a[second%10];duan=1;duan=0;P1=~0x80;wei=1;wei=0;}break;
}
i++;
if(i==8)i=0;
if(count==500)
{count=0;
second++;
if(second==60)
{second=0;
minute++;
if(minute==60)
{minute=0;
hour++;
if(hour==24)
{
hour=0;
}
}
}
}
}
(段选和位选接的都是8位的D触发器,如果你的开发板电路结构有区别,改一下显示部分的程序就行了)
#include<reg51.h>
#define uchar unsigned char
sbit duan=P0^0;
sbit wei=P0^1;
sbit KEY_ADD=P3^3;
sbit KEY_DEC=P3^4;
sbit KEY_COM=P3^5;
uchar code a[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40, 0x00 };
char hour=0,minute=0,second=0,i=0,flag=0;
unsigned char t=0,t1=0,t2=0,t3=0;
unsigned int count=0;
void delays()//10ms延时子程序
{unsigned char i,j;
for(i=20;i>0;i--)
for(j=248;j>0;j--);
}
void start()
{
TMOD=0x01;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
ET0=1;
EA=1;
TR0=1;
}
void main()
{
start();
KEY_ADD=1;
KEY_DEC=1;
KEY_COM=1;
while(1){
if(!KEY_COM)
{
delays();
if(!KEY_COM)
{while(!KEY_COM);
flag++;if(flag==3)flag=0;
}
}
if(!KEY_ADD)
{
delays();
if(!KEY_ADD)
{
while(!KEY_ADD);
if(flag==1)
{hour++;if(hour==24)hour=0;}
if (flag==2)
{minute++;if(minute==60)minute=0;}
}
}
if(!KEY_DEC)
{
delays();
if(!KEY_DEC)
{while(!KEY_DEC);
if(flag==1)
{hour--;if(hour<0)hour=23;}
if(flag==2)
{minute--;if(minute<0)minute=59;}
}
}
}
}
void t0() interrupt 1
{
TH0=(65536-2000)/256;
TL0=(65536-2000)%256;
count++;
switch(i)
{case 0: {if(flag==1){t++;if(t==60)t=0; if(t<30) {P1=a[hour/10];duan=1;duan=0;P1=~0x01;wei=1;wei=0;}
else {P1=0x00;duan=1;duan=0;P1=~0x01;wei=1;wei=0;} } else {P1=a[hour/10];duan=1;duan=0;P1=~0x01;wei=1;wei=0;} } break;
case 1: {if(flag==1) {t1++;if(t1==60)t1=0; if(t1<30) {P1=a[hour%10];duan=1;duan=0;P1=~0x02;wei=1;wei=0;}
else {P1=0x00;duan=1;duan=0;P1=~0x01;wei=1;wei=0;} } else {P1=a[hour%10];duan=1;duan=0;P1=~0x02;wei=1;wei=0;} } break;
case 2:{P1=0x40;duan=1;duan=0;P1=~0x04;wei=1;wei=0;}break;
case 3: {if(flag==2) {t2++;if(t2==60)t2=0; if(t2<30) {P1=a[minute/10];duan=1;duan=0;P1=~0x08;wei=1;wei=0;}
else {P1=0x00;duan=1;duan=0;P1=~0x01;wei=1;wei=0;} } else {P1=a[minute/10];duan=1;duan=0;P1=~0x08;wei=1;wei=0;} } break;
case 4: {if(flag==2) {t3++;if(t3==60)t3=0; if(t3<30) {P1=a[minute%10];duan=1;duan=0;P1=~0x10;wei=1;wei=0;}
else {P1=0x00;duan=1;duan=0;P1=~0x01;wei=1;wei=0;} } else {P1=a[minute%10];duan=1;duan=0;P1=~0x10;wei=1;wei=0;} } break;
case 5:{P1=0x40;duan=1;duan=0;P1=~0x20;wei=1;wei=0;}break;
case 6:{P1=a[second/10];duan=1;duan=0;P1=~0x40;wei=1;wei=0;}break;
case 7:{P1=a[second%10];duan=1;duan=0;P1=~0x80;wei=1;wei=0;}break;
}
i++;
if(i==8)i=0;
if(count==500)
{count=0;
second++;
if(second==60)
{second=0;
minute++;
if(minute==60)
{minute=0;
hour++;
if(hour==24)
{
hour=0;
}
}
}
}
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询