📄 ledclock.c
字号:
#include <stdio.h>
#include <reg51.h>
#define MODE P10
#define SELECT P11
#define LEDSEG P0
#define LEDDIG P2
#define TIMCNT 3126
#define lowbit(c) (c%10)
#define hibit(c) (c/10)
//#include <sio.c>
code char *version="-=<<Clock V1.3 Written by He Liang 2007.12.5>>=-\n";
// 0 1 2 3 4 5 6 7 8 9 -
code unsigned char asctb[]={192, 249, 164, 176, 153, 146, 130, 248, 128, 144, 191};
// 0 1 2 3 4 5 6 7 8 9 10 11 12
code unsigned char daypm[]={0xff,31,28,31,30,31,30,31,31,30,31,30,31,0xff};
data unsigned char mode=0,year=0,month=1,day=1,hour=0,min=0,sec=0,week=0,setup=0xff;
data unsigned char ddlycnt=0;
data unsigned int timcnt=TIMCNT,delaycnt;
idata unsigned char dbuf[8]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
code unsigned char dbits[8]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};
bit modi=0,flash,date=0;
void inittimer0(void)
{
TMOD&=0xf0;
TMOD+=0x02;
TH0=0;
TL0=0;
TR0=1;
ET0=1;
EA=1;
}
void timer0(void) interrupt 1
{
static unsigned char dc=0;
dc++;
if(dc>7)dc=0;
LEDDIG=0xff;
LEDSEG=dbuf[dc];
LEDDIG=dbits[dc];
if(delaycnt!=0)delaycnt--;
timcnt--;
if(timcnt==0)
{
if(!modi)sec++;
if(sec>59)sec=0;
timcnt=TIMCNT;
}
}
void display()
{
unsigned char c;
switch(mode)
{
case 0:
date=0;
break;
case 1:
if(setup==0xff){ddlycnt++;if(ddlycnt>5){ddlycnt=0;mode=0;}}
date=1;
break;
case 2:
if(setup==0xff)
{
if(delaycnt==0)
{
date=!date;
if(date)delaycnt=TIMCNT*2;else delaycnt=TIMCNT*5;
}
}
else
date=0;
break;
}
if(date)
{
dbuf[0]=asctb[hibit(year)];
dbuf[1]=asctb[lowbit(year)];
dbuf[2]=asctb[12];
dbuf[3]=asctb[hibit(month)];
dbuf[4]=asctb[lowbit(month)];
dbuf[5]=asctb[12];
dbuf[6]=asctb[hibit(day)];
dbuf[7]=asctb[lowbit(day)];
}else
{
c=hibit(hour);if(c==0)c=11;
dbuf[0]=asctb[c];
dbuf[1]=asctb[lowbit(hour)];
dbuf[2]=asctb[10];
dbuf[3]=asctb[hibit(min)];
dbuf[4]=asctb[lowbit(min)];
dbuf[5]=asctb[10];
dbuf[6]=asctb[hibit(sec)];
dbuf[7]=asctb[lowbit(sec)];
}
if(setup<3&&!flash)
{
c=setup+setup+setup;
dbuf[c]=0;
dbuf[c+1]=0;
}
if(setup!=3||flash)dbuf[week]|=1;
}
void caltim()
{
static data unsigned char se=0;
if(sec!=se)
{
se=sec;
if(sec==0)
{
min++;
if(min>59)
{
hour++;min=0;
if(hour>23)
{
hour=0;week++;if(week>6)week=0;
day++;
if(day>daypm[month]+((year&3)==0?1:0))
{
month++;day=1;
if(month>12)
{
year++;month=1;
if(year>99)year=0;
}
}
}
}
}
flash=1;
display();
}
if(setup!=0xff&&delaycnt==0)
{
delaycnt=750;
flash=!flash;
display();
}
}
char _getkey(void)
{
static unsigned char cnt=254,lastkey=0,repcnt=10,lstk=0;
unsigned char k;
MODE=1;SELECT=1;
k=(((unsigned char)SELECT)<<2)+(unsigned char)MODE;
if(k!=lstk){lstk=k;cnt=254;}
if(cnt>0){cnt--;return 0;}
cnt=254;
if(k==lastkey)
{
repcnt--;
if(repcnt==0){repcnt=2;return k;}
else return 0;
}else
{
lastkey=k;
repcnt=6;
return k;
}
}
main()
{
unsigned char key;
inittimer0();
// initsio();
while(1)
{
PCON|=1;
caltim();
key=_getkey();
if(key!=0)
{
ddlycnt=0;
switch(key)
{
case 1:
setup++;
if(setup>3)setup=0xff;
if(setup!=2)modi=0;
delaycnt=0;
break;
case 2:
if(mode!=1)
{
switch(setup)
{
case 0:
hour++;
if(hour>23)hour=0;
break;
case 1:
min++;
if(min>59)min=0;
break;
case 2:
modi=1;
sec++;
if(sec>59)sec=0;
timcnt=TIMCNT;
break;
case 3:
week++;
if(week>6)week=0;
break;
case 0xff:
mode++;
if(mode>2)mode=0;
break;
}
}else
{
switch(setup)
{
case 0:
year++;
if(year>99)year=0;
break;
case 1:
month++;
if(month>12)month=1;
break;
case 2:
day++;
if(day>daypm[month]+((year&3)==0?1:0))day=1;
break;
case 3:
week++;
if(week>6)week=0;
break;
case 0xff:
mode++;
if(mode>2)mode=0;
break;
}
}
delaycnt=2400;
flash=1;
break;
}
display();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -