릴레이 부저 제어 테스트
LED_CON과 SET_CON은 각각 0x8000 및 0x8100의 주소를 할당받고, 부호 없는 문자형 포인터로 취급하며, 이러한 주소는 외부 I/O를 제어하는 데 사용한다.
#define LED_CON *((unsigned char *)0x8000)
#define SET_CON *((unsigned char *)0x8100)
Buzz, Relay1, Relay2는 특정 핀 번호에 할당하며, 그다음의 라인에서는 이러한 핀을 켜고 끄기 위한 비트 마스크를 정의한다.
#define Buzz 6
#define Relay1 0
#define Relay2 1
#define Relay1_on 1<<Relay1
#define Relay2_on 1<<Relay2
#define Buzz_on 1<<Buzz
#define Relay1_off 0<<Relay1
#define Relay2_off 0<<Relay2
#define Buzz_off 0<<Buzz
포트 B의 핀 0 및 1에 연결된 두 개의 스위치의 상태에 대한 별칭을 정의한다.
#define SW1 PINB.0
#define SW2 PINB.1
MCUCR 레지스터를 설정하여 외부 메모리 및 I/O 제어를 활성화한다.
일반적으로 메모리에 매핑된 I/O와 관련이 있다.
void main() {
MCUCR = 0x80; // 외부 메모리와 I/O 제어를 활성화합니다.
외부 I/O를 0으로 설정하여 LED 및 제어 레지스터를 초기화한다.
LED_CON = 0x00;
SET_CON = 0x00;
main 함수로서 무한 루프에 진입하고 SW1 및 SW2의 상태를 확인하며, 만약 SW1이 눌리면 LED를 켜고 Relay1, Relay2, 및 부저를 짧은 시간 동안 활성화한 다음 끄고 SW2가 눌리면 유사한 동작을 수행하지만 다른 설정으로 수행한다. delay_ms(100) 함수는 100 밀리초의 지연을 발생할 때 사용한다.
while (1) {
if (!SW1) { // 만약 SW1이 눌렸다면
LED_CON = 0x01;
SET_CON = Relay1_on | Relay2_on | Buzz_on;
delay_ms(100); // 100ms 지연
SET_CON = Relay1_on | Relay2_on | Buzz_off;
LED_CON = 0x00;
}
if (!SW2) { // 만약 SW2이 눌렸다면
LED_CON = 0x02;
SET_CON = Relay1_off | Relay2_off | Buzz_on;
delay_ms(100); // 100ms 지연
SET_CON = Relay1_off | Relay2_off | Buzz_off;
LED_CON = 0x00;
}
}
}
전체 코드
#include <mega128.h>
#include <delay.h>
// External I/O 레지스터 정의
#define LED_CON *((unsigned char *)0x8000)
#define SET_CON *((unsigned char *)0x8100)
// 핀 정의
#define Buzz 6
#define Relay1 0
#define Relay2 1
#define Relay1_on 1 << Relay1
#define Relay2_on 1 << Relay2
#define Buzz_on 1 << Buzz
#define Relay1_off 0 << Relay1
#define Relay2_off 0 << Relay2
#define Buzz_off 0 << Buzz
// 스위치 정의
#define SW1 PINB.0
#define SW2 PINB.1
void main() {
// 외부 메모리와 I/O 제어 활성화
MCUCR = 0x80;
// 외부 I/O 초기화
LED_CON = 0x00;
SET_CON = 0x00;
while (1) {
// 만약 SW1이 눌렸다면
if (!SW1) {
// LED를 켜고 Relay1, Relay2, 그리고 부저를 짧은 시간 동안 활성화
LED_CON = 0x01;
SET_CON = Relay1_on | Relay2_on | Buzz_on;
delay_ms(100); // 100ms의 지연 도입
// Relay1, Relay2, 그리고 부저를 끄고 LED를 끔
SET_CON = Relay1_on | Relay2_on | Buzz_off;
LED_CON = 0x00;
}
// 만약 SW2이 눌렸다면
if (!SW2) {
// 다른 LED를 켜고 Relay1, Relay2, 그리고 부저를 짧은 시간 동안 활성화
LED_CON = 0x02;
SET_CON = Relay1_off | Relay2_off | Buzz_on;
delay_ms(100); // 100ms의 지연 도입
// Relay1, Relay2, 그리고 부저를 끄고 LED를 끔
SET_CON = Relay1_off | Relay2_off | Buzz_off;
LED_CON = 0x00;
}
}
}
728x90
'C, C++ > 임베디드 시스템' 카테고리의 다른 글
임베디드시스템 포토센서를 활용한 외부 인터럽트 제어 (0) | 2023.11.18 |
---|---|
임베디드시스템 스위치 버튼을 통한 LED 응용 (2) | 2023.11.09 |
임베디드시스템 간단한 택시미터기 (0) | 2023.11.08 |
임베디드시스템 FND 숫자 증가 제어 (1) | 2023.11.08 |
임베디드 시스템 LED 쉬프트 출력 (0) | 2023.11.08 |