|
本帖最后由 呜哈哈 于 2014-3-20 00:35 编辑
#include"reg51.h"
sbit P1_4=P1^4;//调整时间 +1
code unsigned char ledbyte[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0。。。。。9
code unsigned char led[7]={0x07,0x06,0x05,0x04,0x03,0x02,0x01};//第一个数码管......第7个数码管
unsigned char m; //秒
unsigned char s; //分
unsigned char h; //小时
unsigned char sm;//扫描数码管的时间
unsigned char w; //星期
unsigned char t; //250t=1s
unsigned char a; //选择 秒 分 或小时
/***************
延时
****************/
void delay(unsigned char b)
{unsigned char c;
while(--b)
for(c=0;c>120;c++);
}
/********************
正常显示时间
***************/
void xianshi(void)
{
switch(sm)
{case 0:
P0=ledbyte[m%10];
P1=led[0];
case 1:
P0=ledbyte[m%100/10];
P1=led[1];
case 2:
P0=ledbyte[s%10]|0x80;
P1=led[2];
case 3:
P0=ledbyte[s%100/10];
P1=led[3];
case 4:
P0=ledbyte[h%10]|0x80;
P1=led[4];
case 5:
P0=ledbyte[h%100/10];
P1=led[5];
case 6:
P0=ledbyte[w]|0x80;
P1=led[6];
}
}
/*******************
调时
**********************/
void ts(unsigned char k,p,q)
{
switch(sm)
{case 1,2,3:
P0=ledbyte[k%10]|0x80;
P1=led[p];
case 4,5,6:
P0=ledbyte[k%100/10];
P1=led[q];
}
if(P1_4==0)
{delay(20);
if(P1_4==0)
k++;
}
}
/*****
主函数
******/
void main(void)
{
TMOD=0x01;
EA=1;
TR0=1;
ET0=0x01;
TH0=(65536-4000)/256;
TL0=(65536-4000)%256;
P1_4=1;
P3=0xff;
IT1=1;
EX1=1;
while(1)
{
switch(a)
{case 0:
{xianshi();
if(t>255)
{t=0;
m++;
}
if(m>60)
{m=0;
s++;
}
if(s>24)
{s=0;
w++;
}
if(w>7)
w=1;
}
case 1:
{
ts(m,0,1);
if(m>59)
m=0;
}
case 2:
{
ts(s,2,3);
if(s>59)
s=0;
}
case 3:
{
ts(h,4,5);
if(h>23)
h=0;
}
case 4:
{
if(P1_4==0)
{delay(20);
if(P1_4==0)
w++;}
P0=ledbyte[w];
P1=led[6]|0x80;
if(w>7)
w=0;
}
}
}
}
/**************
定时器0中断
*****/
void timer0(void) interrupt 1
{
TH0=(65536-4000)/256;
TL0=(65536-4000)%256;
sm++;
t++;
if(sm>6)
sm=0;
if(t>249)
{t=0;
s++;
}
}
/*******
外部中断 按键中断a+1
*******/
void ExInt1IRQ(void) interrupt 2
{delay(50);
a++;
if(a>4)
a=0;
} |
|