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가 각각 3과 4의 값을 표현함
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이됨
'코스웨어 > 16년 스마트컨트롤러' 카테고리의 다른 글
20160314_장진웅_업무일지_펌웨어 분석 (4) | 2016.03.15 |
---|---|
인터럽트 (0) | 2016.03.14 |
인터럽트 (0) | 2016.03.14 |
인터럽트 (1) | 2016.03.14 |
2016.03.08 민경호 업무일지 - 파일 입출력 (1) | 2016.03.14 |
20160310-허도경-CPU모듈2 (3) | 2016.03.13 |
20160311_송민규_업무일지_펌웨어분석 (6) | 2016.03.13 |
20160310_송민규_업무일지_데이터시트, 실습 (2) | 2016.03.13 |