changheepark-dev / Digital-System-Lab

Atmega128
0 stars 0 forks source link

11-21-2023 #8

Open changheepark-dev opened 10 months ago

changheepark-dev commented 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 {

        }

    }
}