📄 led_clock.c
字号:
/***************************************************************************************
author : aishinimi6
mail :aishinimi6@sina.com
qq:51606603
qq group:46068076
****************************************************************************************/
#include<at89x52.h>
#include<intrins.h>
#define speaker P3_7
#define PRE P3_4
#define SET P3_5
#define dat P0
unsigned char flag,currentkey,previouskey;
unsigned char scankey();
void keyproc();
//unsigned char code select[]={0XFE,0XFD,0XFB,0XF7,0XEF,0XDF,0xBF,0X7F};//for PNP transistor
unsigned char code select[]={0X01,0X02,0X04,0X08,0X10,0X20};//for NPN transistor
unsigned char code disp[]={
0xc0,0xF9,0xA4,0xB0,0x99,//0-4
0x92,0x82,0xF8,0x80,0x90,//5-9
0x88,0x90,0xC6,0xC7,0x86,0x8E//A,b,C,L,E,F
};
unsigned char dispbuf[6]={0,0,0,0,0,0};
unsigned char second,minute,hour;
unsigned char sel;
void delay(void);
void delay1ms(unsigned char n);
unsigned char second100;
unsigned char alarmhour,alarmminute,alarmsecond;
bit alarm;
unsigned int change;
void main()
{
second=50;
minute=59;
hour=17;
second100=0;
alarmhour=6;
alarmminute=10;
alarmsecond=0;
alarm=1;
speaker=0;
change=0;
IE=0X8F;
IP=0X01;
IT0=0;
IT1=0;
TMOD=0X11;
TH0=0XD8;
TL0=0Xf4;//adjust the time to be correct,maybe the crystal is not so good
/*
TH0=D8;
TL0=0XF0;
12MHZ CRYSTAL 10ms interrupt
*/
TR0=1;
while(1)
{
for(sel=0;sel<6;sel++)
{
if(second100>99)
{
second100=0;
second++;
if(second>59)
{
second=0;
minute++;
if(minute>59)
{
minute=0;
hour++;
if(hour>23)
hour=0;
}
}
}
if(alarm)
{
change++;
if(change<2500)
{
dispbuf[0]=hour/10;
dispbuf[1]=hour%10;
dispbuf[2]=minute/10;
dispbuf[3]=minute%10;
dispbuf[4]=second/10;
dispbuf[5]=second%10;
}
else
{
dispbuf[0]=alarmhour/10;
dispbuf[1]=alarmhour%10;
dispbuf[2]=alarmminute/10;
dispbuf[3]=alarmminute%10;
dispbuf[4]=alarmsecond/10;
dispbuf[5]=alarmsecond%10;
}
if(change==3500)
change=0;
}
else
{
dispbuf[0]=hour/10;
dispbuf[1]=hour%10;
dispbuf[2]=minute/10;
dispbuf[3]=minute%10;
dispbuf[4]=second/10;
dispbuf[5]=second%10;
}
if(sel==1||sel==3)
{
P0=disp[dispbuf[sel]]&0x7F;//display the dot
}
else
{
P0=disp[dispbuf[sel]];
}
P2=select[sel];
delay();
//P2=0x00;//added for the simulator,not for the real circuit仿真的时候使用,实际程序好象不可以用
}
}
}
void delay(void)//short delay
{
unsigned char n;
for(n=0;n<255;n++)
{
_nop_();
_nop_();
}
}
void timer0()interrupt 1//process the time
{
TH0=0XD8;
TL0=0Xf4;//adjust the time to be correct,maybe the crystal is not so good
/*
TH0=D8;
TL0=0XF0;
12MHZ CRYSTAL 10ms interrupt
*/
second100++;
if(alarmhour==hour&&alarmminute==minute&&alarmsecond==second)
{
if(alarm)
TR1=1;
}
}
void timer1() interrupt 3//start alarm
{
TH1=0X00;
TL0=0Xff;
speaker=~speaker;
if((minute-alarmminute)==5)//stop the alarmer after five minutes
{
TR1=0;
speaker=0;
}
}
void int0() interrupt 0//into the process function
{
TR0=0;
IE=0;//stop all the interrupt
dat=disp[8];
P2=0X3F;
flag=0;
previouskey=0x30;
while(flag^0x0e)//make the flag less than 13
{
currentkey=scankey();
if(currentkey^previouskey)
{
delay1ms(1);
if(currentkey^previouskey)
{
previouskey=currentkey;
if(currentkey==0x01)
{
flag++;
switch(flag)
{
//adjust the alarm time and current time
case 1:
dat=disp[10];
P2=0X3f;
break;
case 2:
dispbuf[0]=alarmhour/10;
dat=disp[dispbuf[0]]&0x7F;
P2=select[0];
break;
case 3:
dispbuf[1]=alarmhour%10;
dat=disp[dispbuf[1]]&0x7F;
P2=select[1];
break;
case 4:
dispbuf[2]=alarmminute/10;
dat=disp[dispbuf[2]]&0x7F;
P2=select[2];
break;
case 5:
dispbuf[3]=alarmminute%10;
dat=disp[dispbuf[3]]&0x7F;
P2=select[3];
break;
case 6:
dispbuf[4]=alarmsecond/10;
dat=disp[dispbuf[4]]&0x7F;
P2=select[4];
break;
case 7:
dispbuf[5]=alarmsecond%10;
dat=disp[dispbuf[5]]&0x7F;
P2=select[5];
break;
case 8:
dispbuf[0]=hour/10;
dat=disp[dispbuf[0]];
P2=select[0];
break;
case 9:
dispbuf[1]=hour%10;
dat=disp[dispbuf[1]];
P2=select[1];
break;
case 10:
dispbuf[2]=minute/10;
dat=disp[dispbuf[2]];
P2=select[2];
break;
case 11:
dispbuf[3]=minute%10;
dat=disp[dispbuf[3]];
P2=select[3];
break;
case 12:
dispbuf[4]=second/10;
dat=disp[dispbuf[4]];
P2=select[4];
break;
case 13:
dispbuf[5]=second%10;
dat=disp[dispbuf[5]];
P2=select[5];
break;
default:
break;
}
}
if(currentkey==0x02)
{
keyproc();
}
}
}
}
IE=0X8F;
TR0=1;
}
void int1() interrupt 2//extern interrupt to stop the alarm
{
if(TR1)
TR1=0;
speaker=0;
}
unsigned char scankey()
{
currentkey=0x00;
currentkey|=PRE;
currentkey=currentkey<<1;
currentkey|=SET;
return currentkey;
}
void keyproc()
{
switch(flag)//adjust the data of alarm time and current time
{
case 1:
alarm=!alarm;
if(alarm)
dat=disp[10];
else
dat=disp[0];
P2=0X3f;
break;
case 2:
if(alarmhour/10==2)
alarmhour=alarmhour-20;
else
alarmhour=alarmhour+10;
dispbuf[0]=alarmhour/10;
dat=disp[dispbuf[0]]&0x7F;
P2=select[0];
break;
case 3:
if(alarmhour%10==9)
alarmhour=alarmhour-9;
else
alarmhour++;
dispbuf[1]=alarmhour%10;
dat=disp[dispbuf[1]]&0x7F;
P2=select[1];
break;
case 4:
if(alarmminute/10==5)
alarmminute=alarmminute-50;
else
alarmminute=alarmminute+10;
dispbuf[2]=alarmminute/10;
dat=disp[dispbuf[2]]&0x7F;
P2=select[2];
break;
case 5:
if(alarmminute%10==9)
alarmminute=alarmminute-9;
else
alarmminute++;
dispbuf[3]=alarmminute%10;
dat=disp[dispbuf[3]]&0x7F;
P2=select[3];
break;
case 6:
if(alarmsecond/10==5)
alarmsecond=alarmsecond-50;
else
alarmsecond=alarmsecond+10;
dispbuf[4]=alarmsecond/10;
dat=disp[dispbuf[4]]&0x7F;
P2=select[4];
break;
case 7:
if(alarmsecond%10==9)
alarmsecond=alarmsecond-9;
else
alarmsecond++;
dispbuf[5]=alarmsecond%10;
dat=disp[dispbuf[5]]&0x7F;
P2=select[5];
break;
case 8:
if(hour/10==2)
hour=hour-20;
else
hour=hour+10;
dispbuf[0]=hour/10;
dat=disp[dispbuf[0]];
P2=select[0];
break;
case 9:
if(hour%10==9)
hour=hour-9;
else
hour++;
dispbuf[1]=hour%10;
dat=disp[dispbuf[1]];
P2=select[1];
break;
case 10:
if(minute/10==5)
minute=minute-50;
else
minute=minute+10;
dispbuf[2]=minute/10;
dat=disp[dispbuf[2]];
P2=select[2];
break;
case 11:
if(minute%10==9)
minute=minute-9;
else
minute++;
dispbuf[3]=minute%10;
dat=disp[dispbuf[3]];
P2=select[3];
break;
case 12:
if(second/10==5)
second=second-50;
else
second=second+10;
dispbuf[4]=second/10;
dat=disp[dispbuf[4]];
P2=select[4];
break;
case 13:
if(second%10==9)
second=second-9;
else
second++;
dispbuf[5]=second%10;
dat=disp[dispbuf[5]];
P2=select[5];
break;
default:
break;
}
}
void delay1ms(unsigned char n)
{
while(n--)
{
unsigned char i;
for(i=0;i<250;i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -