클럭: 동작 주파수
주파수: 초당 진동수
∴클럭은 시간을 가진다.
분주비 64
분주비 결정 레지스터
64분주비로 250번 카운트시 0.001초 지났음을 확인
Compare:비교방식-일정숫자에 다다르면 0에서 시작
overflow방식을 compare방식으로 하려면 시작 숫자를 올려서 맞추면 된다.
ex)
왼쪽과 오른쪽 방식은 다르지만 결과는 똑같다.
--------------------------------------------------------------------------------------------------------------------------
lcd.c
#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);
CTL = CTL & ~(1<<RW);
CTL = CTL & ~(1<<EN);
BUS = ucInst;
for(uiCnt = 0; 30000>uiCnt; ++uiCnt); //A구간
//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; 30000>uiCnt; ++uiCnt); //위에 네줄 지속시키는 소스.
//CTL = CTL | (1<<RS);
//CTL = CTL & ~(1<<RW);
//CTL = CTL & ~(1<<EN);
//BUS = ucData;
for(uiCnt = 0; 30000>uiCnt; ++uiCnt); //B구간
//CTL = CTL | (1<<RS);
//CTL = CTL & ~(1<<RW);
CTL = CTL | (1<<EN); //여기만 1로 바꿔주면 됨. 여기만 low로 바뀌니까. Enable 신호가 들어오면 LCD가 켜진다.
//BUS = ucData;
for(uiCnt = 0; 30000>uiCnt; ++uiCnt); //C구간
//CTL = CTL | (1<<RS);
//CTL = CTL & ~(1<<RW);
CTL = CTL & ~(1<<EN);
//BUS = ucData;
for(uiCnt = 0; 30000>uiCnt; ++uiCnt); //D구간
//CTL = CTL | (1<<RS);
//CTL = CTL & ~(1<<RW);
//CTL = CTL & ~(1<<EN);
//BUS = ucData; //변함 없는 것들은 초기에만 입력하면 된다. 뒤로는 필요 없다.
for(uiCnt = 0; 30000>uiCnt; ++uiCnt); //E구간
}
void LCD_STR(const char *cString)
{
while(0!=*cString)
{
LCD_Data (*cString);
++cString;
}
}
lcd.h
#ifndef __LCD_H__
#define __LCD_H__
#include"main.h"
#define RS 4
#define RW 5
#define EN 6
#define BUS PORTA
#define CTL PORTC
void LCD_Init(void);
//void LCD_Inst(void);
void LCD_Inst(unsigned char ucInst);
void LCD_Data(unsigned char ucData);
void LCD_STR(const char * cString);
#define LCD_CLR 0x01
#define LCD_HOME 0x02 //or 0X03
#define LCD_ENT 0x06 //S:0Shift OFF, I/D:1 Increase Mode
#define LCD_DSP 0x0F //D:1 /Display On C:1 Cursor on B:1 Blink On
#define LCD_CUR 0x14 //S/C:0 Shift Cursor OFF R/L:1
#define LCD_FUNC 0x38 //DL:1 Data length 8bit N:1 2Line F:0 Font 5X8
#endif //__MAIN_H__
main.c
#include "main.h"
#include "lcd.h"
#include "tc0.h"
int main(void)
{
char caTime[] = "00:00:00";
volatile unsigned int uiSec;
LCD_Init();
//LCD_Data('A');
//LCD_STR("APPLE");
TC0_Init();
sei();
LCD_STR(caTime);
uiSec=3673;
while(1)
{
//LCD_Data('A');
//TC0_MSDelay(1000);
//caTime[7]='0'+3//askii code+3;
caTime[7]='0'+((uiSec%60)%10);
caTime[6]='0'+(uiSec/60);
caTime[3]='0'+(((uiSec/60)%60)/10);
caTime[4]='0'+(((uiSec/60)%60)%10);
//caTime[1]='0'+((uiSec%60)%60);
//caTime[0]='0'+((uiSec%60)%60);
LCD_Inst(LCD_HOME);
LCD_STR(caTime);
}
return 0;
}
#define __MAIN_H__
#define DDRA (*((volatile unsigned char *)0x21))
#define PORTA (*((volatile unsigned char *)0x22))
#define PINA (*((volatile unsigned char *)0x20))
#define DDRC (*((volatile unsigned char *)0x27))
#define PINC (*((volatile unsigned char *)0x26))
#define EICRB (*((volatile unsigned char *)0x6A))
#define SREG (*((volatile unsigned char *)0x5F))
#define EIMSK (*((volatile unsigned char *)0x3D))
#define EIFR (*((volatile unsigned char *)0x3C))
#define TIMSK0 (*((volatile unsigned char *)0x6E))
#define OCR0B (*((volatile unsigned char *)0x48))
#define OCR0A (*((volatile unsigned char *)0x47))
#define TCNT0 (*((volatile unsigned char *)0x46))
#define TCCR0B (*((volatile unsigned char *)0x45))
#define TCCR0A (*((volatile unsigned char *)0x44))
#define COM0A0 6
#define COM0B1 5
#define COM0B0 4
#define WGM01 1
#define WGM00 0
#define INT6 6
#define INT5 5
#define INT4 4
#define INT3 3
#define INT2 2
#define INT1 1
#define INT0 0
#define ISC6 4
#define ISC5 2
#define ISC4 0
#define ISC3 6
#define ISC2 4
#define ISC1 2
#define ISC0 0
#define FOC0B 6
#define WGM02 3
#define CS02 2
#define CS01 1
#define CS00 0
#define OCIE0A 1
#define TOIE0 0
#define sleep() __asm__ __volatile__ ( "sleep" "\n\t" :: )
void Pont_Init(void);
void INT_Init(void);
void __vector_1 (void) __attribute__((signal, used, externally_visible)); //INT0
void __vector_2 (void) __attribute__((signal, used, externally_visible));
void __vector_21 (void) __attribute__((signal, used, externally_visible));
volatile unsigned int uiMsec;
{
//TCCR0A = (0<<COM0A1)|(0<<COM0A0)|(0<<COM0B1)|(0<<COM0B0)|(0<<WGM01)|(0<<WGM00);//PWM에서봅시다.
TCCR0B = (0<<FOC0A)|(0<<FOC0B)|(0<<WGM02)|(0<<CS02)|(1<<CS01)|(1<<CS00);
//TCNT0 = 0X00;
OCR0A = 250;
//OCR0B = 0X00; //OCR0A와 비교.
TIMSK0 = (0<<OCIE0B)|(1<<OCIE0A)|(0<<TOIE0);
//TIRF0 = 0X00;
}
void __vector_21 (void)//0.001초마다 호출
{
++uiMsec;
}
{
if(uiDtime>1000)
{
uiDtime=1000;
}
uiMsec=0;
while(uiMsec<uiDtime);
}
#define __TC0_H__
#include"main.h"
void __vector_21 (void);
void TC0_MSDelay(unsigned int uiDtime);
'코스웨어 > 16년 스마트컨트롤러' 카테고리의 다른 글
2016_03_24_업무일지_노태경 (0) | 2016.03.24 |
---|---|
2016 03 24 업무일지 오전 저항과 써미스터 (0) | 2016.03.24 |
20160323_김가연_업무일지_ADC (0) | 2016.03.24 |
20160323_장진웅_업무일지_컨버터, 타이밍도,ADC (0) | 2016.03.24 |
20160323_조재찬_업무일지_펌웨어(ADC) (0) | 2016.03.24 |
20160323-업무보고-이보원-ADC – Analog to Digital Converter (0) | 2016.03.24 |
20160323_업무일지_박진한_ADC (1) | 2016.03.24 |
ADC (0) | 2016.03.23 |