질문게시판 > 답변 : 답변 : 답변 : Codevision에서 avr studio4 변환 질문입니다

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

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

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

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

BASIC4MCU > 질문게시판

답변 : 답변 : 답변 : Codevision에서 avr studio4 변환 질문입니다

페이지 정보

작성자 master 작성일18-12-23 07:17 조회3,966회 댓글0건

본문

 

// DateTime : 2018-12-23 오전 7:21:15
// by Ok-Hyun Park
//
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdio.h>
#define F_CPU 16000000UL           // 16 MHz
#include <util/delay.h>
#include <stdlib.h>
//
#define  SIZE       16             // 오목판(LDM)사이즈
#define  LINE_ADDR  PORTE          // Line Address
#define  RED_1      PORTD|=1       // Red LED Data PA0
#define  RED_0      PORTD&=~1      // Red LED Data PA0
#define  GREEN_1    PORTD|=2       // Green LED Data PA1
#define  GREEN_0    PORTD&=~2      // Green LED Data PA1
#define  ENABLE_1   PORTD|=4       // Output Enable PA2
#define  ENABLE_0   PORTD&=~4      // Output Enable PA2
#define  LATCH_1    PORTD|=8       // Latch PA3
#define  LATCH_0    PORTD&=~8      // Latch PA3
#define  CLOCK_1    PORTD|=0x10    // Clock PA4
#define  CLOCK_0    PORTD&=~0x10   // Clock PA4
//
#define  UP_SW      (PINB&2)       // Up 이동 스위치 PB1
#define  DOWN_SW    (PINB&4)       // Down 이동 스위치 PB2
#define  LEFT_SW    (PINB&8)       // Left 이동 스위치 PB3
#define  RIGHT_SW   (PINB&1)       // Right 이동 스위치 PB0
//
#define  PUT_SW     (PINF&0x20)     // Put 스위치(사용 안함)PF4
#define  START_SW   (PINF&0x10)     // Start 스위치 PF0
//
#define UP          1               // 지렁이 움직이는 방향 위
#define DOWN        2               // 지렁이 움직이는 방향 아래
#define LEFT        3               // 지렁이 움직이는 방향 왼쪽
#define RIGHT       4               // 지렁이 움직이는 방향 오른쪽
// 사용 변수
volatile int  dot_i=0;               // 타이머 오버플로우(1ms)인터럽트 함수에서 다음에 표시할 라인 번호
volatile int  h_x,h_y;               // 머리 x,y 좌표
volatile int  o_x,o_y;               // 먹이 x,y 좌표
volatile char dir;                   // 지렁이 이동 방향
volatile int  tcnt=0;
volatile int  length=0;              // 지렁이 마디 수
volatile int  kk;                    // 꼬리 배열 번호(새로운 머리 좌표 저장할 배연 번호)
volatile int  lent_time,st=0;
volatile char dot_R[SIZE][SIZE];     // LDM 제어신호에서  사용할 R성분
volatile char dot_G[SIZE][SIZE];     // LDM 제어신호에서  사용할 G성분
volatile char w_x[256],w_y[256];     // 마디 좌표 저장 배열 변수
volatile char buf_x[256],buf_y[256]; // 마디 좌표 일시 저장 작업 배열 변수
//
volatile char w_init[3][2]={{0,0},{1,0},{2,0}};                                // 지렁이 시작 마디 좌표
volatile char seg_pat[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; // 7-세그먼트 숫자 출력 패턴
//
volatile char sijak[16][16]={ // "웜게임" 문자 패턴
  {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  {0,0,1,1,0,0,0,1,0,1,1,1,0,1,0,1},
  {0,1,0,0,1,0,0,1,0,0,0,1,0,1,0,1},
  {0,1,0,0,1,0,0,1,0,0,0,1,0,1,0,1},
  {0,0,1,1,0,0,0,1,0,0,0,1,1,1,0,1},
  {0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,1},
  {0,1,1,1,1,1,0,1,0,0,1,0,0,1,0,1},
  {0,0,0,1,0,0,0,1,0,1,0,0,0,1,0,1},
  {0,0,0,1,0,1,1,1,0,0,0,0,0,0,0,0},
  {0,0,0,1,0,0,0,1,0,0,1,1,1,0,0,1},
  {0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,1},
  {0,1,1,1,1,1,1,1,0,1,0,0,0,1,0,1},
  {0,1,0,0,0,0,0,1,0,0,1,1,1,0,0,1},
  {0,1,0,0,0,0,0,1,0,1,1,1,1,1,1,1},
  {0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,1},
  {0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1}
};
volatile char end[16][16]={ // "END" 문자 패턴
  {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  {1,1,1,1,0,1,0,0,0,1,0,1,1,1,0,0},
  {1,0,0,0,0,1,1,0,0,1,0,1,0,0,1,0},
  {1,0,0,0,0,1,1,0,0,1,0,1,0,0,1,0},
  {1,0,0,0,0,1,1,0,0,1,0,1,0,0,1,0},
  {1,0,0,0,0,1,1,0,0,1,0,1,0,0,1,0},
  {1,0,0,0,0,1,0,1,0,1,0,1,0,0,1,0},
  {1,1,1,1,0,1,0,1,0,1,0,1,0,0,1,0},
  {1,0,0,0,0,1,0,1,0,1,0,1,0,0,1,0},
  {1,0,0,0,0,1,0,1,0,1,0,1,0,0,1,0},
  {1,0,0,0,0,1,0,0,1,1,0,1,0,0,1,0},
  {1,0,0,0,0,1,0,0,1,1,0,1,0,0,1,0},
  {1,0,0,0,0,1,0,0,1,1,0,1,0,0,1,0},
  {1,0,0,0,0,1,0,0,1,1,0,1,0,0,1,0},
  {1,1,1,1,0,1,0,0,0,1,0,1,1,1,0,0},
  {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
};
//
void disp_init(void){ // LDM "웜게임" 출력 표시
  int i,j;
  for(j=0j<SIZEj++){
    for(i=0i<SIZEi++){
      dot_G[j][i]=sijak[j][i]; // 도트매트릭스 클리어
      dot_R[j][i]=sijak[j][i];
    }
  }
}
//
void disp_end(void){ // LDM "END" 출력 표시
  int i,j;
  for(j=0j<SIZEj++){
    for(i=0i<SIZEi++)dot_R[j][i]=end[j][i]; // 도트매트릭스 클리어
  }
}
//
void warm_init(void){ // 게임 초시 상태 설정
  int i,j,x,y;
  //
  for(j=0j<SIZEj++){ // 도트매트릭스 클리어
    for(i=0i<SIZEi++){ dot_G[j][i]=0dot_R[j][i]=0; }
  }
  //
  for(i=0i<3i++){         // 지렁이 초기 상태의 마디 좌표 설정(길이 3)
    x=w_init[i][0]; w_x[i]=x// 마디 x좌표
    y=w_init[i][1]; w_y[i]=y// 마디 y좌표
    dot_G[y][x]=1;            // 녹색 LED on(지렁이 몸체)
  }
  h_x=w_init[2][0]; h_y=w_init[2][1]; // 머리 좌표
  length=3;               // 길이 3
  kk=0;                   // 꼬리 배열 번호
  dot_i=0;                // 타이머 인터럽트 함수에서 표시할 라인 초기 번호
  o_x=12o_y=12;         // 초기 먹이 위치
  LINE_ADDR=0;            // 표시할 라인 초기 어드레스=0
  RED_0GREEN_0;         // Red LED off // Green LED off
  LATCH_1;                // Latch high
  ENABLE_0;               // Output Enable low
  CLOCK_0;                // Clock low
  dot_R[o_y][o_x]=1;      // 먹이 적색 표시
  lent_time=500-length*5// 게임 진행 속도 딜레이 계산
}
//
void sw_input(){ // 스위치 입력 처리
  // 지렁이 마디수 출력
  if     (dir!=DOWN &&UP_SW   ==0)dir=UP;    // 이동 방향 위로
  else if(dir!=UP   &&DOWN_SW ==0)dir=DOWN;  // 아래 이동 스위치
  else if(dir!=RIGHT&&LEFT_SW ==0)dir=LEFT;  // 왼쪽 이동 스위치
  else if(dir!=LEFT &&RIGHT_SW==0)dir=RIGHT// 오른쪽 이동 스위치
}
//
ISR(TIMER0_OVF_vect){ // 타이머/카운터0(256-0)*64/16 us=1.024ms
  int bx,by,i,di;
  dot_i=(dot_i+1)%SIZE;                           // LDM 표시라인 1증가
  tcnt++;                                         // 게임 진행속도 조절 카운터
  for(di=0di<SIZEdi++){                       // 한 라인 데이터 출력
    if(dot_R[dot_i][di])RED_1;   else RED_0;      // 적색 먹이 데이터
    if(dot_G[dot_i][di])GREEN_1else GREEN_0;    // 녹색 먹이 데이터
    CLOCK_1_delay_us(1); CLOCK_0_delay_us(1); // 클럭
  }
  _delay_us(1); ENABLE_1// Enable 비트 셋
  LATCH_0_delay_us(1); LATCH_1;
  LINE_ADDR=dot_i;        // 출력 라인 설정
  _delay_us(1); ENABLE_0// 인에이블 비트 리셋
  //
  if(tcnt>=lent_time&&st==1){ // 게임 진행속도에 맞춰 지렁이 이동방행으로 1칸 이동 처리
    tcnt=0;
    if     (dir==UP  ){ if(h_y0)h_y--; else st=0; } // 이동방향=위?     // 머리 Y좌표 1감소 // 윗쪽 벽 충돌 게임종료
    else if(dir==DOWN){ if(h_y<15)h_y++; else st=0; } // 이동방향=아래?   // 머리 Y좌표 1증가 // 아래쪽 벽 충돌 게임종료
    else if(dir==LEFT){ if(h_x0)h_x--; else st=0; } // 이동방향=왼쪽?   // 머리 X좌표 1감소 // 왼쪽 벽 충돌 게임종료
    else              { if(h_x<15)h_x++; else st=0; } // 이동방향=오른쪽? // 머리 X좌표 1감소 // 오른쪽 벽 충돌 게임종료
    //
    if(st==0)return// 게임종료
    //
    if(o_x==h_x&&o_y==h_y){ // 먹이좌표=새로운 머리좌표
      // 지렁이 마디 좌표 재정렬 저장
      for(i=0i<lengthi++){ buf_x[i]=w_x[kk]; buf_y[i]=w_y[kk]; kk=(kk+1)%length; }
      for(i=0i<lengthi++){ w_x[i]=buf_x[i];  w_y[i]=buf_y[i];  }
      w_x[length]=h_xw_y[length]=h_y;    // 머리부분 좌표
      kk=0;                                // 꼬리부분 배열 번호
      length=length+1;                     // 길이 1증가
      if(length<50)lent_time=500-length*5// 길이에 따라 점점 빠르게
      dot_R[o_y][o_x]=0;                   // 현재 먹이 제거
      dot_G[h_y][h_x]=1;                   // 먹이 부분 추가
      //
      while(1){                         // 새 먹이 발생
        o_x=rand()%16o_y=rand()%16;
        if(dot_G[o_y][o_x]!=0)continue// 지렁이 없는 위치에 생성
        dot_R[o_y][o_x]=1;
        break;
      }
    }
    else{                         // 지렁이 단순 이동(먹이 먹지 않은 이동)
      bx=w_x[kk];  by=w_y[kk];    // 꼬리 좌표 백업
      w_x[kk]=h_xw_y[kk]=h_y;   // 현재의 머리좌표 kk번째 배열에 저장
      dot_G[by][bx]=0;            // 현재 꼬리부분 클리어
      kk=(kk+1)%length;           // 새로운 꼬리부분 배열 번호 갱신
      if(dot_G[h_y][h_x]==1)st=0// 몸부분과 충돌 체크
      else dot_G[h_y][h_x]=1;     // 새 머리 부분 추가
    }
  }
}
//
int main(void){
  int i;
  DDRD=0x1F// 포트D 출력 설정(LDM  제어핀)
  DDRE=0x1F// A0-A3=1111 // 포트E 출력설정(LDM 어드레스 A0-A3)
//DDRB=0x00; // 포트B 입력 설정(스위치)
//DDRF=0x00; // 포트F 입력 설정(스위치)
  PORTD=0x0CPORTE=0x0FPORTD=0x08// 포트D 출력 설정(LDM  제어핀) // Enable High // Enable Low
  //
  TCCR0=0x04TIMSK=0x01;        // 프리스케일=CK/64
  SREG=0x80;
  while(1){
    disp_init();                 // 시작을 위한 초기설정
    dir=RIGHT;                   // 지렁이 이동방향 오른쪽 설정
    while(START_SW)_delay_ms(1); // 시작 스위치가 눌려질 때까지 대기
    warm_init();                 // 지렁이 게임 시작 상태 설정
    st=1;                        // 게임 진행
    srand(TCNT0);                // TCNTO값 랜덤 seed값으로 이용
    while(st)sw_input();         // 스위치 입력 체크
    disp_end();                  // "END" 표시
    _delay_ms(4500);             // 일시 대기
  }
}

 

원 소스가 정상동작 했던 것인지 확인하시고요

volatile 선언 추가했으니 이 소스로 다시 돌려보세요 

 

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

댓글 : 0

조회수 : 3,966

등록된 댓글이 없습니다.

게시물 검색

BASIC4MCU > 질문게시판 목록

제목 날짜
공지 MCU, AVR, 아두이노 등 전자공학에 관련된 질문은… 스태프  19-01-15
공지 사이트 이용 안내 댓글[25] master  17-10-29
질문 라즈베리파이4 신형 선택문제 댓글[1] maximum 새글 22-06-26
질문 음전압 ADC 댓글[1] 412904 새글 22-06-26
질문 아두이노 센서값 출력 질문입니다! 댓글[1] 아궁2  22-06-24
질문 ATmega128, ATmega28 RS232통신 첨부파일Moon4201  22-06-24
답변 답변 : ATmega128, ATmega28 RS232… 댓글[1] master  22-06-25
질문 서보모터, 온습도센서 코드 질문 댓글[2] 첨부파일kshdlfaldfh  22-06-22
답변 답변 : 서보모터, 온습도센서 코드 질문 댓글[15] master  22-06-22
질문 steppermulti5 질문 응애  22-06-21
답변 답변 : steppermulti5 질문 댓글[1] master  22-06-22
질문 atmega128 avr usart 질문 snoflak  22-06-21
답변 답변 : atmega128 avr usart 질문 댓글[5] master  22-06-21
질문 사용자 정의 함수 변환 하는 방법 댓글[2] 첨부파일da0800  22-06-21
질문 atmega128 댓글[1] 양의노래  22-06-20
질문 아두이노 동시동작 재질문 댓글[9] 첨부파일죠르디  22-06-20
질문 초음파센서로 dc모터 제어하기 댓글[1] 첨부파일난쟁2  22-06-20
질문 아두이노 동시동작 댓글[7] 죠르디  22-06-19
질문 ATMEGA128 UART,FND 연동 질문 JMOD  22-06-19
답변 답변 : ATMEGA128 UART,FND 연동 질문 댓글[1] master  22-06-20
질문 atmeg128 질문이요 댓글[1] 첨부파일공대생er  22-06-18
질문 atmega128 초음파 센서로 신호등 시간초 늘리기 서동씨  22-06-18
답변 답변 : atmega128 초음파 센서로 신호등 시간초… 댓글[1] master  22-06-18
질문 atmega128 댓글[2] 망경이  22-06-18
질문 앱인벤터 이용해서 수동 자동 할라고하는데 ..잘안됩니다… 댓글[1] 따랑해영  22-06-18
답변 질문 : 앱인벤터 이용해서 수동 자동 할라고하는데 ..… 댓글[1] 첨부파일따랑해영  22-06-19
답변 질문 : 앱인벤터 이용해서 수동 자동 할라고하는데 .… 첨부파일따랑해영  22-06-19
질문 서보모터와 초음파센서 댓글[1] 브링미히어  22-06-17
질문 LCD 도와주세요 ㅜㅠㅠㅠ 댓글[2] 첨부파일dentist22  22-06-17
질문 안녕하세요 atmega128 질문드리고 싶습니다. (자… 댓글[3] dlcldl  22-06-17
게시물 검색


Privacy Policy
MCU BASIC ⓒ 2017
PC버전