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

2016_03_18_노태경_업무일지

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


스탭틱 전역변수 앞에 스태틱을 적으면 공유가 불가능하다
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);

 

728x90