#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 */