#define P2PIN 0xF868 #define P2DIR 0xF86C #define P2CFG 0xF822 #define THR0DOS 0x03F8 #define BEEP 0x20A #define BAR_LED 0x203 /*글자완성시간별 소팅*/ char ch_arr[64] = {'E','I','S','H','5','4','V',' ','3','U', 'F',' ',' ',' ',' ','2','A','R','L',' ', ' ',' ',' ',' ','W','P',' ',' ','J',' ', '1','T','N','D','B','6',' ','X',' ',' ', 'K','C',' ',' ','Y',' ',' ','M','G','Z', '7',' ','Q',' ',' ','O',' ','8',' ',' ', '9','0'}; void main(void) { char flag = 0, flag1 = 2; char index = -1; char weight = 5;/*5자리수 기준*/ int count = 0, temp, speed = 1000; int count1 = 0; outportb(P2CFG, inportb(P2CFG) & 0xDF); /* use RxD (P2.5) pin as Port */ outportb(P2DIR, inportb(P2DIR) | 0x20); /* set P2.5 = IN */ /* printf()는 그대로 동작함, PC 쪽의 smorse.exe 가 화면에 표시해줌 */ outportb(BEEP, 0); while(1) { /* 이 while loop 안에서 모르스 부호를 해석하여 PC 쪽으로 전송하는 내용을 구현 */ if (inportb(P2PIN) & 0x20) {/*소리안남*/ count1++; temp = count; count = 0; outportb(BEEP, 0); outportb(BAR_LED, 0xFF); if(count1 > speed + speed/2 && flag1 == 0) {/*한글자 끝남*/ flag1 = 1; count1 = 0; } if(count1 > speed*10 && flag1 == 3){/*오래쉼*/ outportb(THR0DOS, ' '); flag1 = 2;/*완전대기상태*/ } } else {/*소리날때*/ if(flag1 == 0 && count1 != 0) {/*쉬다가 처음 들어왔을때*/ speed = count1+speed/4; } count++; flag = 1; flag1 = 0; count1 = 0; outportb(BEEP, 1); outportb(BAR_LED, 0x00); } if(count == 0 && flag == 1) {/*글자 만드는 중(소리 중단됐을때)*/ if(speed - speed/2 < temp && speed+speed/2 > temp) {/*이전 소리 : S */ index++;/*모스부호 문자 주소 설정*/ } else/* L */ { int i, temp = 1; for(i = 0; i < weight; i++) { temp *= 2; } index += temp; } weight--; flag = 0; } if(flag1 == 1) {/*한글자 완전 끝*/ if(weight == -3) { outportb(THR0DOS, '\b'); } else if(weight == -5) { break; } else{ outportb(THR0DOS, ch_arr[index]); } index = -1; flag1 = 3;/*장시간 대기인지 지켜보는 상태(대기시 공백 전송)*/ count1 = 0; weight = 5; } } outportb(P2CFG, inportb(P2CFG) | 0x20); }