#define F_CPU 16000000UL // 16Mhz에서 동작하는 ATmega128A를 실제시간으로 동작을 맞추기 위해 사용
#include <avr/io.h>
#include <util/delay.h>
#define LED_SEL1 (*(volatile unsigned char*)0xA000) //0xA000 -> LED(0~7)를 가리키는 주소
#define LED_SEL2 (*(volatile unsigned char*)0xB000) //0xB000 -> LED(8~15)를 가리키는 주소
unsigned char led1=0x00, led2=0x00; // 양수범위로 지정하기 위해서 사용
void io_init(void) //입력, 출력 초기화시키는 함수
{
MCUCR|=(1<<SRE)|(1<<SRW10);
XMCRA|=(1<<SRL2)|(0<<SRL1)|(0<<SRL0)|
(1<<SRW01)|(1<<SRW00)|(1<<SRW11);
XMCRB|0x00;
}
// ------------------------------------------------------------------------------트래픽2 함수
void traffic2 (char a, char b) //트래픽2 a=위치, b=온오프
{
if(a==25&b==1) led2 |=0x24; //16진수임 // 2진수로 나타내면 0b00100100
else led2 &=~0x24; //16진수임 // 2진수로 나타내면 0b00100100
if(a==26&b==1) led2 |=0x18; //16진수임 // 2진수로 나타내면 0b00011000
else led2 &=~0x18; //16진수임 // 2진수로 나타내면 0b00011000
LED_SEL2=~led2; // 회로도에서 신호가 0이 되어야지 LED에 불이 켜지므로 인버팅 시켜주는 것임.
}
// ------------------------------------------------------------------------------트래픽3 함수
void traffic3 (char a, char b) //트래픽3(LED 3개짜리) ON OFF 지정하는 함수 // 3개짜리 2세트
{
if(a==21)
{
if(b==1)
{
led1 |=0xc0; //16진수임 // 2진수로 나타내면 0b11000000
}
else led1 &=~0xc0; //16진수임 // 2진수로 나타내면 0b11000000
}
if(a==20)
{
if(b==1)
{
led1 |=0x20; //16진수임 // 2진수로 나타내면 0b00100000
led2 |=0x01; //16진수임 // 2진수로 나타내면 0b00100000
}
else
{
led1 &=~0x20; //16진수임 // 2진수로 나타내면 0b00100000
led2 &=~0x01; //16진수임 // 2진수로 나타내면 0b00100000
}
}
if(a==19)
{
if(b==1)
{
led1 |=0x10; //16진수임 // 2진수로 나타내면 0b00010000
led2 |=0x02; //16진수임 // 2진수로 나타내면 0b00000010
}
else
{
led1 &=~0x10; //16진수임 // 2진수로 나타내면 0b00010000
led2 &=~0x02; //16진수임 // 2진수로 나타내면 0b00000010
}
}
LED_SEL1=~led1;
LED_SEL2=~led2;
}
// ------------------------------------------------------------------------------트래픽4 함수
void traffic4 (char a, char b) // 트래픽4(LED 4개짜리) ON OFF 지정하는 함수
{
if(a==15&b==1) led1 |=0x01; //16진수임 // 2진수로 나타내면 0b00000001
else led1 &=~0x01; //16진수임 // 2진수로 나타내면 0b00000001
if(a==16&b==1) led1 |=0x02; //16진수임 // 2진수로 나타내면 0b00000010
else led1 &=~0x02; //16진수임 // 2진수로 나타내면 0b00000010
if(a==17)
{ if(b==1)
{
led1 |=0x04;
} //16진수임 // 2진수로 나타내면 0b00000100
else led1 &=~0x04;
} //16진수임 // 2진수로 나타내면 0b00000100
if(a==18)
{
if(b==1)
{
led1 |=0x08;
} //16진수임 // 2진수로 나타내면 0b00001000
else led1 &=~0x08; //16진수임 // 2진수로 나타내면 0b00001000
}
LED_SEL1=~led1; // 회로도에서 신호가 0이 되어야지 LED에 불이 켜지므로 인버팅 시켜주는 것임.
}
/* ------------------------------------------------------------------------------------------------
여기까지가 함수를 정의하는 부분이고, 아래쪽은 정의한 함수를 이용한 동작구현하기
1.청신호 각방향 10초
2.노란신호 2초
3.보행신호 마지막 3초 점멸시키기
*/
//동작 구현하기
int main(void)
{
int i;
io_init();
LED_SEL1=~led1; //led1 변수정의
LED_SEL2=~led2; //led2 변수정의
while(1)
{
traffic2(25,1); //트래픽2(보행신호) 빨간불
traffic3(21,1); //트래픽3(차량신호) 빨간불
traffic4(17,1); //트래픽4(삼거리신호) 초록불,왼쪽불
traffic4(18,1); //트래픽4(삼거리신호) 초록불,왼쪽불
_delay_ms(8000); //초록불 유지시간 8초
traffic4(17,0); //트래픽4(보행신호) 초록불오프
traffic4(18,0); //트래픽4(보행신호) 초록불오프
traffic4(16,1); //트래픽4(삼거리신호) 노란불
_delay_ms(2000); //노란불 유지시간 2초
//----------------------------------------------------------------------------
traffic4(16,0); //트래픽4(삼거리신호) 노란불오프
traffic2(26,1); //트래픽2(보행신호) 초록불
traffic3(21,0); //트래픽3(차량신호) 빨간불
traffic3(19,1); //트래픽3(차량신호) 초록불
traffic4(15,1); //트래픽4(삼거리신호) 빨간불
_delay_ms(7000); //초록불 유지시간 (10-3=7) 7 초
//---------------------------------------------------------------------------- 트래픽2 1초 초록불 점멸(주기 0.5초) 동작
traffic2(26,0); //트래픽2(보행신호) 초록불꺼짐
traffic3(19,1); //트래픽3(차량신호) 초록불
traffic4(15,1); //트래픽4(삼거리신호) 빨간불
_delay_ms(250); //초록불 유지시간 0.25 초
traffic2(26,1); //트래픽2(보행신호) 초록불꺼짐
traffic3(19,1); //트래픽3(차량신호) 초록불
traffic4(15,1); //트래픽4(삼거리신호) 빨간불
_delay_ms(250); //초록불 유지시간 0.25 초
traffic2(26,0); //트래픽2(보행신호) 초록불꺼짐
traffic3(19,1); //트래픽3(차량신호) 초록불
traffic4(15,1); //트래픽4(삼거리신호) 빨간불
_delay_ms(250); //초록불 유지시간 0.25 초
traffic2(26,1); //트래픽2(보행신호) 초록불꺼짐
traffic3(19,1); //트래픽3(차량신호) 초록불
traffic4(15,1); //트래픽4(삼거리신호) 빨간불
_delay_ms(250); //초록불 유지시간 0.25 초
//---------------------------------------------------------------------------- 노란불ON & 초록불2초 점멸
traffic3(19,0); //트래픽3(차량신호) 초록불
traffic3(20,1); //노란불
for(i=0; i<3; i++) //------------------------------------------------------보행 2초 깜빡
{
traffic2(26,0); //트래픽2(보행신호) 초록불꺼짐
traffic3(19,0); //트래픽3(차량신호) 초록불
traffic4(15,1); //트래픽4(삼거리신호) 빨간불
_delay_ms(250); //초록불 유지시간 0.25 초
traffic2(26,1); //트래픽2(보행신호) 초록불꺼짐
traffic3(19,0); //트래픽3(차량신호) 초록불
traffic4(15,1); //트래픽4(삼거리신호) 빨간불
_delay_ms(250); //초록불 유지시간 0.25 초
}
traffic3(20,0); //노란불
}
return 0;
}
'Cadence Certificate Specialist > AVR' 카테고리의 다른 글
각각의 FND 숫자 표시 (0) | 2014.06.18 |
---|---|
7SEGMENT를 이용한 숫자 이동 (0) | 2014.06.17 |
ATmega128 Datasheet /AVR KIT (0) | 2014.06.15 |