BASIC4MCU | 질문게시판 | 답변 : 코드비젼 제한시간 타이머카운터 관련 질문입니다.
페이지 정보
작성자 master 작성일2018-12-11 22:28 조회6,538회 댓글1건
https://www.basic4mcu.com/bbs/board.php?bo_table=gac&wr_id=6737
본문
// MCU BASIC: https://www.basic4mcu.com// DateTime : 2018-12-11 오후 10:32:35// by Ok-Hyun Park//#include <mega128.h>#include <delay.h>#include <stdlib.h>#include <stdio.h>#asm.equ __lcd_port=0x12;#endasm#include <lcd.h>//#define RS PORTB.0#define RW PORTB.1#define E PORTB.2//#define KEY_OUT PORTC // Port C,Key Matrix 입력 신호#define KEY_IN PINC // Port C,Key Matrix 출력 신호//// 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F.unsigned char fnd[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x98,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x7f};//unsigned int play1=0; //랜덤숫자 게임1에서사용int time=2000; //난이도 조정할때사용 추후 사용예정unsigned int ans[];int a=0,score=1234;char str[30];int game=0; // 게임 1,2,3 나오게할때 사용int level=2;unsigned char play2=0; // 랜덤숫자 게임2에서 사용unsigned int tcnt=0; // 인터럽트 발생 횟수를 카운트unsigned char end[40]=" You Die....lol "; // 시간 다됐을경우 LCD에 나옴//bit end_flag=0; // 3초가 지나면 1이 됨//void delay(unsigned int cnt){ while(cnt--); } //user function define//void lcd_inst_write(char c){ PORTA=c; PORTB=4; delay_us(1); E=0; delay_ms(3); }void lcd_data_write(char c){ PORTA=c; PORTB=5; delay_us(1); E=0; delay_us(50); }int i=0;do{ PORTB=0x00; PORTA=in[i]; RS=1; E=1; delay_ms(2); E=0; } while(in[++i]!='\0');}//void lcd_str(char *in){int i=0;do{ PORTB=0x00; PORTA=in[i]; RS=1; E=1; delay_ms(2); E=0; } while(in[++i]!='\0');}//void game1(void){ //순간기억게임play1=TCNT1;sprintf(str,"%d",play1); lcd_inst_write(0x01); lcd_inst_write(0x01); lcd_data_write(str); delay_ms(3000);}//void game2(void){lcd_inst_write(0x01);play2=rand()%(255-1+1)+1;if(play2<0)play2=0-play2;PORTF=play2;delay_ms(3000);play2=0;PORTF=play2;}//void game3(void){ }//interrupt [TIM0_COMP] void timer0_comp_isr(void){ // 1msstatic char c=0;PORTE=0xFF://if(tcnt<3000){if(++tcnt==3000){ end_flag=1; lcd_inst_write(0x80); lcd_str(end); } // 3초에서 flag=1}//switch(c){case 0: PORTD=fnd[score%10/1]; break;case 1: PORTD=fnd[score%100/10]; break;case 2: PORTD=fnd[score%1000/100]; break;case 3: PORTD=fnd[score/1000]; break;}PORTE=~(1<<c);if(++c>3)c=0;}//void main(void){unsigned char buff1[40]="Want to play?"; //LCD에 게임시작화면 출력unsigned char buff2[30]="Press 'A'!!"; //LCD에 게임시작화면 출력unsigned char buff=0;int x[4];DDRA=0xff; DDRB=0xff; // LCDDDRD=0xFF; DDRE=0xff; // FNDPORTC=0x0F; DDRC=0x0F; // KEY MATRIXPORTF=0xFF; DDRF=0xFF; // LEDTCCR1B=0x09; OCR1A=9999;TCCR0=0x0D; OCR0=124; TIMSK=2; // 16000000/128/(1+124),1msSREG=0x80;PORTD=fnd[0]; // 7-Segment에 '0'출력lcd_inst_write(0x38); // lcd function set(16x2 line,8bit,5x7 dot)lcd_inst_write(0x0c); // Display on,Cursor off,Blank offlcd_inst_write(0x06); // Entry mode set 문자의 진행 방향 결정(커서 오른쪽 이동)lcd_inst_write(0x01); // 화면 클리어lcd_inst_write(0x80); lcd_str(buff1); delay_ms(2); //LCD게임 시작 메세지 출력lcd_inst_write(0xc0); lcd_str(buff2); //LCD게임 시작 메세지 출력while(1){KEY_OUT=0xfe; delay(100); buff=KEY_IN; buff=buff&0xF0;switch(buff>>4){case 0x07: ans[a]=0; a++; break;case 0x0b: ans[a]=4; a++; break;case 0x0d: ans[a]=8; a++; break;case 0x0e: ans[a]=12; a++; break;}KEY_OUT=0xfd; delay(100); buff=KEY_IN; buff=buff&0xF0;switch(buff>>4){case 0x07: ans[a]=1; a++; break;case 0x0b: ans[a]=5; a++; break;case 0x0d: ans[a]=9; a++; break;case 0x0e: ans[a]=13; a++; break;}KEY_OUT=0xfb; delay(100); buff=KEY_IN; buff=buff&0xF0;switch(buff>>4){case 0x07: ans[a]=2; a++; break;case 0x0b: ans[a]=6; a++; break;case 0x0d: x[0]=10; break;case 0x0e: ans[a]=14; a++; break;}KEY_OUT=0xf7; delay(100); buff=KEY_IN; buff=buff&0xF0;switch(buff>>4){case 0x07: ans[a]=3; a++; break;case 0x0b: ans[a]=7; a++; break;case 0x0d: ans[a]=11; a++; break;case 0x0e: ans[a]=15; a++; break;}delay(100);// 위는 키매트릭스 설정이고 이제부터 게임관련 코딩입니다if(x[0]==10){ //A를 누를경우 랜덤게임이 시작된다game=rand()%3+1; //gmae을 랜덤난수로 1,2,3을 뽑습니다.//if(game==1){ //gmae이 1이되면 실행합니다.game1();if(ans==play1)score++; //점수를 1점 추가하는부분인데 아직 연구중입니다.break;}//if(game==2){ game2(); break; }//// if(game==3){ break; }}}}
//interrupt [TIM0_COMP] void timer0_comp_isr(void){ // 1msif(tcnt<3000){if(++tcnt==3000){ end_flag=1; lcd_inst_write(0x80); lcd_str(end); } // 3초에서 flag=1}}3초가 되면 실행 됩니다.
tcnt=0; end_flag=0;
초기 설정은 이렇게 해놓고 end_flag가 1이 될 때까지 기다리면 됩니다.
댓글 1
조회수 6,538길세만님의 댓글
길세만 작성일감사합니다 조금더 공부해보겠습니다 ㅠㅠ