2019. 5. 6. 22:09ㆍ학교 수업 정리/Micom
RTOS 시간에 리모콘 - LCD - key_matrix에 이어 dot_matrix를 제어해보았다.
키 매트릭스와 유사한 형태로 구성되어있으며,
col값과 row값을 조정하여 총 8x8 64개의 led를 제어할 수 있다.
핀은 총 16개가 필요하며 아두이노 핀을 거의 다 쓰면 제어할 수 있다.
핀 순서는 위 그림대로 뒤죽박죽이여서 잘 보고 꼽아야 하고, col값에 저항을 연결한 후 전류를 넣어야 한다.
일단,
기본적으로 핀모드를 설정해준다.
그리고 나서
위의 2차원 배열인 b에다가 16진 코드로 각각 도트 매트릭스에 1~9의 모양을 띄게 하는 led를 켜놓도록 구성되어 있다.
16진 코드를 해석하는 for문과 총 16진코드 8개로 구성되어 있으니 그 for문을 8번 반복하는 for문으로 이루어 진다.
밑의 for문은 초기화 하는 코드이다.
맨 밑 z변수는 나중그림에서 유용하게 쓰인다
z는 방금 pwm에서 1밀리세크 마다 올라가고, 이 if문은 z가 100의 배수 마다 움직이니 0.1초마다 움직이는 셈이다.
이렇게 활용하면 굳이 두개의 pwm을 만들지 않아도 된다.
분명 더 좋은 방법이 있을 것 같지만 아직 학생인 내 머리로는 이정도 해답이 최선이였다...
맨위의 for는 배열을 쉬프트하여 led의 배열을 한칸 미루어 마치 전광판이 옆으로 움직이는 듯한 표현을 해준다.
k가 다 움직이면 숫자를 바꾸고 배열을 초기값으로 바꿔준다. 그이유는 한번하고 다 초기화 되기 때문이다.
숫자가 모두 완료되면 다시 0으로 바꾸고 초기값으로 바꾸어주어 다시 작동하게 초기화시킨다.
// COL 10~17
// ROW 2~9
char a = 0x0F;
int k,z,m,s;
char b[10][8] = {
{0x00,0x38,0x44,0x4c,0x54,0x64,0x44,0x38},
{0x00,0x10,0x30,0x50,0x10,0x10,0x10,0x7c},
{0x00,0x38,0x44,0x04,0x08,0x10,0x20,0x7c},
{0x00,0x38,0x44,0x04,0x18,0x04,0x44,0x38},
{0x00,0x08,0x18,0x28,0x48,0x7c,0x08,0x08},
{0x00,0x7c,0x40,0x78,0x04,0x04,0x44,0x38},
{0x00,0x38,0x40,0x40,0x78,0x44,0x44,0x38},
{0x00,0x7c,0x04,0x08,0x10,0x20,0x20,0x20},
{0x00,0x38,0x44,0x44,0x38,0x44,0x44,0x38},
{0x00,0x38,0x44,0x44,0x3c,0x04,0x44,0x38}
};
char b2[10][8] = {
{0x00,0x38,0x44,0x4c,0x54,0x64,0x44,0x38},
{0x00,0x10,0x30,0x50,0x10,0x10,0x10,0x7c},
{0x00,0x38,0x44,0x04,0x08,0x10,0x20,0x7c},
{0x00,0x38,0x44,0x04,0x18,0x04,0x44,0x38},
{0x00,0x08,0x18,0x28,0x48,0x7c,0x08,0x08},
{0x00,0x7c,0x40,0x78,0x04,0x04,0x44,0x38},
{0x00,0x38,0x40,0x40,0x78,0x44,0x44,0x38},
{0x00,0x7c,0x04,0x08,0x10,0x20,0x20,0x20},
{0x00,0x38,0x44,0x44,0x38,0x44,0x44,0x38},
{0x00,0x38,0x44,0x44,0x3c,0x04,0x44,0x38}
};
unsigned long per;
void setup() {
for(int i=2;i<18;i++)
{
pinMode(i,OUTPUT);
}
}
void loop() {
unsigned long cur = micros();
if(cur-per > 1000){
per=cur;
for(int j=0;j<8;j++){
digitalWrite(j+2,1);
for(int i=0;i<8;i++)
{
if(b[m][j]&(0x80 >> i)) digitalWrite(i+10,0);
else digitalWrite(i+10,1);
}
for(int i=0;i<8;i++)
{
digitalWrite(i+10,1);
}
digitalWrite(j+2,0);
}
z++;
if(z%100==0)
{
for(int i=0;i<8;i++){
b[m][i] >>=1;
}
k++;
if(k==8)
{
m++;
if(m==10) {
m=0;
for(int i=0;i<10;i++)
for(int j=0;j<8;j++)
b[i][j]=b2[i][j];
}
k=0;
}
}
}
}
백업용 코드
중형 브레드보드에서는 핀 꼽을 자리가 없어 저렇게 이중연결을 해야 자리가 생긴다.
'학교 수업 정리 > Micom' 카테고리의 다른 글
[arduino] 아두이노로 PWM 활용하여 리모콘으로 FND 제어 (0) | 2019.04.14 |
---|