#include <stdio.h>

#include <conio.h>

 

/* ============= Definitions =============== */

 

#define BYTE unsigned char      //8 bit

 

#define PPI_PA          0x00         

#define PPI_PB          0x04

#define PPI_PC          0x08

#define PPI_CW          0x0C

#define PPI_CW_VAL      0x81        //A,B,C»óÀ§ bit Ãâ·Â,CÇÏÀ§ 4bit ÀÔ·Â  

#define KEY_INC         0x01        //C0 SW

#define KEY_DEC         0x02        //C1 SW

#define KEY_SEL         0x04        //C2 SW

 

 

void set_clock(void);

void print_segment(int pos, BYTE val);

void display_clock(void);

void delaytime(int t);

 

BYTE key_input(void);

 

BYTE hour_1,hour_2,min_1,min_2;

int k;

 

 

/* ========================== main ÇÔ¼ö ============================= */

 

void main(void)

{

 

        BYTE i;

        int j;

    outp(PPI_CW, PPI_CW_VAL);

 

 

    /* ======= 7 ¼¼±×¸ÕÆ® Ãʱ⠵ð½ºÇ÷¹ÀÌ === */

 

    for(i=9;i>0;i--)

        {

                j=0;

                while(j<4)

                {

                        print_segment(j,i);        //i:value  j:segment #

                        j++;

            delaytime(100);

                }

                delaytime(200);

        }

    /*=========== ÀÔ·Â ½ÅÈ£  ºÎÁ® 4¹ø ============*/

    outp(PPI_PB,0x00);

        for(k=0;k<4;k++)

        {               

                outp(PPI_PC,0x40);

                delaytime(200);

                outp(PPI_PC,0x00);

                delaytime(200);

        }

 

        set_clock();                      //½Ã°£ ¼³Á¤

        display_clock();                  //½Ã°£ Ãâ·Â

}

 

/* =================================================================*/

 

 

/* ==========7-segment display function=========== */

 

void print_segment(int pos, BYTE val)

{

        switch (pos) {

                case 0:

                outp(PPI_PA, (val) + (inp(PPI_PA) & 0xf0));

                break;

                case 1:

        outp(PPI_PA, (val<<4) + (inp(PPI_PA) & 0x0f));          

                break;

                case 2:

                outp(PPI_PB, (val) + (inp(PPI_PB) & 0xf0));

                break;

                case 3:

        outp(PPI_PB, (val<<4) + (inp(PPI_PB) & 0x0f));          

                break;

                default:

                return;

        }               

}

    

/* ========== time setting =========== */

 

void set_clock(void)

{

        int count=0;

        BYTE key, tmp=0;

        

        while (count<4)

        {

                key=key_input();          /* ½Ã°£ÀÔ·ÂÇÔ¼ö È£Ãâ */

                switch (key)

                {

                        case KEY_INC:         /* c0 port sw 1 ´­·¶À»¶§ */

                        if(tmp==9) ;

                        else tmp++;

                        print_segment(count,tmp);

                        break;

                        case KEY_DEC:        /* c1 port sw 2 ´­·¶À»¶§ */

                        if(tmp==0) ;

                        else tmp--;

                        print_segment(count,tmp);

                        break;

                        case KEY_SEL:        /* c2 port sw 3 ´­·¶À»¶§ */

                        switch(count)

                        {

                                case 0:

                                hour_2=tmp;      /* 10´ÜÀ§ ½Ã°£ */

                                break;

                                case 1:

                                hour_1=tmp;      /* 1´ÜÀ§ ½Ã°£ */

                                break;

                                case 2:

                                min_2=tmp;       /* 10´ÜÀ§ ºÐ */

                                break;

                                case 3:

                                min_1=tmp;       /* 1´ÜÀ§ ºÐ */

                                break;

                        }

                        count++;

                        tmp=0;

                        delaytime(100);

                    break;

                }

        }

}

 

/* ========== time input function =========== */

BYTE key_input(void)

{

        BYTE keyin=0;

        

    while(keyin==0)      /* ÀÔ·ÂÀÌ µé¾î¿Ã¶§±îÁö ÀÌ ·çƾ ¼öÇà */

        {

                keyin=~inp(PPI_PC);  /* ¹ÝÀüµÈ ÀÓ·ÂÀ» ¹Þ´Â´Ù */

        keyin=keyin<<5;      /* key masking */

                keyin=keyin>>5;

                

        if (keyin!=0) delaytime(60); /*  ÀÔ·ÂÀÌ ÀÖÀ¸¸é 180ms delay ÈÄ Å°°ª ¹Ýȯ  */

        }

        delaytime(160);

        return keyin;

}

 

 

/* ========= time output =========== */

 

void display_clock(void)

{

        while(1)

        {

                int t;

                for(t=0;t<60;t++)

                {      

                        outp(PPI_PC,0x00);    /* LED OFF */

                        delaytime(200);           

                        outp(PPI_PC,0x30);    /* LED ON  */

                        delaytime(140);

                }

        

                min_1=min_1+1;

                if(min_1==10)

                {

                        min_2=min_2+1;

                        min_1=0;

                        

                        if(min_2==6)

                        {

                                hour_1=hour_1+1;

                                min_2=0;

                        

                            if(hour_1>10)

                                {

                                        hour_2=hour_2+1;

                                        hour_1=0;                    

                                }

                        }               

                

                }

        

                if(hour_2==2 && hour_1==4) hour_2=0,hour_1=0,min_2=0,min_1=0;           

                

                print_segment(0,hour_2);

        print_segment(1,hour_1);

                print_segment(2,min_2);

                print_segment(3,min_1);

                

        }

}

 

/* ½Ã°£ Áö¿¬ */

void delaytime(int t)

{

    int i, j;

 

    for(i=0; i<t; i++)

        for(j=0; j<t; j++)

                _asm    nop;

}

/* if t=100, delay time is about 0.3s

      t=200, delay time is about 0.6s

      t=300, delay time is about 0.9s

      t=20 , delay time is about 0.06s   */