본문 바로가기
코스웨어/16년 스마트컨트롤러

20160311_김도관_업무일지_Artmega_7Segment & LED8개 교차점멸

by 알 수 없는 사용자 2016. 3. 14.
728x90
반응형

1.7 Segment 출력


DK128의 7Segment 구조

J19와 7Segment는 다음과 같이 연결되어 있음




J19의 핀들을 각각 수동 연결 했을때 가지는 값

 Pin

 2진수

 0번 

 0001

1번

 0010

2번

 0100

3번

 1000

4번

 0001

5번

 0010

6번

 0100

7번

 1000


프로그래밍 제어


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#define DDRA     (*((volatile unsigned char *)0x21))
#define PORTA    (*((volatile unsigned char *)0x22))
#define PINA     (*((volatile unsigned char *)0x20))
 
int main(void)
{
    DDRA = 0xFF; //출력 high
    PORTA = 0x00;
    volatile unsigned int uiCnt;
    volatile unsigned int uiLoop;
    uiCnt = 0;
    
    // (34 / 10) << 4 비트연산으로 몫3을 왼쪽으로 밀어보냄
 
    while(1)
    {        
        PORTA = ((uiCnt / 10<< 4)|(uiCnt % 10); 
        for ( uiLoop = 0; uiLoop < 60000++uiLoop); //딜레이
        ++uiCnt;
 
        if(uiCnt > 99//99이상일때 값을 강제로 0으로
        {
            uiCnt = 0;    
        }
    }
    return 0;
}
cs


7번 : 모든 출력 high값 설정

8번 : PORTA의 모든 전류차단

9번,10번 : volatile을 선언해서 자동최적화 막음

17번 : 몫과 나머지를 구해서 OR연산자 적용

21번 : uiCnt의 값이 99가 넘어가는것을 방지


17번 ex)

uiCnt 값이 34일때 


uiCnt / 10 = 3 

몫이 3 이므로 2진수 0011 값을 가짐

이때 비트연산 << 4를 적용하면 0011 0000 


uiCnt % 10 = 4

나머지는 4이므로 2진수 0000 0100


몫과 나머지를 OR연산자 적용 


0011 0000

0000 0100

---------

0011 0100  


7Segment가 각각 34의 값을 표현함




2.LED 8 개 교차 점멸

Atmega 에서 출력은 high

dk128 의 출력도 high

이므로 어느한쪽은 low가 되어야만 LED가 on됨



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#define DDRA     (*((volatile unsigned char *)0x21))
#define PORTA     (*((volatile unsigned char *)0x22))
#define PINA     (*((volatile unsigned char *)0x20))
 
int main(void)
{
    DDRA = 0xFF;
    PORTA = 0x00// 00 켜짐 FF꺼짐
    volatile unsigned int uiCnt;
    volatile unsigned int iDir;
    volatile unsigned int uiPos;
 
    //PORTA = ~(0x01); // 비트 뒤집기 0xFE ~(비트연산)
 
    iDir = 1;
    uiPos = 0;
    while(1)
    {    
        if (1 == iDir)
        {
            PORTA = ~(1 << uiPos);    
        }else{
            PORTA = ~(0x0080 >> uiPos);
            
        }
 
        for(uiCnt = 0; uiCnt < 60000; uiCnt++);
        uiPos++;
 
        if(uiPos > 7//LED는 모두 8개
        {
            iDir = iDir*(-1); //역방향 정방향스위치 -1, +1
            uiPos = 0//초기화
        }
    }
    return 0;
}
cs


15번 : 일단 정방향(1)로 초기화

16번 : led 1번부터 시작 초기화

19번 : 1일때

21번 : 정방향 - 왼쪽으로 비트연산 후 값을 반전

23번 : 역방향 - 오른쪽으로 비트연산후 반전

28번 : uiPos가 7보다 클때까지 값을 계속 증가

30번 : 7보다 값이 클때

32번 : 7개를 다 처리한뒤 iDir이 -1의 값을 가지면 +1로 만들어서 19번줄로 

+1의 값을 가지고 있을때 -1로 만들어서 23번줄을 실행

33번 : uiPos에 0으로 led갯수를 초기화


ex )

~( 1 << uiPos) 일때 

uiPos가 0이면 반전시 1000 0000 의 값을 가지므로 첫번째 LED가 On


~(0x0080 >> uiPos)일때

uiPos가 0x80 즉 2진수 1000 0000이므로 반전시  0000 0001이됨




728x90