스탭틱 전역변수 앞에 스태틱을 적으면 공유가 불가능하다
uiMsec 스태틱을 적는다.
익스턴외부의 현재 파일에는 존재하지 않아도 어딘가에 존재한다
코드 중복은 피할 수 있다. 전역변수가 겹칠 수도 있다.
#include "lcd.h"
void LCD_Init(void)
{
DDRC = (1<<RS)|(1<<RW)|(1<<EN); //C포트 3개 열기.(방향지정)
DDRA = 0xff; //다 열어야 하므로
CTL = (0<<RS)|(0<<RW)|(0<<EN); //열었던 C포트 3개 초기화(Low), 안 쓰는 상태로 만들기
BUS = 0x00; //BUS도 0으로 만드는 작업.
LCD_Inst(LCD_FUNC);
LCD_Inst(LCD_DSP);
LCD_Inst(LCD_ENT);
LCD_Inst(LCD_CUR);
LCD_Inst(LCD_CLR);
LCD_Inst(LCD_HOME); //이것들이 실행되어서 다 초기화 시킨다.
}
void LCD_Inst(unsigned char ucInst)
{
volatile unsigned int uiCnt;
CTL = CTL & ~(1<<RS); //원하는 자리에 0을 넣고 싶을 때. 11111111 -> 00010000(1>>RS).... 11111111 & 11101111(~) => 11101111
CTL = CTL & ~(1<<RW); //high, low 무엇이 와도 상관없다.
CTL = CTL & ~(1<<EN); //반드시 low가 와야한다. 그래야 글이 출력이 안됨. 0이나 1와 와야하는 이유?
BUS = ucInst;
for(uiCnt = 0; 30000>uiCnt; ++uiCnt); //위에 네줄 지속시키는 소스.
//CTL = CTL & ~(1<<RS);
//CTL = CTL & ~(1<<RW);
//CTL = CTL & ~(1<<EN);
//BUS = ucInst;
for(uiCnt = 0; 30000>uiCnt; ++uiCnt); //B구간
//CTL = CTL & ~(1<<RS);
//CTL = CTL & ~(1<<RW);
CTL = CTL | (1<<EN); //여기만 1로 바꿔주면 됨. 여기만 low로 바뀌니까. Enable 신호가 들어오면 LCD가 켜진다.
//BUS = ucInst;
for(uiCnt = 0; 30000>uiCnt; ++uiCnt); //C구간
//CTL = CTL & ~(1<<RS);
//CTL = CTL & ~(1<<RW);
CTL = CTL & ~(1<<EN);
//BUS = ucInst;
for(uiCnt = 0; 30000>uiCnt; ++uiCnt); //D구간
//CTL = CTL & ~(1<<RS);
//CTL = CTL & ~(1<<RW);
//CTL = CTL & ~(1<<EN);
//BUS = ucInst; //변함 없는 것들은 초기에만 입력하면 된다. 뒤로는 필요 없다.
for(uiCnt = 0; 30000>uiCnt; ++uiCnt); //E구간
}
void LCD_Data(unsigned char ucData)
{
volatile unsigned int uiCnt;
CTL = CTL | (1<<RS); //원하는 자리에 0을 넣고 싶을 때. 11111111 -> 00010000(1>>RS).... 11111111 & 11101111(~) => 11101111
CTL = CTL & ~(1<<RW); //high, low 무엇이 와도 상관없다.
CTL = CTL & ~(1<<EN); //반드시 low가 와야한다. 그래야 글이 출력이 안됨. 0이나 1와 와야하는 이유?
BUS = ucData;
for(uiCnt = 0; 20000>uiCnt; ++uiCnt); //위에 네줄 지속시키는 소스.
//CTL = CTL | (1<<RS);
//CTL = CTL & ~(1<<RW);
//CTL = CTL & ~(1<<EN);
//BUS = ucData;
for(uiCnt = 0; 20000>uiCnt; ++uiCnt); //B구간
//CTL = CTL | (1<<RS);
//CTL = CTL & ~(1<<RW);
CTL = CTL | (1<<EN); //여기만 1로 바꿔주면 됨. 여기만 low로 바뀌니까. Enable 신호가 들어오면 LCD가 켜진다.
//BUS = ucData;
for(uiCnt = 0; 20000>uiCnt; ++uiCnt); //C구간
//CTL = CTL | (1<<RS);
//CTL = CTL & ~(1<<RW);
CTL = CTL & ~(1<<EN);
//BUS = ucData;
for(uiCnt = 0; 20000>uiCnt; ++uiCnt); //D구간
//CTL = CTL | (1<<RS);
//CTL = CTL & ~(1<<RW);
//CTL = CTL & ~(1<<EN);
//BUS = ucData; //변함 없는 것들은 초기에만 입력하면 된다. 뒤로는 필요 없다.
for(uiCnt = 0; 20000>uiCnt; ++uiCnt); //E구간
}
void LCD_str(const char* cString)
{
while(0!=*cString)
{
LCD_Data(*cString);
++cString;
}
}
#include "tc0.h"
static volatile unsigned int uiMsec;
volatile unsigned int uiSec;
volatile unsigned int uiSState;
void Tc0_Init(void)
{
TCCR0A = (0<<COM0A1)|(0<<COM0A0)|(0<<COM0B1)|(0<<COM0B0)|(0<<WGM01)|(0<<WGM00);
TCCR0B = (0<<FOC0A)|(0<<FOC0B)|(0<<WGM02)|(0<<CS02)|(0<<CS01)|(0<<CS00);
// TCNT0 = 0x00; //회로가 사용
OCR0A = 250; //비교 기준값
// OCR0B = 0x00; //OCR0A 사용으로 인한 미사용
TIMSK0 = (0<<OCIE0B)|(1<<OCIE0A)|(0<<TOIE0);
// TIFR0 = 0x00; //회로가 사용
EICRA = (3<<ISC0)|(3<<ISC1)|(3<<ISC2);// 엣지 설정
EIMSK = (1<<INT0)|(1<<INT1)|(1<<INT2);
uiSState = STOP;
}
void __vector_21(void)
{
++uiMsec;
if(1000 <= uiMsec)
{
uiMsec = 0;
++uiSec;
}
}
void Tc0_MsDelay(unsigned int uiDtime)
{
if( 1000 < uiDtime)
{
uiDtime = 1000;
}
uiMsec = 0;
while(uiMsec <uiDtime);
'코스웨어 > 16년 스마트컨트롤러' 카테고리의 다른 글
와이파이 소비전력, 1만분의 1로 줄이는 기술 개발 (0) | 2016.03.19 |
---|---|
라즈베리파이 3 Review (2) | 2016.03.19 |
20160318_장진웅_업무일지_펌웨어 실습(타이머카운터2) (2) | 2016.03.18 |
20160318-조재찬-업무일지-펌웨어-타이머카운터(인터럽트) (2) | 2016.03.18 |
timer(start stop reset) (0) | 2016.03.18 |
timer(start, stop) (0) | 2016.03.18 |
타이머 소스(stop기능 없음) (0) | 2016.03.18 |
타이머 소스 (0) | 2016.03.18 |