⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ledclock.c

📁 一个用C语言写的基于98C51单片机的电子钟程序
💻 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 + -