- 2 -

Similar documents
ATmega128

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202834C1D6C2F7207E2038C1D6C2F729>

Smart Home 1. Embeded UART 2. GoAhead Web Server 3. JQuery, JQTouch 4. AJAX 5. JK-FF Switch 강의명 : 담당교수 : 임베디드소프트웨어및실습 고진석교수님 전공 : 전자공학과 실습조 : 학번 / 성명

(Asynchronous Mode) ( 1, 5~8, 1~2) & (Parity) 1 ; * S erial Port (BIOS INT 14H) - 1 -

[8051] 강의자료.PDF

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202834C1D6C2F7207E2038C1D6C2F729>

M16_32KIT_Manual.hwp

슬라이드 1

정보보안 개론과 실습:네트워크

<4D F736F F F696E74202D20BBB7BBB7C7D15F FBEDFB0A3B1B3C0B05FC1A634C0CFC2F72E BC8A3C8AF20B8F0B5E55D>

MAX232 MAXIM사에서생산되는 RS-232통신을가능토록해주는송수신 IC이다. 송수신드라이브를각각 2개씩가지고있다. AVR과컴퓨터가인식하는 0과 1의값이다르기때문에.. 마이컴컴퓨터 이차이를해결해주는것이다. 0 0V -10V 1 5V 10V TTL IC 의전원단자와다

UART.h #ifndef _UART_H_ #define _UART_H_ #define DIR_TXD #define DIR_RXD sbi(portd,4) cbi(portd,4) #define CPU_CLOCK_HZ UL UART PORT1 void UAR

T100MD+

2주차: 입출력 제어 복습

<4D F736F F F696E74202D20BBB7BBB7C7D15F FBEDFB0A3B1B3C0B05FC1A636C0CFC2F72E BC8A3C8AF20B8F0B5E55D>

lecture4(6.범용IO).hwp

Microsoft PowerPoint - polling.pptx

K&R2 Reference Manual 번역본

<4D F736F F F696E74202D20BBB7BBB7C7D15F FBEDFB0A3B1B3C0B05FC1A638C0CFC2F72E BC8A3C8AF20B8F0B5E55D>

<4D F736F F D20BDBAC5D7C7CE20B6F3C0CEC6AEB7B9C0CCBCADB0ADC1C2202D203420C7C1B7CEB1D7B7A1B9D62E646F63>

1. 제품소개 그림. 1.1 이란? DC 모터구동시하드웨어제작에소요되는시간을단축시켜프로그래밍연구개발및학습효과를극대화시켜주는 입니다. 또한당사 DEV 보드와 1P 점퍼클립케이블을이용하여연동이가능하며, 산업용 DC 모터의정회전, 역회전구동및속도제어시유용하게사용되는 입니다.

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202839C1D6C2F7207E203135C1D6C2F >

PowerPoint 프레젠테이션

MAX+plus II Getting Started - 무작정따라하기

2. GCC Assembler와 AVR Assembler의차이 A. GCC Assembler 를사용하는경우 i. Assembly Language Program은.S Extension 을갖는다. ii. C Language Program은.c Extension 을갖는다.

CANTUS Evaluation Board Ap. Note

Chapter. 14 DAC 를이용한 LED 밝기제어 HBE-MCU-Multi AVR Jaeheung, Lee

프로그램을 학교 등지에서 조금이라도 배운 사람들을 위한 프로그래밍 노트 입니다. 저 역시 그 사람들 중 하나 입니다. 중고등학교 시절 학교 도서관, 새로 생긴 시립 도서관 등을 다니며 책을 보 고 정리하며 어느정도 독학으르 공부하긴 했지만, 자주 안하다 보면 금방 잊어

인터럽트 * 인터럽트처리메커니즘 ATmega128 인터럽트 2

한글사용설명서

untitled

untitled

KEY 디바이스 드라이버

2009년2학기 임베디드시스템 응용

도 1 명세서 도면의 간단한 설명 도 1은 본 발명의 바람직한 실시예에 따른 데이터 송수신 장치의 회로도이다. 도 2는 도 1에 도시된 등화기의 일 실시예를 보여주는 회로도이다. 도 3은 도 1에 도시된 프리엠퍼시스 회로의 일 실시예를 보여주는 회로도이다. 도 4는 본

<4D F736F F F696E74202D2037C0E55FC0CEC5CDB7B4C6AEC0C720B5BFC0DB2E707074>

목차 1. 개요 USB 드라이버 설치 (FTDI DRIVER) FTDI DRIVER 실행파일 USB 드라이버 확인방법 DEVICE-PROGRAMMER 설치 DEVICE-PROGRAMMER

ez-md+_manual01

API 매뉴얼

목차 1. 키패드 (KeyPAD) 2. KeyPAD 를이용한비밀번호입력기

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202831C1D6C2F72C2032C1D6C2F729>

Chapter #01 Subject

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070>

Microsoft PowerPoint - es-arduino-lecture-03

슬라이드 1

hd1300_k_v1r2_Final_.PDF

MicrocontrollerAcademy_Lab_ST_040709

Section 03 인터럽트활성화와인터럽트서비스루틴연결 34/82 장치에대한인터럽트설정과활성화 내부장치에대한특수레지스터존재 장치의특성을반영한동작설정용또는상태관찰용비트로구성 인터럽트사건의발생패턴을설정해야함 인터럽트활성화비트를 1 로셋하여, 인터럽트발생을허락» 전제, 전역

Microsoft PowerPoint - Chapter 8_USART Serial Communication

Slide 1

Microsoft Word doc

MPLAB C18 C

제품 특징 PC에서 마우스/키보드로 사용 Motion Ring은 사용자의 동작을 인식하는 3D 공간 인식 센서 가 장착되어 있어 정해진 제스처를 사용하여 마우스나 키보드 로 사용할 수 있습니다. - 일반적인 마우스와 키보드 없이 인터넷 웹 페이지를 사용하 거나 프레젠테

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

HX - Operation Manual MC / TC / CUT / QT HX Series(V2.x) Operation Manual for MC / TC / CUT / QT CSCAM

untitled

고급 프로그래밍 설계

인터럽트 (Interrupt) 범용입출력포트에서입출력의내용을처리하기위해매번입출력을요구하는플래그를검사하는일 (Pollong) 에대하여마이크로컨트롤러에게는상당한시간을소비하게만든다. 인터럽트란 CPU가현재처리하고있는일보다급하게처리해야할사건이발생했을때, 현재수행중인일을중단하고

Microsoft PowerPoint - 9.Serial.pptx

Microsoft Word - FS_ZigBee_Manual_V1.3.docx

À̵¿·Îº¿ÀÇ ÀÎÅͳݱâ¹Ý ¿ø°ÝÁ¦¾î½Ã ½Ã°£Áö¿¬¿¡_.hwp

1

Microsoft PowerPoint - 08-MP-4-interrupt

Microsoft PowerPoint - 08-MP-8-ADC

<4D F736F F D20C0DBC7B0C6ED5FBDBAC5D7C7CE20B6F3C0CEC6AEB7B9C0CCBCAD20B0B3B9DF2E646F63>

슬라이드 1

R50_51_kor_ch1

BC6HP Korean.ai

슬라이드 1

<4D F736F F F696E74202D2037C0E55FC0CCC0C0C7F55FBFCFBCBA205BC8A3C8AF20B8F0B5E55D>

2009년2학기 임베디드시스템 응용

PowerPoint 프레젠테이션

untitled

(SW3704) Gingerbread Source Build & Working Guide

목차 006/ 008/ 009/ 011/ 012/ 013/ 014/ Part 1_ 컴퓨터가 제대로 작동하지 않을 때 문제00_ 윈도우7 복구(초기화) 방법 안내 문제01_ 컴퓨터의 전원 버튼을 눌러도 아무 반응이 없어요. 문제02_ 전원을 누르면 팬(쿨러)이 돌아가는

SRC PLUS 제어기 MANUAL

슬라이드 1

슬라이드 제목 없음

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

Microsoft Word - JAVS_UDT-1_상세_메뉴얼.doc

Microsoft PowerPoint - 제5장 인터럽트 (HBE-MCU-Multi AVR).ppt [호환 모드]

2009년2학기 임베디드시스템 응용

untitled

USB3-FRM13 API 매뉴얼

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202831C1D6C2F72C2032C1D6C2F729>

UI TASK & KEY EVENT

EM300_Manual.indd

Nordic Chipset BLE Test Application Note

歯DCS.PDF

PowerPoint 프레젠테이션

API 매뉴얼

목차 BUG offline replicator 에서유효하지않은로그를읽을경우비정상종료할수있다... 3 BUG 각 partition 이서로다른 tablespace 를가지고, column type 이 CLOB 이며, 해당 table 을 truncate

Microsoft PowerPoint - chap13-입출력라이브러리.pptx

,,,,,, (41) ( e f f e c t ), ( c u r r e n t ) ( p o t e n t i a l difference),, ( r e s i s t a n c e ) 2,,,,,,,, (41), (42) (42) ( 41) (Ohm s law),

전자실습교육 프로그램

PowerPoint 프레젠테이션

키트전자 KE-RC-B 코드비젼

Microsoft PowerPoint - AVR 시리얼 통신.ppt [호환 모드]

Siemens

Transcription:

- 2 -

- 3 -

- 4 -

- 5 -

- 6 -

- 7 -

- 8 -

- 9 -

- 10 -

- 11 -

- 12 -

- 13 -

- 14 -

- 15 -

- 16 -

- 17 -

- 18 -

- 19 -

- 20 -

- 21 -

- 22 -

- 23 -

- 24 -

/********************************************* Chip type : ATmega16 Program type : Application Clock frequency : 11.059200 MHz Memory model : Small Internal SRAM size : 1024 External SRAM size : 0 Data Stack size : 256 *********************************************/ #include <mega16.h> #include <stdio.h> #define ltm #define lt1 #define lt2 #define lt3 #define tp #define kb_cki #define kb_di #define kb_cko #define kb_do PORTA.4 PORTA.5 PORTA.6 PORTA.7 PORTD.2 PIND.3 PIND.4 PORTD.3 PORTD.4 #define led_com PORTD #define io_port PORTC #define foot_port PINB #define km_mode PINA.2 #define sft_pin PINA.3 #define mouse 1 #define keyboard 0 #define txm 1 #define rxm 2 #define one_ch 1 #define two_ch 2 #define led 3 #define sheft 4 #define h_e 5 #define stop 0 #define up 1 #define down 2 #define left 3 #define right 4 #define celick 5 #define nocelick 6 #define celick2 7 #define tdl 25 // 키보드송신시딜레이타임 static char i,j,k,s,imsi,rxd1,rxd2,rxd3,input_data,rx_imsi, r_time,g_time,clk,sec,rx_ok, kb_count,kb_imsi,pty,kb_pty,kb_rx_count,sft_sta,kb_ok,new_disp, kb_data1,kb_data2,kb_data3,kb_data4, kb_data5,kb_data6,kb_data7,kb_data8, tx_imsi,kb_mode=rxm,kb_led,ack_err_time, foot_key,old_foot_key,led_no, tx_sta,tx_time,tx_count,scan_time, - 25 -

key,old_key,out_delay,code_su=1,tx_mode,rx_time,rx_pty, rx_data1,rx_data2, kx=9,ky=3,joy_time,mouse_time,mouse_data=0,mx,my, xc,yc,mck_sta=0, led_data,disp_count=0, sft_key,sft_old_key; static int li,rom_adr,chk_count,x_adc,y_adc,ad_imsi, kb_time,key_code; flash char hex[18]="0123456789abcdef"; //flash char key_code_db[100]; flash unsigned char led_db[22][3]= 0x01,0x00,0x00, //0 0x02,0x00,0x00, //1 0x04,0x00,0x00, //2 0x08,0x00,0x00, //3 0x10,0x00,0x00, //4 0x20,0x00,0x00, //5 0x40,0x00,0x00, //6 0x80,0x00,0x00, //7 0x00,0x01,0x00, //8 0x00,0x02,0x00, //9 0x00,0x04,0x00, //10 0x00,0x08,0x00, //11 0x00,0x10,0x00, //12 0x00,0x20,0x00, //13 0x00,0x40,0x00, //14 0x00,0x80,0x00, //15 0x00,0x00,0x01, //16 0x00,0x00,0x02, //17 0x00,0x00,0x04, //18 0x00,0x00,0x08, //19 0x00,0x00,0x10, //20 0x00,0x00,0x20; //21 // ; void delay(unsigned int dy) unsigned int ddy; ddy=dy; while(ddy>0) ddy--; // 컴퓨터로데이타보내기 void key_host(char _kd) // 키보드클럭핀인터럽트금지 //GICR=0x00; // 인터럽트인에이블래지스터 kb_cko=1; DDRD.3=1; DDRD.4=1; // 킄럭버튼을하이로설정 // 클럭출력설정 // 데이타출력설정 kb_do=0; delay(tdl); kb_cko=0; delay(tdl*2); kb_cko=1; delay(tdl); pty=0; // 패리티비트초기화 tx_imsi=_kd; // 데이타대입 for(i=0;i<8;i++) // 데이타송신 // 데이터송신 if(tx_imsi & 0x01) kb_do=1; pty++; kb_do=0; delay(tdl); kb_cko=0; delay(tdl*2); kb_cko=1; delay(tdl); - 26 -

tx_imsi>>=1; // kb_count++; // 패리티송신 if(pty&0x01) kb_do=0; kb_do=1; delay(tdl); kb_cko=0; delay(tdl*2); kb_cko=1; delay(tdl); // kb_count++; // 스탑비트송신 kb_do=1; delay(tdl); kb_cko=0; delay(tdl*2); kb_cko=1; DDRD.3=0; DDRD.4=0; // 클럭입력설정 // 데이타입력설정 // 키보드클럭핀인터럽트설정 //GICR=0x80; // 인터럽트인에이블래지스터 // 컴퓨터에서데이타받기 void host_key() // 키보드클럭핀인터럽트금지 //GICR=0x00; // 인터럽트인에이블래지스터 DDRD.3=0; DDRD.4=0; // 클럭입력설정 // 데이타입력설정 delay(30); rx_time=20; while(kb_di>0 && rx_time>0) ; rx_time=5; delay(10); // 초기신호가맞으면데이타수신 - 클락은 0상태데이터는 1이면 if(kb_cki==0)// && kb_di>0) rx_time=20; while(kb_cki==0 && rx_time>0); DDRD.3=1; // 클럭출력으로설정- 클럭을주기위하여 kb_cko=1; // 클럭을 1로설정 delay(tdl*2); // 스타트비트가 0 이면데이타수신 if(kb_di==0) rx_imsi=0; pty=0; //kb_cko=0; delay(tdl*2); // 데이타수신 0xed - 허가코드 for(j=0;j<8;j++) kb_cko=0; delay(tdl*2); kb_cko=1; rx_imsi =kb_di<<j; if(kb_di) pty++; delay(tdl*2); // 패리티수신 kb_cko=0; delay(tdl*2); kb_cko=1; - 27 -

rx_pty=kb_di; delay(tdl*2); // 송, 수신전환틀럭 //ack 신호출력 DDRD.4=1; // 데이타출력설정 kb_do=1; delay(tdl*2); kb_cko=0; delay(tdl*2); kb_cko=1; //delay(tdl*2); //ack 신호출력 kb_do=0; delay(tdl*2); kb_cko=0; delay(tdl*2); kb_do=1; kb_cko=1; delay(tdl*2); DDRD.3=0; DDRD.4=0; // 클럭입력설정 // 데이타입력설정 // 키보드클럭핀인터럽트설정 //GICR=0x80; // 인터럽트인에이블래지스터 // External Interrupt 1 service routine // 키보드수신루틴 interrupt [EXT_INT1] void ext_int1_isr(void) ; // Timer 1 overflow interrupt service routine interrupt [TIM1_OVF] void timer1_ovf_isr(void) // Reinitialize Timer 1 value // Reinitialize Timer 1 value TCNT1=64150; //1,000 count //if(tp>0) tp=0; tp=1; clk++; if(clk>30) clk=0; sec++; // 키보드버튼스캔타임초당 200 회 if(scan_time>0) scan_time--; // 컴퓨터에서데이타수신에러타임 if(rx_time>0) rx_time--; // 조이스틱입력타임 if(joy_time>0) joy_time--; // 마우스버튼입력시간 if(mouse_time>0) mouse_time--; #define ADC_VREF_TYPE 0x00 // Read the AD conversion result unsigned int read_adc(unsigned char adc_input) ADMUX=adc_input ADC_VREF_TYPE; // Start the AD conversion ADCSRA =0x40; - 28 -

// Wait for the AD conversion to complete while ((ADCSRA & 0x10)==0); ADCSRA =0x10; return ADCW; void mega16_init() // Input/Output Ports initialization // Port A initialization // Func0=In Func1=In Func2=In Func3=In Func4=out Func5=Out Func6=Out Func7=Out // State0=T State1=T State2=T State3=T State4=T State5=0 State6=0 State7=0 PORTA=0x00; DDRA=0xF0; // Port B initialization // Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In // State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T PORTB=0x00; DDRB=0x00; // Port C initialization // Func0=Out Func1=Out Func2=Out Func3=Out Func4=Out Func5=Out Func6=Out Func7=Out // State0=0 State1=0 State2=0 State3=0 State4=0 State5=0 State6=0 State7=0 PORTC=0x00; DDRC=0xFF; // Port D initialization // Func0=Out Func1=Out Func2=Out Func3=In Func4=In Func5=Out Func6=Out Func7=Out // State0=0 State1=0 State2=0 State3=T State4=T State5=0 State6=0 State7=0 PORTD=0x00; DDRD=0xE7; mouse_data=0; io_port=mouse_data; ltm=1; ltm=0; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 10.800 khz // Mode: Normal top=ffh // OC0 output: Disconnected TCCR0=0x05; TCNT0=0x00; OCR0=0x00; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 1382.400 khz // Mode: Normal top=ffffh // OC1A output: Discon. // OC1B output: Discon. // Noise Canceler: On // Input Capture on Falling Edge TCCR1A=0x00; TCCR1B=0x82; TCNT1H=0x10; TCNT1L=0x10; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; - 29 -

// Timer/Counter 2 initialization // Clock source: System Clock // Clock value: 10.800 khz // Mode: Normal top=ffh // OC2 output: Disconnected ASSR=0x00; TCCR2=0x07; TCNT2=0x00; OCR2=0x00; // External Interrupt(s) initialization // INT0: Off // INT1: On // INT1 Mode: Falling Edge // INT2: Off GICR=0x80; // 인터럽트인에이블래지스터 MCUCR=0x08; // 인터럽트모드설정 MCUCSR=0x00; GIFR=0x80; // 인터럽트플래그래지스터 // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x04; // USART initialization // Communication Parameters: 8 Data, 1 Stop, No Parity // USART Receiver: Off // USART Transmitter: On // USART Mode: Asynchronous // USART Baud rate: 38400 UCSRA=0x00; UCSRB=0x08; UCSRC=0x86; UBRRL=0x11; UBRRH=0x00; // USART Baud rate: 57600 //UCSRA=0x00; //UCSRB=0x08; //UCSRC=0x86; //UBRRL=0x0a; //UBRRH=0x00; // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off // Analog Comparator Output: Off ACSR=0x80; SFIOR=0x00; // ADC initialization // ADC Clock frequency: 172.800 khz // ADC Voltage Reference: AREF pin // ADC High Speed Mode: On // ADC Auto Trigger Source: None ADMUX=ADC_VREF_TYPE; ADCSRA=0x86; SFIOR=0x10; // Declare your global variables here //rs-232 송신루틴 - 30 -

void tx_232(char _txd) while(!(ucsra & 0x20)); UDR=_txd; void foot_key_in() foot_key=foot_port; //port_b foot_key &= 0x1f; // 한영전환키코드출력 void code_he_tx() if(key!=old_key) if(old_key==0 && key>0) key_host(key_code%256); out_delay=0; old_key=key; // 키코드가 1 개일때데이타출력 void code1_tx() if(sft_sta>0) if(key!=old_key) // 버튼을눌렀다띠면 if(old_key>0 && key==0) key_host(0xf0); delay(5000); key_host(key_code%256); delay(5000); key_host(0xf0); delay(5000); key_host(0x12); // 최초의버튼이눌려지면 if(old_key==0 && key>0) key_host(0x12); delay(5000); key_host(key_code%256); out_delay=0; old_key=key; if(key==old_key && key>0) // 키를연속으로누르면 - 일정시간지연후신호출력 if(out_delay<15) out_delay++; key_host(key_code%256); if(key!=old_key) // 버튼을눌렀다띠면 if(old_key>0 && key==0) key_host(0xf0); delay(5000); key_host(key_code%256); // 최초의버튼이눌려지면 if(old_key==0 && key>0) key_host(key_code%256); out_delay=0; old_key=key; if(key==old_key && key>0) - 31 -

// 키를연속으로누르면 - 일정시간지연후신호출력 if(out_delay<15) out_delay++; key_host(key_code%256); // 키코드가 2 개일때데이타출력 void code2_tx() if(key!=old_key) // 버튼을눌렀다띠면 if(old_key>0 && key==0) key_host(key_code/256); delay(5000); key_host(0xf0); delay(5000); key_host(key_code%256); // 최초의버튼이눌려지면 if(old_key==0 && key>0) key_host(key_code/256); delay(5000); key_host(key_code%256); out_delay=0; old_key=key; if(key==old_key && key>0) // 키를연속으로누르면 - 일정시간지연후신호출력 if(out_delay<15) out_delay++; key_host(key_code/256); delay(5000); key_host(key_code%256); // 엘이디송수신루틴 void code_led_tx() if(key!=old_key) // 버튼을눌렀다띠면 if(old_key>0 && key==0) key_host(0xf0); delay(5000); key_host(key_code%256); // 최초의버튼이눌려지면 if(old_key==0 && key>0) key_host(key_code%256); out_delay=0; // 데이타수신 host_key(); delay(300); if(rx_imsi==0xed) rx_data1=rx_imsi; tx_time=5; while(kb_cki==0 && tx_time>0); delay(tdl*2); key_host(0xfa); // 데이타수신 host_key(); led_data=rx_data2=rx_imsi; delay(300); while(kb_cki==0 && tx_time>0); delay(tdl*2); key_host(0xfa); - 32 -

old_key=key; void code_sheft_tx() if(sft_key!=sft_old_key) // 버튼을눌렀다띠면 if(sft_old_key>0 && sft_key==0) key_host(0xf0); delay(5000); key_host(0x12); // 최초의버튼이눌려지면 if(sft_old_key==0 && sft_key>0) key_host(0x12); out_delay=0; sft_old_key=sft_key; if(sft_key==sft_old_key && sft_key>0) // 키를연속으로누르면 - 일정시간지연후신호출력 if(out_delay<15) out_delay++; key_host(0x12); void joy_stic_input() ADMUX=0; //adc_input ADC_VREF_TYPE; // Start the AD conversion ADCSRA =0x40; // Wait for the AD conversion to complete while ((ADCSRA & 0x10)==0); ADCSRA =0x10; ad_imsi=adcw; y_adc=ad_imsi/4; //y값증가시 if(y_adc>(yc+10) && ky<5) // 다음실행시간설정 joy_time=255-y_adc; joy_time*=2; if(ky==1) switch(kx) case 0: ky++; kx=1; break; default: ky++; if(ky==2) switch(kx) case 13: ky++; kx=12; break; case 14: ky+=2; break; case 15: ky+=3; break; case 16: ky+=2; break; case 17: ky+=3; break; case 21: ky+=2; break; - 33 -

default: ky++; if(ky==3) ky++; if(kx==12) kx=11; if(ky==4) ky++; if(kx==21) kx=20; if(kx==18) kx=19; if(kx>3 && kx<9) kx=9; ky++; //y 값감소시 if(y_adc<(yc-10) && ky>0) // 다음실행시간설정 joy_time=y_adc; joy_time*=2; if(ky==1) switch(kx) case 1: ky--; kx=2; break; case 6: ky--; kx=7; break; case 10: ky--; kx=11; break; default: if(kx<18) ky--; if(ky==4) switch(kx) case 14: ky-=2; break; case 16: ky-=2; break; case 21: ky-=2; break; default: ky--; if(ky==5) switch(kx) case 0: ky--; kx=1; break; case 12: ky--; kx=11; break; case 13: ky--; kx=14; break; case 15: ky-=3; break; case 17: ky-=3; break; default: ky--; - 34 -

ky--; // 다음실행시간설정 joy_time=255;//255-yc; ADMUX=1; //adc_input ADC_VREF_TYPE; // Start the AD conversion ADCSRA =0x40; // Wait for the AD conversion to complete while ((ADCSRA & 0x10)==0); ADCSRA =0x10; ad_imsi=adcw; x_adc=ad_imsi/4; //x값증가시처리루틴 if(x_adc>(xc+10) && kx<21) // 다음실행시간설정 joy_time=255-x_adc; joy_time*=2; if(ky==0) switch(kx) case 0: kx+=2; break; case 5: kx+=2; break; // case 17: kx+=2; break; default: if(kx<17) kx++; break; if(ky==3) switch(kx) case 12: kx+=6; break; default: if(kx<20) kx++; break; if(ky==4) switch(kx) case 11: kx+=3; break; case 14: kx+=2; break; case 16: kx+=2; break; default: if(kx<21) kx++; break; if(ky==5) switch(kx) case 3: kx+=6; break; case 17: kx+=2; break; default: if(kx<20) kx++; break; - 35 -

kx++; //x값감소시처리루틴 if(x_adc<(xc-10)&& kx>0) // 다음실행시간설정 joy_time=x_adc; joy_time*=2; if(ky==0) switch(kx) case 2: kx-=2; break; case 7: kx-=2; break; case 19: kx-=2; break; default: kx--; break; if(ky==2) if(kx>1) kx--; if(ky==3) switch(kx) case 18: kx-=6; break; default: if(kx>1) kx--; break; if(ky==4) switch(kx) case 14: kx-=3; break; case 16: kx-=2; break; case 18: kx-=2; break; default: if(kx>1) kx--; break; if(ky==5) switch(kx) case 9: kx-=6; break; case 19: kx-=2; break; default: kx--; break; kx--; // kx--; // 다음실행시간설정 - 36 -

joy_time=255;//255-yc; void led_disp() // 키보드엘이디전체지우기 led_com&=0b00011111; io_port=0x00; lt1=1; lt1=0; lt2=1; lt2=0; lt3=1; lt3=0; if(disp_count==0) //led 표시 io_port=0; lt1=1; lt1=0; io_port=0; lt2=1; lt2=0; io_port=0; if((led_data & 0x04)==0x04) io_port =0x10; //caps_lock if((led_data & 0x02)==0x02) io_port =0x08; //num_lock if((led_data & 0x01)==0x01) io_port =0x20; lt3=1; lt3=0; led_com =0b00100000; disp_count++; if(disp_count==1) io_port=0; if(sft_sta>0) io_port =0x02; io_port&=0b10111111; lt1=1; lt1=0; io_port=0; lt2=1; lt2=0; io_port=0; lt3=1; lt3=0; led_com =0b10100000; disp_count++; if(disp_count==2) // 첫째줄표시 io_port=led_db[kx][0]; lt1=1; lt1=0; io_port=led_db[kx][1]; lt2=1; lt2=0; io_port=led_db[kx][2]; lt3=1; lt3=0; //ky 값에따라 238 코먼드라이브변경출력 switch(ky) case 0: led_com =0b00100000; break; case 1: led_com =0b01000000; break; case 2: led_com =0b01100000; break; case 3: led_com =0b10000000; break; case 4: led_com =0b10100000; break; case 5: led_com =0b11000000; break; disp_count=0; - 37 -

// 키코드출력루틴 void tx_keycode() if(ky==0) switch(kx) case 0: tx_mode=one_ch; key_code=0x76; break; //code1_tx(); break; //esc case 2: tx_mode=one_ch; key_code=0x05; break; //code1_tx(); break; //f1 case 3: tx_mode=one_ch; key_code=0x06; break; //code1_tx(); break; //f2 case 4: tx_mode=one_ch; key_code=0x04; break; //code1_tx(); break; //f3 case 5: tx_mode=one_ch; key_code=0x0c; break; //code1_tx(); break; //f4 case 7: tx_mode=one_ch; key_code=0x03; break; //code1_tx(); break; //f5 case 8: tx_mode=one_ch; key_code=0x0b; break; //code1_tx(); break; //f6 case 9: tx_mode=one_ch; key_code=0x83; break; //code1_tx(); break; //f7 case 10: tx_mode=one_ch; key_code=0x0a; break; //code1_tx(); break; //f8 case 11: tx_mode=one_ch; key_code=0x01; break; //code1_tx(); break; //f9 case 12: tx_mode=one_ch; key_code=0x09; break; //code1_tx(); break; //f10 case 13: tx_mode=one_ch; key_code=0x78; break; //code1_tx(); break; //f11 case 14: tx_mode=one_ch; key_code=0x07; break; //code1_tx(); break; //f12 // case 15: key_code=0x76; break; //prt case 16: tx_mode=led; key_code=0x7e; break; //code1_tx(); break; //s lock // case 17: key_code=0x76; break; //break if(ky==1) switch(kx) case 0: tx_mode=one_ch; key_code=0x0e; break; //code1_tx(); break; //~ case 1: tx_mode=one_ch; key_code=0x16; break; //code1_tx(); break; //1 case 2: tx_mode=one_ch; key_code=0x1e; break; //code1_tx(); break; //2 case 3: tx_mode=one_ch; key_code=0x26; break; //code1_tx(); break; //3 case 4: tx_mode=one_ch; key_code=0x25; break; //code1_tx(); break; //4 case 5: tx_mode=one_ch; key_code=0x2e; break; //code1_tx(); break; //5 case 6: tx_mode=one_ch; key_code=0x36; break; //code1_tx(); break; //6 case 7: tx_mode=one_ch; key_code=0x3d; break; //code1_tx(); break; //7 case 8: tx_mode=one_ch; key_code=0x3e; break; //code1_tx(); break; //8 case 9: tx_mode=one_ch; key_code=0x46; break; //code1_tx(); break; //9 case 10: tx_mode=one_ch; key_code=0x45; break; //code1_tx(); break; //0 case 11: tx_mode=one_ch; key_code=0x4e; break; //code1_tx(); break; //- case 12: tx_mode=one_ch; key_code=0x55; break; //code1_tx(); break; //= case 13: tx_mode=one_ch; key_code=0x5d; break; //code1_tx(); break; //\ case 14: tx_mode=one_ch; key_code=0x66; break; //code1_tx(); break; //back space up case 15: tx_mode=two_ch; key_code=0xe070; break; //code2_tx(); break; //ins case 16: tx_mode=two_ch; key_code=0xe06c; break; //code2_tx(); break; //home case 17: tx_mode=two_ch; key_code=0xe07d; break; //code2_tx(); break; //page case 18: tx_mode=led; key_code=0x77; break; //code_led_tx(); break; //num case 19: tx_mode=two_ch; key_code=0x4a; break; //code2_tx(); break; /// case 20: tx_mode=one_ch; key_code=0x7c; break; //code1_tx(); break; //* case 21: tx_mode=one_ch; key_code=0x7b; break; //code1_tx(); break; //- - 38 -

if(ky==2) switch(kx) case 1: tx_mode=one_ch; key_code=0x0d; break; //code1_tx(); break; //tab case 2: tx_mode=one_ch; key_code=0x15; break; //code1_tx(); break; //q case 3: tx_mode=one_ch; key_code=0x1d; break; //code1_tx(); break; //w case 4: tx_mode=one_ch; key_code=0x24; break; //code1_tx(); break; //e case 5: tx_mode=one_ch; key_code=0x2d; break; //code1_tx(); break; //r case 6: tx_mode=one_ch; key_code=0x2c; break; //code1_tx(); break; //t case 7: tx_mode=one_ch; key_code=0x35; break; //code1_tx(); break; //y case 8: tx_mode=one_ch; key_code=0x3c; break; //code1_tx(); break; //u case 9: tx_mode=one_ch; key_code=0x43; break; //code1_tx(); break; //i case 10: tx_mode=one_ch; key_code=0x44; break; //code1_tx(); break; //o case 11: tx_mode=one_ch; key_code=0x4d; break; //code1_tx(); break; //p case 12: tx_mode=one_ch; key_code=0x54; break; //code1_tx(); break; //[ case 13: tx_mode=one_ch; key_code=0x5b; break; //code1_tx(); break; //] case 14: tx_mode=one_ch; key_code=0x5a; break; //code1_tx(); break; //enter down case 15: tx_mode=two_ch; key_code=0xe071; break; //code2_tx(); break; //del case 16: tx_mode=two_ch; key_code=0xe069; break; //code2_tx(); break; //end case 17: tx_mode=two_ch; key_code=0xe07a; break; //code2_tx(); break; //pg case 18: tx_mode=one_ch; key_code=0x6c; break; //code1_tx(); break; //7 case 19: tx_mode=one_ch; key_code=0x75; break; //code1_tx(); break; //8 case 20: tx_mode=one_ch; key_code=0x7d; break; //code1_tx(); break; //9 case 21: tx_mode=one_ch; key_code=0x79; break; //code1_tx(); break; //+ if(ky==3) switch(kx) case 1: tx_mode=led; key_code=0x58; break; //code_led_tx(); break; //caps case 2: tx_mode=one_ch; key_code=0x1c; break; //code1_tx(); break; //a case 3: tx_mode=one_ch; key_code=0x1b; break; //code1_tx(); break; //s case 4: tx_mode=one_ch; key_code=0x23; break; //code1_tx(); break; //d case 5: tx_mode=one_ch; key_code=0x2b; break; //code1_tx(); break; //f case 6: tx_mode=one_ch; key_code=0x34; break; //code1_tx(); break; //g case 7: tx_mode=one_ch; key_code=0x33; break; //code1_tx(); break; //h case 8: tx_mode=one_ch; key_code=0x3b; break; //code1_tx(); break; //j case 9: tx_mode=one_ch; key_code=0x42; break; //code1_tx(); break; //k case 10: tx_mode=one_ch; key_code=0x4b; break; //code1_tx(); break; //l case 11: tx_mode=one_ch; key_code=0x4c; break; //code1_tx(); break; //; case 12: tx_mode=one_ch; key_code=0x52; break; //code1_tx(); break; //' case 18: tx_mode=one_ch; key_code=0x6b; break; //code1_tx(); break; //4 case 19: tx_mode=one_ch; key_code=0x73; break; //code1_tx(); break; //5 case 20: tx_mode=one_ch; key_code=0x74; break; //code1_tx(); break; //6 if(ky==4) switch(kx) case 1: tx_mode=one_ch; key_code=0x12; break; //code1_tx(); break; //shift case 2: tx_mode=one_ch; key_code=0x1a; break; //code1_tx(); break; //z case 3: tx_mode=one_ch; key_code=0x22; break; //code1_tx(); break; //x case 4: tx_mode=one_ch; key_code=0x21; break; //code1_tx(); break; //c - 39 -

case 5: tx_mode=one_ch; key_code=0x2a; break; //code1_tx(); break; //v case 6: tx_mode=one_ch; key_code=0x32; break; //code1_tx(); break; //b case 7: tx_mode=one_ch; key_code=0x31; break; //code1_tx(); break; //n case 8: tx_mode=one_ch; key_code=0x3a; break; //code1_tx(); break; //m case 9: tx_mode=one_ch; key_code=0x41; break; //code1_tx(); break; //, case 10: tx_mode=one_ch; key_code=0x49; break; //code1_tx(); break; //. case 11: tx_mode=one_ch; key_code=0x4a; break; //code1_tx(); break; /// case 14: tx_mode=one_ch; key_code=0x59; break; //code1_tx(); break; //shift case 16: tx_mode=two_ch; key_code=0xe075; break; //code2_tx(); break; // case 18: tx_mode=one_ch; key_code=0x69; break; //code1_tx(); break; // case 19: tx_mode=one_ch; key_code=0x72; break; //code1_tx(); break; // case 20: tx_mode=one_ch; key_code=0x7a; break; //code1_tx(); break; // case 21: tx_mode=two_ch; key_code=0xe05a; break; //code2_tx(); break; // if(ky==5) switch(kx) case 0: tx_mode=one_ch; key_code=0x14; break; //code1_tx(); break; //ctrl case 1: tx_mode=two_ch; key_code=0xe01f; break; //code1_tx(); break; //window // case 2: key_code=0x11; code1_tx(); break; //alt // case 3: key_code=0x76; code1_tx(); break; //hanja case 9: tx_mode=one_ch; key_code=0x29; break; //code1_tx(); break; //space case 10: tx_mode=h_e; key_code=0xf2; break; //code1_tx(); break; //h/e case 11: tx_mode=two_ch; key_code=0x11; break; //code2_tx(); break; //alt case 12: tx_mode=two_ch; key_code=0xe027; break; //code1_tx(); break; //window // case 12: key_code=0x76; code1_tx(); break; //window // case 13: key_code=0x76; code1_tx(); break; //write case 14: tx_mode=two_ch; key_code=0x14; break; //code2_tx(); break; //ctrl case 15: tx_mode=two_ch; key_code=0xe06b; break; //code2_tx(); break; // case 16: tx_mode=two_ch; key_code=0xe072; break; //code2_tx(); break; // case 17: tx_mode=two_ch; key_code=0xe074; break; //code2_tx(); break; // case 19: tx_mode=one_ch; key_code=0x70; break; //code1_tx(); break; // case 20: tx_mode=one_ch; key_code=0x71; break; //code1_tx(); break; // void mouse_tx(char f) if(f==up) ltm=1; mouse_data&=0b11111100; mouse_data =0x02; io_port=mouse_data; delay(100); mouse_data =0x01; io_port=mouse_data; delay(100); mouse_data&=0b11111101; io_port=mouse_data; delay(100); mouse_data&=0b11111110; io_port=mouse_data; delay(100); ltm=0; if(f==down) - 40 -

ltm=1; mouse_data&=0b11111100; mouse_data =0x01; io_port=mouse_data; delay(100); mouse_data =0x02; io_port=mouse_data; delay(100); mouse_data&=0b11111110; io_port=mouse_data; delay(100); mouse_data&=0b11111101; io_port=mouse_data; delay(100); ltm=0; if(f==left) ltm=1; mouse_data&=0b11110011; mouse_data =0x04; io_port=mouse_data; delay(100); mouse_data =0x08; io_port=mouse_data; delay(100); mouse_data&=0b11111011; io_port=mouse_data; delay(100); mouse_data&=0b11110111; io_port=mouse_data; delay(100); ltm=0; if(f==right) ltm=1; mouse_data&=0b11110011; mouse_data =0x08; io_port=mouse_data; delay(100); mouse_data =0x04; io_port=mouse_data; delay(100); mouse_data&=0b11110111; io_port=mouse_data; delay(100); mouse_data&=0b11111011; io_port=mouse_data; delay(100); ltm=0; if(f==celick) ltm=1; // mouse_data&=0b10111111; mouse_data =0x40; io_port=mouse_data; ltm=0; if(f==nocelick) ltm=1; // mouse_data&=0b10111111; mouse_data&=0b10111111; io_port=mouse_data; ltm=0; if(f==celick2) ltm=1; mouse_data&=0b10111111; mouse_data =0x40; io_port=mouse_data; delay(20000); mouse_data&=0b10111111; io_port=mouse_data; delay(50000); mouse_data =0x40; io_port=mouse_data; delay(20000); mouse_data&=0b10111111; io_port=mouse_data; delay(20000); ltm=0; void mouse_input() - 41 -

ADMUX=0; //adc_input ADC_VREF_TYPE; // Start the AD conversion ADCSRA =0x40; // Wait for the AD conversion to complete while ((ADCSRA & 0x10)==0); ADCSRA =0x10; ad_imsi=adcw; my=ad_imsi/4; //y 값증가시 if(my>(yc+10)) mouse_tx(up); mouse_time=255-my; if(my<(yc-10)) mouse_tx(down); mouse_time=my; mouse_tx(stop); ADMUX=1; //adc_input ADC_VREF_TYPE; // Start the AD conversion ADCSRA =0x40; // Wait for the AD conversion to complete while ((ADCSRA & 0x10)==0); ADCSRA =0x10; ad_imsi=adcw; mx=ad_imsi/4; //x 값증가시 if(mx>(xc+10)) mouse_tx(left); mouse_time=255-mx; if(mx<(xc-10)) mouse_tx(right); mouse_time=mx; mouse_tx(stop); // 초기시작시조이스틱볼륨값읽어오기 void joystic_init() ADMUX=0; //adc_input ADC_VREF_TYPE; // Start the AD conversion ADCSRA =0x40; // Wait for the AD conversion to complete while ((ADCSRA & 0x10)==0); ADCSRA =0x10; ad_imsi=adcw; yc=ad_imsi/4; ADMUX=1; //adc_input ADC_VREF_TYPE; // Start the AD conversion ADCSRA =0x40; // Wait for the AD conversion to complete while ((ADCSRA & 0x10)==0); ADCSRA =0x10; ad_imsi=adcw; xc=ad_imsi/4; void main(void) mega16_init(); // Global enable interrupts #asm("sei") delay(60000); - 42 -

joystic_init(); while (1) if(km_mode==keyboard) // 조이스틱입력 if(joy_time==0) joy_stic_input(); if(km_mode==mouse) // 마우스입력 if(mouse_time==0) mouse_input(); // 쉬프트발버튼상태읽어오기 sft_sta=sft_pin; // code_sheft_tx(); led_disp(); // 외부 ( 발 ) 버튼입력 if(scan_time==0) foot_key_in(); scan_time=100; if(foot_key>0) //key_host(0x77); delay(6000); //key_host(0xf0); delay(5000); //key_host(0x77); delay(5000); // tx_sta=2; tx_count=3; d1=0x77; d2=0xf0; d3=0x77; tx_time=0; // 마우스 1클릭버튼 if((foot_key & 0x08)==0x08 && mck_sta==0) mouse_tx(celick); mck_sta=1; // 발입력버튼이눌려지면키코드대입 switch(foot_key) case 0x01: key=1; tx_keycode(); break; case 0x02: joystic_init(); break; case 0x04: mouse_tx(celick2); break; key=0; // 마우스노 1클릭 if((foot_key & 0x08)==0 && mck_sta>0) mouse_tx(nocelick); mck_sta=0; // 각상태별키코드송신 if(tx_mode==one_ch) //1키코드송신 code1_tx(); if(tx_mode==two_ch) //2키코드송신 - 43 -

code2_tx(); if(tx_mode==led) // 엘이디코드송수신 code_led_tx(); if(tx_mode==sheft) // 쉬프트키가눌린경우의송신 code_sheft_tx(); if(tx_mode==h_e) // 한영전환키 code_he_tx(); tx_232(0x10); tx_232((x_adc/100)+0x30); tx_232(((x_adc%100)/10)+0x30); tx_232((x_adc%10)+0x30); tx_232(' '); tx_232((y_adc/100)+0x30); tx_232(((y_adc%100)/10)+0x30); tx_232((y_adc%10)+0x30); tx_232(' '); tx_232(0x11); tx_232((kx/10)+0x30); tx_232((kx%10)+0x30); tx_232(' '); tx_232((ky/10)+0x30); tx_232((ky%10)+0x30); tx_232(' '); tx_232((foot_key/10)+0x30); tx_232((foot_key%10)+0x30); tx_232(' '); tx_232(hex[led_data/16]); tx_232(hex[led_data%16]); tx_232(' '); ; - 44 -