linux.png

Linux

vscode.png

VS-Code

c.png

C

Flow Chart 및 회로도

기능별 Code

8-bit & 16-bit Timer Code

Servo Code

FND Code

LED Code

Button Code

ADC Code

main.c, def.h

#ifndef __AP_H__
#define __AP_H__

#include "../common/def.h"

#include "../driver/adc.h"
#include "../driver/button.h"
#include "../driver/fnd.h"
#include "../driver/lcd.h"
#include "../driver/led.h"
#include "../driver/servo.h"
#include "../driver/timer8b.h"
#include "../driver/timer16b.h"
#include "../driver/uart0.h"        // falling 방식 UART header
#include "../driver/uart0_int.h"    // Interrupt 방식 UART header

void apInit();
void apMain();

#endif /* __AP_H__ */
// ap.c
#include "ap.h"

void apInit() {

}

void apMain() {

    t8bInit();                  // 8-bit Timer Fast PWM, Clear
    t8bPrescaler(1, 0, 0);      // CS02, CS01, CS00 100, 64분주

    t16bInit();                 // 16-bit Timer Fast PWM, Clear, TOP 4999, 50Hz
    t16bPrescaler(0, 1, 1);     // CS02, CS01, CS00 011, 64분주

    SERVO servo;
    servoInit(&servo);
    TIMER16B_OCR = servo.servoPos;      // Servo 초기 위치 적용

    // Button 1 ~ 4 의 구조체 변수 선언
    // Button 의 위치 등과 btnEnabled 이라는 상태 변수 포함
    BUTTON btn1;
    BUTTON btn2;
    BUTTON btn3;
    BUTTON btn4;

    // Button 1 ~ 4 의 변수 초기화
    buttonInit(&btn1, &BUTTON_DDR, &BUTTON_PIN, BUTTON_1);
    buttonInit(&btn2, &BUTTON_DDR, &BUTTON_PIN, BUTTON_2);
    buttonInit(&btn3, &BUTTON_DDR, &BUTTON_PIN, BUTTON_3);
    buttonInit(&btn4, &BUTTON_DDR, &BUTTON_PIN, BUTTON_4);
    btn1.btnEnabled = 1;        // Button 1 On 을 초기값으로 주어 STOP 상태로 시작
    btnPrev = 1;                // 이전 Button 상태를 기억해 회전 상태에서 FND, LED 출력 유지를 위한 변수

    fndInit();
    fnd4Init();

    ledInit();
    uint8_t ledLow = 20;        // Low 일때 delay 값, 50 ms * ledLow
    uint8_t ledHigh = 5;        // High 일때 delay 값, 50 ms * ledHigh

    adcInit();
    uint16_t potVal;
    uint16_t potVal_t;

    while (1) {
        adcConvert();
        potVal = ADC;
        potVal_t = adcTrans(potVal, 10);

        // Button 1 이 눌리면 Button 1 상태 On, 나머지 버튼과 Servo Off, 이전 버튼 상태는 1 기억
        if (buttonGetState(&btn1) == btnRELEASED) {
            btn1.btnEnabled = 1;
            btn2.btnEnabled = 0;
            btn3.btnEnabled = 0;
            btn4.btnEnabled = 0;
            servo.servoEnabled = 0;
            btnPrev = 1;
        }
        
        // Button 1 이 눌린 상태라면 다른 버튼이 눌리기 전까지 아래 동작 계속 실행
        if (btn1.btnEnabled == 1) {
            TIMER8B_OCR = 0;                    // FAN 0%

            fndDisplay_CC(0, 0);                            // FND 0 출력
            fnd4Display_CC(1, 18, 1, 19, 1, 14, 1, 15);     // FND4 STOP 출력

            ledOff();
        }

        // Button 2 눌리면 Button 2 상태 On, 나머지 버튼 Off, 이전 버튼 상태는 2 기억
        if (buttonGetState(&btn2) == btnRELEASED) {
            btn1.btnEnabled = 0;
            btn2.btnEnabled = 1;
            btn3.btnEnabled = 0;
            btn4.btnEnabled = 0;
            btnPrev = 2;
        }

        // Button 2 눌린 상태라면 다른 버튼이 눌리기 전까지 아래 동작 계속 실행
        if (btn2.btnEnabled == 1) {
            TIMER8B_OCR = 102 + potVal_t;       // FAN 40% + ADC 변환 값
            
            fndDisplay_CC(0, 1);                            // FND 1 출력
            fnd4Display_CC(1, 11, 1, 14, 1, 22, 2, 0);      // FND4 LOW 출력
            ledLeftShift(0, ledLow);                            // LED 왼쪽 이동, d 변수로 시간 조절
        }

        // Button 3 눌리면 Button 3 상태 On, 나머지 버튼 Off, 이전 버튼 상태는 3 기억
        if (buttonGetState(&btn3) == btnRELEASED) {
            btn1.btnEnabled = 0;
            btn2.btnEnabled = 0;
            btn3.btnEnabled = 1;
            btn4.btnEnabled = 0;
            btnPrev = 3;
        }

        // Button 3 눌린 상태라면 다른 버튼이 눌리기 전까지 아래 동작 계속 실행
        if (btn3.btnEnabled == 1) {
            TIMER8B_OCR = 204 + potVal_t;       // FAN 80% + ADC 변환 값

            fndDisplay_CC(0, 2);                            // FND 2 출력
            fnd4Display_CC(1, 7, 1, 8, 1, 6, 1, 7);         // FND4 HIGH 출력
            ledLeftShift(0, ledHigh);                            // LED 왼쪽 이동, d 변수로 시간 조절
        }

        if (buttonGetState(&btn4) == btnRELEASED) {
            btn1.btnEnabled = 0;
            btn2.btnEnabled = 0;
            btn3.btnEnabled = 0;
            btn4.btnEnabled = 1;
            servo.servoEnabled = !servo.servoEnabled;
        }

        // Button 4 눌린 상태 + servo 작동 상태면 다른 버튼이 눌리기 전까지 아래 동작 계속 실행
        if (btn4.btnEnabled == 1 && servo.servoEnabled == 1) {
            fnd4Display_CC(1, 18, 1, 15, 1, 8, 1, 13);      // FND4 SPIN 출력

            // servo 작동해도 이전 상태에 따라 LED 출력은 유지
            switch (btnPrev) {
                case 1:     // 이전에 눌렸던 Button 상태에 따라 LED 출력 유지
                ledOff();
                break;
            
                case 2:     
                ledLeftShift(0, ledLow);
                break;

                case 3:
                ledLeftShift(0, ledHigh);
                break;
            }
        }

        // Button 4 눌린 상태 + servo 미작동 상태면 다른 버튼이 눌리기 전까지 아래 동작 계속 실행
        else if (btn4.btnEnabled == 1 && servo.servoEnabled == 0){
            
            // servo 작동 정지하면 이전 상태에 따라 FND4, LED 출력
            switch (btnPrev) {
                case 1:     // 이전에 눌렸던 Button 상태에 따라 FND4, LED 출력 유지
                fnd4Display_CC(1, 18, 1, 19, 1, 14, 1, 15);
                ledOff();
                break;
            
                case 2:
                fnd4Display_CC(1, 11, 1, 14, 1, 22, 2, 0);
                ledLeftShift(0, ledLow);
                break;

                case 3:
                fnd4Display_CC(1, 7, 1, 8, 1, 6, 1, 7);
                ledLeftShift(0, ledHigh);
                break;
            }
        }

        // Servo 작동 상태면 회전 실행
        if (servo.servoEnabled == 1) {
            servoMove180(&servo);
            TIMER16B_OCR = servo.servoPos;
        }

        _delay_ms(10);      // 동작 반영 시간을 주기 위해 delay
    }
}