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

20160317_김도관_업무일지_LCD_특정시간출력

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

작업 :

LCD에 특정 시간 출력


개요 :

타이머 인터럽트를 통해 특정 시간 출력



lcd.h

지난번과 동일


lcd.c

지난번과 동일


tczero.h
1
2
3
4
5
6
7
8
9
10
11
#ifndef __TCZERO_H__
#define __TCZERO__
#include "main.h"
 
extern volatile unsigned int uiSec;
 
void __vector_21 (void) ;
void TCZero_Init(void);
void TCZero_MSDelay(unsigned int uiDtime);
 
#endif //__TCZERO_H_
cs

5번 : uiSec을 main.c에서도 사용가능하게 초기화

7~9번 : 각함수원형


tczero.c

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
#include "tczero.h"
 
volatile unsigned int uiMsec;
void TCZero_Init(void)
{
    TCCR0A  = (0 << COM0A1)|(0 << COM0A0)|(0<< COM0B1) |(0 << COM0B0) |(0 << WGM01)|(0 << WGM00); // 현재는X 출력파형 X
    TCCR0B  = (0 << FOC0A) |(0 <<  FOC0B)|(0 << WGM02) |(0 << CS02)   |(1 <<  CS01)|(1 <<  CS00); //분주 비64 // CS02 ,CS01 ,CS00  0,1,1 
    //TCNT0   = 0x00; 회로가 자동증가 시킴    
    OCR0A   = 250;     
    //OCR0B   = 0x00;
    TIMSK0  = (0 << OCIE0B)|(1 <<  OCIE0A)|(0 <<  TOIE0); // A만 사용
    //TIFR0   = 0x00;    
    return;
}
void __vector_21(void//0.001 초 마다 호출
{
    ++uiMsec;
}
 
void TCZero_MSDelay(unsigned int uiDtime)
{
    if( uiDtime > 1000// 인자검사 
    {
        uiDtime = 1000;
    }
    uiMsec = 0;
    while(uiMsec < uiDtime);
}
cs

3번 : uiMsec 외부에서는 접근 못하게 static 선언

6번 : 타이머 초기화함수

주파수

분주비

클럭당 소요시간

기준시간

카운터

16000000

1

0.00000006250000000000

0.001

16000.000

 

8

0.00000050000000000000

0.001

2000.000

 

64

0.00000400000000000000

0.001

250.000

 

256

0.00001600000000000000

0.001

62.500

 

1024

0.00006400000000000000

0.001

15.625

 

분주비 64에 의해서 TCCR0B,OCR0A 설정

TIMSK 타이머/카운터 0~2 에서 발생하는 인터럽트를 개별적으로 허용하는 기능을 수행하는 레지스터 OCIE0A만 사용
15번 : vector21 함수 0.001초마다 호출
20번 : 딜레이 함수 1초가 지나면 uiTime을 1초로 설정 uiMsec은 0으로 초기화
 uiDTime값이 uiMsec보다 크면 계속 동작


main.h

각각의 설정값들과 vector21 추가



main.c

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
#include "main.h"
#include "lcd.h"
#include "tczero.h"
 
int main(void)
{
    volatile unsigned int uiSec;
    char caTime[] = "00:00:00";
    LCD_Init();
    TCZero_Init();
    sei();
    uiSec = 401//% 60;
    
    while(1)
    {    
        caTime[7]='0'+uiSec%60%10;
        caTime[6]='0'+uiSec%60/10;
        caTime[4]='0'+uiSec/60%60%10;
        caTime[3]='0'+uiSec/60%60/10;
        caTime[1]='0'+uiSec/60/60%10;
        caTime[0]='0'+uiSec/60/60/10;
        
        LCD_Inst(LCD_HOME);
        LCD_Str(caTime);
        
    }
    return 0;
}
cs


08번 : caTime 배열 초기화

09번 ~10번 : LCD와 타이머 초기화 함수

13번 : uiSec 임의의 시간 입력

16~21 : 각각 시,분,초를 비트단위로 자르고 2자리숫자를 한자리로 맞춰서 배열에 넣음

23번 : lcd home 호출

24번 : 문자열을 lcd에 출력




728x90