Open changheepark-dev opened 10 months ago
시계 끝 ( 시계 설정 전 )
/* * 프로그램 이름 : 11주차 과제 * 프로그램 내용 : LCD 스위치 버저 LED 인터럽트 타이머 UART 통신 * Created: 2023-11-13 오후 6:17:00 * Author : 1922288 박창희 * 마지막 수정일 : 2023-11-18 오후 10:38:00 * 마지막 수정내용 : 키보드 3입력 */ //15 14 13 11 7 #define F_CPU 16000000UL // 16MHz의 오실레이터를 사용 #include <avr/io.h> //입출력 포트 사용을 위한 헤더 include #include <avr/delay.h> //딜레이 사용을 위한 헤더 inlcude #include <avr/interrupt.h> //인터럽트 사용을 위한 헤더 include #include "lcd.h" //LCD 사용을 위한 헤더 include -> " "외부의 파일을 include /* 타이머 */ int Timer = 0, timer = 0; ISR(TIMER0_OVF_vect) { timer++; if (timer == 5) { Timer++; timer = 0; } TCNT0=6; } void TIMER0_Init() { TCCR0=5; TIMSK=1; sei(); //전역인터럽트 활성화 } int h = 0, m = 0, s = 0; ISR(TIMER1_COMPA_vect) { s++; if (s > 59) {m++, s = 0;} if (m > 59) {h++, m = 0;} if (h > 23) {h = 0;} } void TIMER1_Init() { TCCR1A = (0<<WGM11) | (0<<WGM10); TCCR1B = (0<<WGM13) | (1<<WGM12) | (1<<CS12) | (0<<CS11) | (1<<CS10); TIMSK |= (1 << OCIE1A); OCR1A=15624; sei(); //전역인터럽트 활성화 } /* 타이머 끝 */ /*AD 변환*/ int readAnalog(unsigned char ch, char x, char y) // AD 채널 값을 받아서 AD를 값을 읽어오는 함수. { unsigned char Buff[8] = " 0"; ADCSRA = 1<<ADEN | 0b111<<ADPS0; // 128 분주율로 AD를 사용 인에이블 설정 ADMUX = 0b01<<REFS0 | ch<<MUX0; // AREF를 기준전압으로 사용, AREF와 GND사이에 콘덴서 접속 ADCSRA |= 1<<ADSC; // A/D 변환 시작 Buff[0] = '0'+((ADC %10000)/1000); Buff[1] = '0'+((ADC %1000)/100); Buff[2] = '0'+((ADC %100)/10); Buff[3] = '0'+(ADC %10); for (unsigned char i=0; i<=2; i++) { if (Buff[i] != '0') { break; } Buff[i]=' '; } Buff[4]= '\0'; LCDMove(y, x); LCDPuts(Buff); } /*숫자 변환*/ int LCD_nNum1(unsigned int NUM) { unsigned char Buff[8] = "0"; Buff[0] = '0'+((NUM %1000000)/100000); Buff[1] = '0'+((NUM %100000)/10000); Buff[2] = '0'+((NUM %10000)/1000); Buff[3] = '0'+((NUM %1000)/100); Buff[4] = '0'+((NUM %100)/10); Buff[5] = '.'; Buff[6] = '0'+(NUM %10); Buff[7] = 's'; LCDPuts(Buff); } int LCD_nNum3(unsigned int NUM) { unsigned char Buff[8] = "0"; Buff[0] = '0'+((NUM %100)/10); Buff[1] = '0'+(NUM %10); LCDPuts(Buff); } /*숫자 변환 끝*/ char display = 16; int main(void) { static char string1[]="- 2 team : DEA -"; static char string2[]="Start with 1 - 4"; static char string3[]="Resistance"; static char string4[]="Watch"; static char string5[]="Stopwatch"; static char string6[]="Timer"; DDRB |= 0xf0; //7~4 LED 3~0 스위치가 연결되어 있다. 상위 니블 7~4까지는 출력을로 설정 하위 니블 3~0 입력으로 설정 DDRG |= (1<<PG3); //PG3번에 buzzer 연결되어있음 UDR0 |= 0x00; MCU_Init(); //LCD 사용을 위한 MCU 설정 LCDInit(); //LCD 사용을 위한 초기화 설정 TIMER0_Init(); TIMER1_Init(); while (PINB == 15) { LCDMove(0,0); //표시할 문자의 위치를 선택->HOME 위치 LCDPuts(string1); LCDMove(1,0); //LCD의 두번쨰 줄 LCDPuts(string2); } LCDInit(); //main while (1) { // 화면 선택 if ((PINB & 15) != 15) { display = (PINB & 15); PORTB = ~(display << 4); LCDInit(); } LCDMove(0,0); // 1 if(display == 14) { LCDPuts(string3); readAnalog(6, 0, 1); } // 2 else if(display == 13) { LCDPuts(string4); LCDMove(1,0); unsigned char wc[9] = "0"; wc[0] = '0'+((h %100)/10); wc[1] = '0'+(h %10); wc[2] = 'h'; wc[3] = ' '; wc[4] = '0'+((m %100)/10); wc[5] = '0'+(m %10); wc[6] = 'm'; wc[7] = ' '; wc[8] = '0'+((s %100)/10); wc[9] = '0'+(s %10); wc[10] = 's'; LCDPuts(wc); } // 3 else if(display == 11) { //LCDPuts(string5); LCD_nNum1(OCR1A); LCDMove(1,0); LCD_nNum1(TCNT1); } // 4 else if(display == 7) { //LCDPuts(string6); LCDMove(0,0); LCD_nNum1(OCR1AL); LCDMove(1,0); LCD_nNum1(Timer); } else { } } }
시계 끝 ( 시계 설정 전 )