#include<AT89X051.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit sda=P3^1
sbit scl=P3^0
sbit key1=P1^7
sbit key2=P1^6
sbit key3=P1^5
sbit kz=P3^5
sbit bs=P3^4
char shi=12,fen=12,ke1,mm,mi,nh,nf,mn,mms,baos,a
bit ms,nt,b
uchar code SEG8[]={ 0x50,0x5F,0x94,0x15,0x1B,
0x31,0x30,0x57,0x10,0x11,
0x40,0x4F,0x84,0x05,0x0B,
0x21,0x20,0x47,0x00,0x01,
0x21,0xa2,0x52,0xff}
//0-9,0.-9.s.,f.,n 暗
void delay1ms(uchar ms)
{
uchar i
while(ms--)
{
for(i = 0i<250i++)
{
_nop_()
_nop_()
_nop_()
_nop_()
}
}
}
void display(char numh,char numf)
{
uchar qian,bai,sh,ge
if(ke1==1)
qian=20
else if(ke1==2)
qian=21
else if((ke1==3)||(ke1==4))
qian=22
else if(ke1==0)
qian=numh/10
if((ke1==1)||(ke1==2))
bai=23
else if(ke1==3)
bai=20
else if(ke1==4)
bai=21
else if(ke1==0)
{
bai=numh%10
if(ms)
bai=bai+10
}
if((ke1==1)||(ke1==3))
{sh=numh/10ge=numh%10}
else if((ke1==2)||(ke1==4)||(ke1==0))
{sh=numf/10ge=numf%10}
P1=SEG8[qian]
P3_3=0delay1ms(2)P3_3=1
P1=SEG8[bai]
P3_7=0delay1ms(2)P3_7=1
P1=SEG8[sh]
P3_2=0delay1ms(2)P3_2=1
P1=SEG8[ge]
P3_0=0delay1ms(2)P3_0=1
}
///////////x24c02//////////////////
void delay24()
{ }
void init24c02() //初始化
{
sda=1
delay24()
scl=1
delay24()
}
void start2() //开始信号
{
sda=1
delay24()
scl=1
delay24()
sda=0
delay24()
}
void stop() //停止
{
sda=0
delay24()
scl=1
delay24()
sda=1
delay24()
}
void respons() //应答
{
uchar i
scl=1
delay24()
while((sda==1)&&(i<250))i++
scl=0
delay24()
}
void write_byte(char date) // 写数据子函数
{
uchar i,temp
temp=date
for(i=0i<8i++)
{
temp=temp<<1
scl=0
delay24()
sda=CY
delay24()
scl=1
delay24()
}
scl=0
delay24()
sda=1
delay24()
}
uchar read_byte() // 读数据子函数
{
uchar i,k
scl=0
delay24()
sda=1
delay24()
for(i=0i<8i++)
{
scl=1
delay24()
k=(k<<1)|sda
scl=0
delay24()
}
return k
}
///////写数据函数///////////////////
void write_add(uchar address,char date)
{
start2()
write_byte(0xa0)
respons()
write_byte(address)
respons()
write_byte(date)
respons()
stop()
}
char read_add(uchar address) //读数据函数
{
uchar date
start2()
write_byte(0xa0)
respons()
write_byte(address)
respons()
start2()
write_byte(0xa1)
respons()
date=read_byte()
stop()
return date
}
void keyf(char *con,char up,char don)
{
uint i
for(i=0i<800i++)
{
if((ke1==1)||(ke1==2))
display(shi,fen)
else if((ke1==3)||(ke1==4))
display(nh,nf)
P1=0xff
if(key1==0)
{
delay1ms(10)
if(key1==0)
{
ke1++
if(ke1>=5)
ke1=0
while(!key1)
break
}
}
if(key2==0)
{
delay1ms(10)
if(key2==0)
{
i=0
*con+=1
if(*con>up)
*con=0
while(!key2)
}
}
if(key3==0)
{
delay1ms(10)
if(key3==0)
{
i=0
*con-=1
if(*con<don)
*con=up
while(!key3)
}
}
}
}
void key()
{
P1=0xff
if(key1==0)
{
EA=0
delay1ms(20)
if(key1==0)
{
ke1++
if(ke1>=5)
ke1=0
while(!key1)
}
if(ke1==1)
{
keyf(&shi,23,0)
}
if(ke1==2)
{
keyf(&fen,59,0)
}
if(ke1==3)
{
keyf(&nh,23,0)
}
if(ke1==4)
{
keyf(&nf,59,0)
}
P1=0xffP3=0xff
write_add(0x01,nh)
delay1ms(5)
write_add(0x03,nf)
ke1=0
EA=1
}
}
void Timer0Init(void)
{
TMOD |= 0x01
TL0 = 0xB0
TH0 = 0x3C
TF0 = 0
TR0 = 1
EA=1
ET0=1
}
void main()
{
P1=0xff
P3=0xff
init24c02()
nh=read_add(0x01)
delay1ms(50)
nf=read_add(0x03)
delay1ms(50)
Timer0Init()
while(1)
{
key()
display(shi,fen)
}
}
void tim0 ()interrupt 1
{
TH0=0X3C
TL0=0XB0
if(++mms>=10)
{
mms=0
ms=!ms
}
if(++mm>=20)
{
mm=0
if(++mi>=60)
{
mi=0
if(++fen>=60)
{
fen=0
if(++shi>=24)
shi=0
}
}
}
if(fen==0)
{
if((shi>=7)&&(shi<=20))
{
if((baos==0)&&(b==0))
{
baos=shi
baos=baos*2
b=1
}
if(++a==10)
{
a=0
if(--baos!=0)
{
bs=!bs
}
else
{
bs=1
}
}
}
}
else
b=0
if(nh==shi)
{
if(nf==fen)
{
if(nt==0)
{
P1=0xff
if(++mn==10)
{
mn=0
kz=!kz
}
if(key3==0)
{
nt=1
kz=1
}
}
}
else
{
nt=0
kz=1
}
}
}
显示格式为“时时分分”。由分位闪动来做秒计数表示。一旦时间到则发出声响。
程序执行后工作指示灯LED闪动,表示程序开始执行,显示器显示“0000”,按下 *** 作键K1~K4动作如下:
(1) K1—设置现在的时间。
(2) K2—显示闹钟设置的时间。
(3) K3—设置闹铃的时间。
(4) K4—闹铃ON/OFF的状态设置,设置为ON时连续三次发出“哗”的一声,设置为OFF发出“哗”的一声。
设置当前时间或闹铃时间如下。
(1) K1—时调整。
(2) K2—分调整。
(3) K3—设置完成。
(4) K4—闹铃时间到时,发出一阵声响,按下本键可以停止声响。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)