BUILD THE RIGHT THING BUILD THING RIGHT SHIP

버튼 입력 BUILD THE RIGHT THING BUILD THING RIGHT SHIP FAST 주강사 : 장재웅 보조강사 : 이민우



1) -1. 코드 #define F_CPU 16000000 UL #include <avr/io. h> #include <util/delay. h> #include "UART. h" // UART 라이브러리 사용 int main(void) { UART_INIT(); //UART 통신 초기화 DDRD &= ~(1 << PD 2); // 0 b 1111 1011 PORTD &= ~(1 << PD 2); // 0 b 1111 1011 //PD 2 풀업 끄기 while(1) { char button. State = ((PIND & (1 << PD 2)) >> PD 2) | '0'; UART_transmit(button. State); } } return 0;


1) -1. 코드 #define F_CPU 16000000 UL #include <avr/io. h> #include <util/delay. h> #include "UART. h" // UART 라이브러리 사용 int main(void) { UART_INIT(); //UART 통신 초기화 DDRD &= ~(1 << PD 2); // 0 b 1111 1011 PORTD |= (1 << PD 2); // 0 b 0000 0100 //PD 2 풀업 while(1) { char button. State = ((PIND & (1 << PD 2)) >> PD 2) | '0'; UART_transmit(button. State); } } return 0;


1) -1. 코드 #define F_CPU 16000000 UL #include <avr/io. h> #include <util/delay. h> #include "UART. h" // UART 라이브러리 사용 int main(void) { UART_INIT(); //UART 통신 초기화 DDRD &= ~(1 << PD 2); // 0 b 1111 1011 PORTD &= ~(1 << PD 2); // 0 b 0000 //PD 2 풀업 끄기 while(1) { char button. State = ((PIND & (1 << PD 2)) >> PD 2) | '0'; UART_transmit(button. State); } } return 0;






5). 코드 : 버튼으로 LED 제어 #include <avr/io. h> #define F_CPU 16000000 UL #include <util/delay. h> void INIT_PORT(void) { DDRB = 0 x 20; // PB 5(디지털 13번 핀) 출력으로 설정 PORTB = 0 x 00; // LED는 꺼진 상태에서 시작 DDRD = 0 x 00; // 버튼 입력 PORTD = 0 x 04; // PD 2(디지털 2번 핀) 풀업 저항 사용 } int main(void) { INIT_PORT(); // 포트 설정 while(1){ if(PIND & 0 x 04) PORTB = 0 x 00; // LED 끄기 else PORTB = 0 x 20; // LED 켜기 } }


6). 코드 : 버튼이 눌러진 횟수 세기 - 숫자 카운트 #define F_CPU 16000000 UL #include <avr/io. h> #include <util/delay. h> #include "UART. h" // UART 라이브러리 사용 int counter(int count) { while(count>0) { int count_value = count; char count_value_buffer[3]; //100의 자리수까지 for(int i = 1; ; i++) { count_value_buffer[i] = (count_value % 10) | '0'; if(count_value<10) { for(; i>0; i--) UART_transmit(count_value_buffer[i]); UART_transmit(0 x 0 A); //LF(Line Feed) count ++; return count; } count_value /= 10; } } count++; return count; } int main(void) { UART_INIT(); // UART 통신 초기화 DDRB = 0 x 20; // PB 5 (디지털 13번 핀) 출력으로 설정 PORTB = 0 x 00; // LED는 꺼진 상태에서 시작 DDRD = 0 x 00; // 버튼 입력 PORTD = 0 x 04; // PD 2 (디지털 2번 핀) 풀업 저항 사용 int state = 0; // 현재 버튼의 상태 int count = 0; while(1){ if(PIND & 0 x 04){ state = 0; // 버튼이 눌러지지 않은 상태로 표시 PORTB = 0 x 00; // LED 끄기 } else{ // 눌러지지 않은 상태에서 눌러진 상태로 바뀔 때마다 ‘*’ 문자 전송 if(state == 0) { count = counter(count); //10진수 자리 출력 } state = 1; // 버튼이 눌러진 상태로 표시 PORTB = 0 x 20; // LED 켜기 } } } <- 복사


7). 결과 : 코드 #define F_CPU 16000000 UL #include <avr/io. h> #include <util/delay. h> #include "UART. h" // UART 라이브러리 사용 void INIT_PORT(void) { DDRB = 0 x 20; // PB 5 (디지털 13번 핀) 출력으로 설정 PORTB = 0 x 00; // LED는 꺼진 상태에서 시작 DDRD = 0 x 00; // 버튼 입력 PORTD = 0 x 04; // PD 2 (디지털 2번 핀) 풀업 저항 사용 } int main(void) { UART_INIT(); // UART 통신 초기화 INIT_PORT(); // 포트 설정 int state = 0; // 현재 버튼의 상태 int count = 0; while(1){ if(PIND & 0 x 04){ state = 0; // 버튼이 눌러지지 않은 상태로 표시 PORTB = 0 x 00; // LED 끄기 count = 0; } else{ // 눌러지지 않은 상태에서 눌러진 상태로 바뀔 때마다 ‘*’ 문자 전송 if(state == 0) { UART_print. String("n"); UART_transmit('*'); UART_print. String("n"); } UART_print 16 bit. Number(count++); if(count % 10 == 0) UART_print. String("n"); state = 1; // 버튼이 눌러진 상태로 표시 PORTB = 0 x 20; // LED 켜기 } } } <- 복사








4 X 4 키패드 #define F_CPU 16000000 UL #include <avr/io. h> #include <util/delay. h> #include "UART. h" // UART 라이브러리 사용 unsigned char Key. Scan(void){ char Key. Buf=0 x. FF; // 키 값이 들어갈 버퍼, 초기값 0 x. FF PORTC = 0 b 00110000 | 0 b 00001111; // 포트 초기값, 입력핀 내부풀업저항 사용 PORTB = 0 b 00001100; // 포트 초기값, 입력핀 내부풀업저항 사용 DDRC = 0 b 00110000; // 비트 0, 1, 2, 3 출력으로 지정 DDRB = 0 b 00001100; // 비트 0, 1, 2, 3 출력으로 지정 PORTC&=~0 b 00010000; // 1 번째 줄 선택 //PC 4 //A 4 _delay_us(5); if((PINC&0 x 1)==0)Key. Buf='A'; //328 = PC 0, 아두이노 = A 0 if((PINC&0 x 2)==0)Key. Buf='B'; //328 = PC 1, 아두이노 = A 1 if((PINC&0 x 4)==0)Key. Buf='C'; //328 = PC 2, 아두이노 = A 2 if((PINC&0 x 8)==0)Key. Buf='D'; //328 = PC 3, 아두이노 = A 3 PORTC|=0 b 00010000; // 1번째 줄 해제 PORTC&=~0 b 00100000; // 2 번째 줄 선택 //PC 5 //A 5 _delay_us(5); if((PINC&0 x 1)==0)Key. Buf='E'; //328 = PC 0, 아두이노 = A 0 if((PINC&0 x 2)==0)Key. Buf='F'; //328 = PC 1, 아두이노 = A 1 if((PINC&0 x 4)==0)Key. Buf='G'; //328 = PC 2, 아두이노 = A 2 if((PINC&0 x 8)==0)Key. Buf='H'; //328 = PC 3, 아두이노 = A 3 PORTC|=0 b 00100000; // 2번째 줄 해제 PORTB&=~0 b 00000100; // 3번째 줄 선택 //PB 2 //아두이노 = 10 _delay_us(5); if((PINC&0 x 1)==0)Key. Buf='I'; //328 = PC 0, 아두이노 = A 0 if((PINC&0 x 2)==0)Key. Buf='J'; //328 = PC 1, 아두이노 = A 1 if((PINC&0 x 4)==0)Key. Buf='K'; //328 = PC 2, 아두이노 = A 2 if((PINC&0 x 8)==0)Key. Buf='L'; //328 = PC 3, 아두이노 = A 3 PORTB|=0 b 00000100; // 3번째 줄 해제 PORTB&=~0 b 00001000; // 4번째 줄 선택 //PB 3 //아두이노 = 11 _delay_us(5); if((PINC&0 x 1)==0)Key. Buf='M'; //328 = PC 0, 아두이노 = A 0 if((PINC&0 x 2)==0)Key. Buf='N'; //328 = PC 1, 아두이노 = A 1 if((PINC&0 x 4)==0)Key. Buf='O'; //328 = PC 2, 아두이노 = A 2 if((PINC&0 x 8)==0)Key. Buf='P'; //328 = PC 3, 아두이노 = A 3 PORTB|=0 b 00001000; // 4번째 줄 해제 return Key. Buf; // Key 없으면 0 x. FF 리턴 } int main(void) { UART_INIT(); //UART 통신 초기화 while(1) { unsigned char Key. Scan_Buffer = Key. Scan(); if (Key. Scan_Buffer != 0 x. FF) UART_transmit(Key. Scan_Buffer); } } <- 복사


PC 3 PC 4 PC 5 PB 2 PB 3 PC 2 PC 1 PC 0

FND + 4 X 4 KEYPAD


#define F_CPU 16000000 UL #include <avr/io. h> #include <util/delay. h> #include "UART. h" // UART 라이브러리 사용 const int port_no[]={0 x 88, 0 x. EB, 0 x 4 C, 0 x 49, 0 x 2 B, 0 x 19, 0 x 18, 0 x. CB, 0 x 8, 0 x 9 }; unsigned char Key. Scan(void){ char Key. Buf=0 x. FF; // 키 값이 들어갈 버퍼, 초기값 0 x. FF PORTC |= 0 b 00110000 | 0 b 00001111; // 포트 초기값, 입력핀 내부풀업저항 사용 PORTB |= 0 b 00001100; DDRC |= 0 b 00110000; // 비트 0, 1, 2, 3 출력으로 지정 DDRB |= 0 b 00001100; // 비트 0, 1, 2, 3 출력으로 지정 // 포트 초기값, 입력핀 내부풀업저항 사용 PORTC&=~0 b 00010000; // 1번째 줄 선택 //PC 4 //A 4 _delay_us(5); if((PINC&0 x 1)==0)Key. Buf='0'; //328 = PC 0, 아두이노 = A 0 if((PINC&0 x 2)==0)Key. Buf='1'; //328 = PC 1, 아두이노 = A 1 if((PINC&0 x 4)==0)Key. Buf='2'; //328 = PC 2, 아두이노 = A 2 if((PINC&0 x 8)==0)Key. Buf='3'; //328 = PC 3, 아두이노 = A 3 PORTC|=0 b 00010000; // 1번째 줄 해제 PORTC&=~0 b 00100000; // 2번째 줄 선택 //PC 5 //A 5 _delay_us(5); if((PINC&0 x 1)==0)Key. Buf='4'; //328 = PC 0, 아두이노 if((PINC&0 x 2)==0)Key. Buf='5'; //328 = PC 1, 아두이노 if((PINC&0 x 4)==0)Key. Buf='6'; //328 = PC 2, 아두이노 if((PINC&0 x 8)==0)Key. Buf='7'; //328 = PC 3, 아두이노 PORTC|=0 b 00100000; // 2번째 줄 해제 = = A 0 A 1 A 2 A 3 PORTB&=~0 b 00000100; // 3번째 줄 선택 //PB 2 //아두이노 = 10 _delay_us(5); if((PINC&0 x 1)==0)Key. Buf='8'; //328 = PC 0, 아두이노 = A 0 if((PINC&0 x 2)==0)Key. Buf='9'; //328 = PC 1, 아두이노 = A 1 if((PINC&0 x 4)==0)Key. Buf='A'; //328 = PC 2, 아두이노 = A 2 if((PINC&0 x 8)==0)Key. Buf='B'; //328 = PC 3, 아두이노 = A 3 PORTB|=0 b 00000100; // 3번째 줄 해제 PORTB&=~0 b 00001000; // 4번째 줄 선택 //PB 3 //아두이노 = 11 _delay_us(5); if((PINC&0 x 1)==0)Key. Buf='C'; //328 = PC 0, 아두이노 = A 0 if((PINC&0 x 2)==0)Key. Buf='D'; //328 = PC 1, 아두이노 = A 1 if((PINC&0 x 4)==0)Key. Buf='E'; //328 = PC 2, 아두이노 = A 2 if((PINC&0 x 8)==0)Key. Buf='F'; //328 = PC 3, 아두이노 = A 3 PORTB|=0 b 00001000; // 4번째 줄 해제 return Key. Buf; // Key 없으면 0 x. FF 리턴 } int main(void) { <- 복사 UART_INIT(); //UART 통신 초기화 DDRD = 0 XFF & ~0 x 03; DDRB = 0 x 20 | 0 x 03; while(1) { unsigned char Key. Scan_Buffer = Key. Scan(); if (Key. Scan_Buffer == 0 x. FF); else if(Key. Scan_Buffer == '0') { PORTD = port_no[0]; PORTB = port_no[0] | 0 xfc; } else if(Key. Scan_Buffer == '1') { PORTD = port_no[1]; PORTB = port_no[1] | 0 xfc; } else if(Key. Scan_Buffer == '2') { PORTD = port_no[2]; PORTB = port_no[2] | 0 xfc; } else if(Key. Scan_Buffer == '3') { PORTD = port_no[3]; PORTB = port_no[3] | 0 xfc; } else if(Key. Scan_Buffer == '4') { PORTD = port_no[4]; PORTB = port_no[4] | 0 xfc; } else if(Key. Scan_Buffer == '5') { PORTD = port_no[5]; PORTB = port_no[5] | 0 xfc; } else if(Key. Scan_Buffer == '6') { PORTD = port_no[6]; PORTB = port_no[6] | 0 xfc; } else if(Key. Scan_Buffer == '7') { PORTD = port_no[7]; PORTB = port_no[7] | 0 xfc; } else if(Key. Scan_Buffer == '8') { PORTD = port_no[8]; PORTB = port_no[8] | 0 xfc; } else if(Key. Scan_Buffer == '9') { PORTD = port_no[9]; PORTB = port_no[9] | 0 xfc; } } }
- Slides: 31