BASIC4MCU | 질문게시판 | atmega128 lcd
페이지 정보
작성자 이노 작성일2020-06-23 18:36 조회5,411회 댓글1건
https://www.basic4mcu.com/bbs/board.php?bo_table=gac&wr_id=12956
본문
#include <mega128.h>
#include <delay.h>#define TRIGGER PORTD.0
flash unsigned char seg_pat[10]= {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};
flash unsigned char seg_on[4] = {0x08, 0x04, 0x02, 0x01};unsigned char echo_st = 0;
unsigned char dsp_no = 0; // 세그먼트 표시 번호
unsigned int dist = 0, cnt = 0;
unsigned int N1000, N100, N10, N1;void Distance_out(void); // 거리 출력 자리값 추출void main(void)
{
DDRB = 0xFF; // 포트 B 출력 설정
DDRD = 0b11111101; // 포트 D 출력 설정(PD1만 입력)
DDRG = 0xFF; // 포트 G 출력 설정
PORTB = 0x0;
PORTD = 0x0;
TRIGGER = 0;
TIMSK = 0b01000001; // TOIE0=1, TOIE2=1, 타/카0/2 오버플로우 인터럽트 인에이블
TCCR0 = 0b00000111; // 타/카0 일반모드, 1024분주
ASSR = 0x0;
TCNT0 = 176; // 1/16us * 1024분주 * (256 - 176) = 5.12ms
TCCR2 = 0b00000000; // 타/카2 일반모드 정지
TCNT2 = 138; // 1/16us * 8분주 * (256 - 138) = 58us
SREG = 0x80;
while(1){
EICRA = 0b00001100; // 외부인터럽트1 상승에지
EIMSK = 0b00000010; // 외부인터럽트1 인에이블
echo_st = 0;
cnt = 0;
TRIGGER = 1; // 초음파 센서 ECHO신호 출력
delay_us(15);
TRIGGER = 0;
while(echo_st != 2); // ECHO=1 또는 측정범위 벗어날 때까지 대기
dist = cnt;
Distance_out();
delay_ms(100);
}
}// 표시할 새 거리측정값
void Distance_out(void)
{
int buf;
N1000 = dist / 1000; // m 10자리 추출
buf = dist % 1000;N100 = buf / 100; // m 1자리 추출
buf = buf % 100;
N10 = buf / 10; // cm 10자리 추출
N1 = buf % 10; // cm 1자리 추출
}// 거리측정값 표시(5.12ms마다 세그먼트 한 개씩 표시)
// 1/16us * 1024 * (256 -176) = 5.12ms
interrupt [TIM0_OVF] void time0(void)
{
unsigned char pat;
TCNT0 = 176;
// 표시할 위치의 표시값
if(dsp_no == 0) pat = N1;
else if(dsp_no == 1) pat = N10;
else if(dsp_no == 2) pat = N100;
else pat = N1000;
// 7-세그먼트 표시
PORTG = seg_on[dsp_no]; // 표시할 7-Segment ON
PORTB = (seg_pat[pat] & 0x70) | (PORTB & 0x0F); // e, f, g 부분 표시 -> PB4-PB6
PORTD = ((seg_pat[pat] & 0x0F) << 4) | (PORTD & 0x0F); // a, b, c, d 부분 표시 -> PD4-PD6
dsp_no = (dsp_no + 1) % 4;
}// 초음파 센서 거리 측정
// 1/16us * 8 * (256 -138) = 59us
interrupt [TIM2_OVF] void time2(void)
{
TCNT2 = 138;
cnt++;
if(cnt > 300) echo_st = 2;
}
// 외부인터럽트1(ECHO 신호 처리)
interrupt [EXT_INT1] void trigger(void)
{
if(echo_st == 0){ // ECHO High 신호 감지
echo_st = 1;
TCNT2 = 138;
TCCR2 = 0b00000010; // 타/카2 8분주 카운팅 시작
EICRA = 0b00001000; // 외부 인터럽트 하강 에지로 전환
}
else {
echo_st = 2; // ECHO Low 신호 감지
TCCR2 = 0b00000000; // 타/카2 정지
EIMSK = 0x0; // 외부인터럽트 디스에이블
}
}위 코드에서 7segment가 아니라 lcd로 출력하려면 코드를 어떻게 수정해야 하나요?
댓글 1
조회수 5,411master님의 댓글
master 작성일LCD 예제부터 공부해야 하지 않을까요?