Linux
VS-Code
C
#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
}
}