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