글
Hardware 2007. 1. 27. 05:40첫번째 AVR Atmega162 프로젝트~~ 뚜둥~
[결과]
mms://wm-002.cafe24.com/lovydayz/heart0005.mp4
[소스]
#include <mega162.h>
#include <delay.h>
#define NORMAL_DELAY 100 // delay per each led
#define MODE_DELAY 200 // mode change
#define LED_MAX 18 // total LED count
void InitLED();
void SetLED(int nPos, int nStatus);
void SetAllLED(int nStatus); // 전체 LED
void RightShiftLED(int nAcc, int bInc); // 가속도, 누적
void LeftShiftLED(int nAcc, int nInc);
void SplashLED(int nDelay, int nRepeat); // 번쩍 번쩍
void UpToDownLED(int nAcc);
void DownToUpLED(int nAcc);
void StarSplashLED(int nAcc, int nRepeat);
int n;
int nDelay; // for calcuration accelation
void main()
{
DDRA = 0xff;
PORTA = 0x00;
DDRB = 0xff;
PORTB = 0x00;
DDRC = 0xff;
PORTC = 0x00;
while(1)
{
// pattern 1
nDelay = 150;
RightShiftLED(-3,0);
nDelay = 200;
RightShiftLED(0,1);
nDelay = 150;
LeftShiftLED(-3,0);
nDelay = 200;
LeftShiftLED(0,1);
// pattern 2
SplashLED(500, 3);
// pattern 3
nDelay = 100;
UpToDownLED(100);
nDelay = 100;
DownToUpLED(100);
// pattern 4
nDelay = 300;
StarSplashLED(0,5);
}
}
void InitLED()
{
PORTA = 0x00;
PORTB = 0x00;
PORTC = 0x00;
SetAllLED(0); // 이거 없으니까 버그 생긴다-_-
n = 0;
}
void SetLED(int nPos, int nStatus)
{
switch ( nPos )
{
case 0: PORTA.0 = nStatus; break;
case 1: PORTA.1 = nStatus; break;
case 2: PORTA.2 = nStatus; break;
case 3: PORTA.3 = nStatus; break;
case 4: PORTA.4 = nStatus; break;
case 5: PORTA.5 = nStatus; break;
case 6: PORTA.6 = nStatus; break;
case 7: PORTC.0 = nStatus; break;
case 8: PORTC.1 = nStatus; break;
case 9: PORTC.2 = nStatus; break;
case 10: PORTC.3 = nStatus; break;
case 11: PORTC.4 = nStatus; break;
case 12: PORTC.5 = nStatus; break;
case 13: PORTC.6 = nStatus; break;
case 14: PORTC.7 = nStatus; break;
case 15: PORTB.0 = nStatus; break;
case 16: PORTB.1 = nStatus; break;
case 17: PORTB.2 = nStatus; break;
default: break;
}
}
void SetAllLED(int nStatus)
{
int nLedCnt;
for(nLedCnt=0;nLedCnt<LED_MAX;nLedCnt++)
{
SetLED(nLedCnt, nStatus);
}
}
// whole LED on or off ..
void SplashLED(int nDelay, int nRepeat)
{
int bStatus = 1;
int j=0;
InitLED();
for(j=0;j<nRepeat*2;j++)
{
SetAllLED(bStatus);
bStatus = bStatus == 0 ? 1 : 0;
delay_ms(nDelay);
}
}
void RightShiftLED(int nAcc, int bInc)
{
InitLED();
for(n=0;n<18;n++)
{
if ( 0 == bInc )
SetLED(n-1, 0);
SetLED(n, 1);
if ( 0 < nDelay+nAcc && 5000 >= nDelay+nAcc )
nDelay += nAcc;
delay_ms(nDelay);
}
// delay_ms(MODE_DELAY);
}
void LeftShiftLED(int nAcc, int bInc)
{
InitLED();
for(n=17;n>=0;n--)
{
if ( 0 == bInc )
SetLED(n+1, 0);
SetLED(n, 1);
if ( 0 < nDelay+nAcc && 5000 >= nDelay+nAcc )
nDelay += nAcc;
delay_ms(nDelay);
}
// delay_ms(MODE_DELAY);
}
void UpToDownLED(int nAcc)
{
InitLED();
for(n=0;n<9;n++)
{
SetLED(n,1);
SetLED(LED_MAX-n,1);
if ( 0 < nDelay+nAcc && 5000 >= nDelay+nAcc )
nDelay += nAcc;
delay_ms(nDelay);
}
SetLED(n,1);
delay_ms(nDelay);
}
void DownToUpLED(int nAcc)
{
InitLED();
SetLED(9,1);
delay_ms(nDelay);
for(n=8;n>=0;n--)
{
SetLED(n,1);
SetLED(LED_MAX-n,1);
if ( 0 < nDelay+nAcc && 5000 >= nDelay+nAcc )
nDelay += nAcc;
delay_ms(nDelay);
}
}
void StarSplashLED(int nAcc, int nRepeat)
{
int nStatus = 0;
int t=0;
InitLED();
for(t=0;t<nRepeat;t++)
{
for(n=0;n<18;n++)
{
if ( 0 == nStatus )
{
if ( 0 == n%2 )
SetLED(n,1);
else
SetLED(n,0);
}
else
{
if ( 1 == n%2 )
SetLED(n,1);
else
SetLED(n,0);
}
}
nStatus = nStatus == 0 ? 1 : 0;
if ( 0 < nDelay+nAcc && 5000 >= nDelay+nAcc )
nDelay += nAcc;
delay_ms(nDelay);
}
}
RECENT COMMENT