질문게시판 > atmega128 질문이요

인기검색어 > 아두이노 센서 ATMEGA128

최신글 질문게시판 동영상강좌 가입하기

▼ BASIC4MCU 후원업체 신제품 정보 ▼

▲ BASIC4MCU 후원업체 신제품 정보 ▲

BASIC4MCU > 질문게시판

atmega128 질문이요

페이지 정보

작성자 dwe1312 작성일20-11-05 02:24 조회6,841회 댓글2건

본문

SEI(); 이나 SREG레지스터를 사용하면 LCD가 깜빡거리고 저둘을 지우면 글쓰는 나오는데 인터럽트가 실행이 않되는데

어떻게 해결해야하나요?

 

 

 

#include <iom128v.h>

#include <avrdef.h>

 

void delay_ms(unsigned int m);

void delay_us(unsigned int u);

void write_data(char d);

void write_instruction(char i);

void init_lcd(void);

void LCD_STR(char* str);

 

 

unsigned  ampm =0;

unsigned char cnt =0, sec=0, min=0,hour=0;

 

 

void LCD_CHAR(char c) {

 

  write_data(c);

  delay_ms(1);

 

}

void Init_Timer0(void)

{

TCCR0 =0x02;

OCR0 = 100;

TIMSK = 0x01;

}

 

#pragma interrupt_handler timer0_comp_isr: iv_TIMER0_COMP

 void timer0_comp_isr(void)

 {

     TCCR0 =6;

     cnt++ ;

if(cnt == 20000)

{

cnt = 0;

sec++;

if(sec >= 60)

    {

 

min++; sec = 0;

 

}

 

if(min >= 60) {

 

hour++; min = 0;

 

}

if(hour>12){

        hour = 0;

        if(ampm == 0) ampm =1;

        else if(ampm ==1) ampm=0;

        cnt =0;

}

}

}

 

void main(void)

{

    DDRC=0xff;

    DDRB=0xe0;

    init_lcd();

    char str[] = "Curren time";

    char AM[] = "AM";

    char PM[] = "PM";

    Init_Timer0();

    TCCR0 =6;

    SREG = 0x80;

    SEI();

    char temp[16];

    while(1){

            write_instruction(0x80);

            LCD_STR(str);

            sprintf(temp," %2d :%2d :%2d %2s",hour,min,sec,(ampm==0)?"AM":"PM");

            write_instruction(0xc0);

            LCD_STR(temp);

        }

}

 

 

void init_lcd(void)  //초기화 함수

{

    delay_ms(50);

    write_instruction(0x30);  //데이터 길이=8비트, lcd 1열로 사용

    delay_ms(25);

    write_instruction(0x30);  //데이터 길이=8비트, lcd 1열로 사용

    delay_ms(5);

    write_instruction(0x30);  //데이터 길이=8비트, lcd 1열로 사용

    delay_ms(5);

    write_instruction(0x3c); //데이터 길이=8비트, 5x7도트, lcd 2열로 사용

    delay_ms(5);

    write_instruction(0x08);     //화면 off 커서 off,  점멸하지 않음

    delay_ms(5);

    write_instruction(0x01);    //화면 지움 명령

    delay_ms(5);

    write_instruction(0x06);    //주소를 +1시키고, 커서 또는 블링크 위치가 우측으로 이동 명령

    delay_ms(5);

    write_instruction(0x0c);   //화면 on 명령

    delay_ms(15);

}

 

 

 

 

void write_instruction(char i)

 

{

 

    PORTB=0x80;

 

    delay_us(10);

 

    PORTC=i;

 

    delay_us(10);

 

    PORTB=0x00;

 

    delay_us(100);

 

}

 

void write_data(char d)

 

{

 

    PORTB=0xa0;

 

    delay_us(10);

 

    PORTC=d;

 

    delay_us(10);

 

    PORTB=0x20;

 

    delay_us(100);

 

}

 

void delay_ms(unsigned int m)

 

{

 

    unsigned int i,j;

 

    for(i=0;i<m;i++)

 

    {

 

        for(j=0;j<2117;j++);

 

    }

 

}

 

void delay_us(unsigned int u)

 

{

 

    unsigned int i,j;

 

    for(i=0;i<u;i++)

 

    {

 

        for(j=0;j<2;j++);

 

    }

 

}

 

void LCD_STR(char*str) // 문자열출력

 

{

 

    while(*str!= 0)

 

    {

 

        write_data(*str);

 

        str++;

 

    }

 

}

  • BASIC4MCU 작성글 SNS에 공유하기
  • 페이스북으로 보내기
  • 트위터로 보내기
  • 구글플러스로 보내기
  • 카카오톡으로 보내기

댓글 : 2

조회수 : 6,841

master님의 댓글

master 작성일

while(1){
        write_instruction(0x80); LCD_STR(str);
        sprintf(temp," %2d :%2d :%2d %2s",hour,min,sec,(ampm==0)?"AM":"PM");
        write_instruction(0xc0); LCD_STR(temp);
        delay_ms(500);
    }
딜레이 없이 연속으로 출력하는 것보다 딜레이를 넣으면 더 매끄러워집니다.
초당 1회 또는 2회면 충분하겠죠

master님의 댓글

master 작성일

인터럽트와 메인함수의 동기를 맞추는 방법을 알려드리죠
unsigned char flag=0; //전역변수 추가

타이머 인터럽트 안에서 초 증가하는 부분에 코드를 한 줄 추가합니다.
if(cnt == 20000){ cnt = 0;
flag=1; //추가
sec++;
메인은 아래처럼 수정합니다.
    while(1){
      if(flag){ flag=0; //추가
        write_instruction(0x80); LCD_STR(str);
        sprintf(temp," %2d :%2d :%2d %2s",hour,min,sec,(ampm==0)?"AM":"PM");
        write_instruction(0xc0); LCD_STR(temp);
      } //추가
    }
딜레이는 제거했습니다.
sec가 증가한 후에 LCD 표시를 합니다.

게시물 검색

BASIC4MCU > 질문게시판 목록

제목 날짜
공지 MCU, AVR, 아두이노 등 전자공학에 관련된 질문은… 스태프  19-01-15
공지 사이트 이용 안내 댓글[25] master  17-10-29
질문 lcd 1602에 특수문자를 출력하는 방법을 알고싶습니… 댓글[3] dndktn 새글 22-08-12
질문 stm32 wifi 파일전송 댓글[2] 하리 새글 22-08-11
질문 회로 구성 수정 댓글[2] 첨부파일픽공부 새글 22-08-11
질문 아두이노 와이파이통신 질문 있습니다 댓글[1] 학생 새글 22-08-11
질문 포토다이오드와의 연결 질문합니다. 댓글[7] 첨부파일박윤모  22-08-10
질문 회로 구성 댓글[4] 픽공부  22-08-10
질문 아두이노 센서, 와이파이, 블루투스 연결 댓글[1] pattern  22-08-10
질문 PIC 블루투스 연결 댓글[19] 픽공부  22-08-09
질문 PIC18F452 블루투스 연결 댓글[4] 마이컴  22-08-08
질문 아두이노 코드 해석을 못하겠습니다... 댓글[2] 김가헌  22-08-08
질문 아두이노 코드를 avr로 변환해 주세요 ...ㅠ 댓글[3] 옹냥냥  22-08-08
질문 아두이노 녹음-스피커모듈 관련 질문있습니다 ㅠㅠ 댓글[2] 방귀뿡뿡  22-08-08
질문 Serial EEPROM 실수값 저장.. 댓글[2] 첨부파일광이  22-08-07
질문 STM32 Live Expression 값들이 깜빡이는… 댓글[3] 둠둠  22-08-05
질문 아두이노 ESP32 wifi module 댓글[1] Yoon  22-08-03
질문 atmega128과 dht11, lcd를 연결했는데 0… 댓글[1] 고양이33  22-08-02
질문 ATMEGA 128 코드를 합치려고 하는데 어렵네요 댓글[2] 고양이33  22-08-02
질문 서보모터 제어에 대해 질문있습니다. 댓글[2] 첨부파일뉴비에오  22-07-30
질문 적외선 통신 알려주실분있나요 ㅠㅠ 댓글[1] hkjsj10  22-07-30
질문 아두이노 관련 궁금합니다. 댓글[1] 뱝뱝  22-07-28
질문 아두이노 우노 MCP4725 댓글[3] opqr  22-07-27
질문 레오나르도 인체감지센서 알림 안옴 면지지  22-07-24
답변 답변 : 레오나르도 인체감지센서 알림 안옴 master  22-07-25
질문 Uno에서 엔코더값 놓치는 이유가 뭘까요... 댓글[3] MAKTUB  22-07-24
질문 아두이노 압력센서 연동 질문 댓글[4] dbice  22-07-23
질문 아두이노 버튼 누르기 문의 댓글[1] 김형근  22-07-23
질문 HM10 다중페어링 댓글[1] ㅎㅋㅎㅋㅎ  22-07-22
질문 모터드라이브 선정 댓글[6] 조숩인  22-07-22
게시물 검색


Privacy Policy
MCU BASIC ⓒ 2017
PC버전