BASIC4MCU | 질문게시판 | codevison 코드로 변경
페이지 정보
작성자 스니밈민미 작성일2018-12-14 17:45 조회6,094회 댓글0건본문
이 코드를 codevision 코드로 바꿀 수있을까요..? 부탁드립니다...
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stdio.h>
#include <stdlib.h>
#define SEG PORTA //Port A 7-SEG data로 사용
#define Q PORTB
#define KEY_C PORTC //Port C Key Matrix 입력신호
#define KEY_L PINC //Port C Key Matrix 출력신호
void SegDisplay(unsigned int cmd); //7-Segmant 출력함수 선언
void delay(unsigned int cnt); //시간 지연함수
void Putch(char data);
void PutSt(char *pStr);
char Getch();
unsigned char count = 0;
int time = 10;
unsigned char flag = 0;
int com_number;
int life = 8;
char user_number[6] = {0,};
int user_num = 0;
char up = 0;
int seed = 0;
ISR(INT0_vect, ISR_BLOCK)
{
PutSt("\n\n\r");
PutSt("=========================\n\r");
PutSt(" Game Start \n\r");
PutSt("=========================\n\r");
PutSt("0~100 사이의 수를 맞춰보세요!\n\r");
life = 8;
time = 10;
printf("=> 기회가 %d번 남았습니다.\n\r", life);
_delay_ms(500);
TCCR0 = 0x07;
srand(seed);
com_number = rand() % 100 + 1;
light(life);
}
ISR(TIMER0_OVF_vect, ISR_NOBLOCK)
{
count++;
if(count == 125)
{
time--;
SegDisplay(time);
if(time == 0)
{
time = 10;
life--;
printf("\n\rwarning!! 입력에 실패했습니다!!\n\r");
up = 0;
if(life > 0)
{
light(life);
printf("=> 기회가 %d번 남았습니다.\n\r", life);
} else {
PutSt("당신은 패배했습니다.\n\r");
printf("아쉽네요. 정답은 %d입니다.\n\r", com_number);
TCCR0 = 0; // 타이머 정지
PutSt("=========================\n\r");
PutSt(" Game End \n\r");
PutSt("=========================\n\n\r");
}
}
count = 0;
}
TCNT0 = 131;
}
void main(void)
{
FILE *fp;
fp = fdevopen(Putch, Getch);
cli();
unsigned char buff=0;
PORTA = 0x00;
DDRA = 0xff;
PORTB = 0x00;
DDRB = 0x0f;
PORTC = 0x0F;
DDRC = 0x0F; //(c0-c3 : 출력, c4-c7 : 입력)
DDRE = 0xff;
DDRG = 0xff;
SegDisplay(0); //7-Segment에 '0'출력
Q = 0x0e; // 모든 7-Seg 선택
EICRA = 0x0A; // INT0~3 하강레벨감지 방식
EICRB = 0x00; // INT4~7 0레벨감지 방식
EIMSK = 0x01; // INT0
UCSR0A = 0x00;
UCSR0B = 0x18; // 송수신 인에이블
UCSR0C = 0x06; // 8bit Data통신
UBRR0H = 0x00;
UBRR0L = 0x08; // 115200 bps
TCNT0 = 131;
TIMSK = 0x01;
sei();
while(1)
{
seed++;
KEY_C = 0xFe; //Port B에 1111 1110 출력 3 7 B C line Enable
_delay_ms(1); //시간지연 함수 호출
buff = KEY_L; //buff에 PortC 값을 저장한다.
buff = buff & 0xF0; //buff값에 0x0f AND Mask
switch(buff>>4)
{
case 0x0e: // 1110
Putch('0');
user_number[up++] = '0';
_delay_ms(200);
break;
case 0x0d: // 1101
Putch('4');
user_number[up++] = '4';
_delay_ms(200);
break;
case 0x0b: //1011
Putch('8');
user_number[up++] = '8';
_delay_ms(200);
break;
case 0x07: //0111
break;
default:
break;
}
_delay_ms(1);
KEY_C = 0xFC; //Port B에 1111 1101 출력 1 5 9 D line Enable
_delay_ms(1); //시간지연 함수 호출
buff = KEY_L; //buff에 PortC 값을 저장한다.
buff = buff & 0xF0; //buff값에 0x0f AND Mask
switch(buff>>4)
{
case 0x0e: // 1110
Putch('1');
user_number[up++] = '1';
_delay_ms(200);
break;
case 0x0d: // 1101
Putch('5');
user_number[up++] = '5';
_delay_ms(200);
break;
case 0x0b: //1011
Putch('9');
user_number[up++] = '9';
_delay_ms(200);
break;
case 0x07: //0111
break;
default:
break;
}
_delay_ms(1);
KEY_C = 0xFB; //Port B에 1111 1011 출력 2 6 A E line Enable
_delay_ms(1); //시간지연 함수 호출
buff = KEY_L; //buff에 PortC 값을 저장한다.
buff = buff & 0xF0; //buff값에 0x0f AND Mask
switch(buff>>4)
{
case 0x0e: // 1110
Putch('2');
user_number[up++] = '2';
_delay_ms(200);
break;
case 0x0d: // 1101
Putch('6');
user_number[up++] = '6';
_delay_ms(200);
break;
case 0x0b: //1011
// 입력 완료
PutSt("\n\r");
count = 0;
time = 0;
user_number[up++] = '\0';
life--;
user_num = atoi(user_number);
if(life > 0)
{
if(user_num == com_number)
{
PutSt("당신이 이겼습니다. 축하합니다!\n\r");
}
else if(user_num > com_number)
{
PutSt("정답보다 입력한 숫자가 큽니다.\n\r");
printf("=> 기회가 %d번 남았습니다.\n\r", life);
light(life);
time = 10;
}
else
{
PutSt("정답보다 입력한 숫자가 작습니다.\n\r");
light(life);
printf("=> 기회가 %d번 남았습니다.\n\r", life);
time = 10;
}
} else {
PutSt("당신은 패배했습니다.\n\r");
TCCR0 = 0; // 타이머 정지
printf("아쉽네요. 정답은 %d입니다.\n\r", com_number);
PutSt("=========================\n\r");
PutSt(" Game End \n\r");
PutSt("=========================\n\n\r");
}
up = 0;
_delay_ms(200);
break;
case 0x07: //0111
break;
default:
break;
}
_delay_ms(1);
KEY_C = 0xF7; //Port B에 1111 0111 출력 3 7 B F line Enable
_delay_ms(1); //시간지연 함수 호출
buff = KEY_L; //buff에 PortC 값을 저장한다.
buff = buff & 0xF0; //buff값에 0x0f AND Mask
switch(buff>>4)
{
case 0x0e: // 1110
Putch('3');
user_number[up++] = '3';
_delay_ms(200);
break;
case 0x0d: // 1101
Putch('7');
user_number[up++] = '7';
_delay_ms(200);
break;
case 0x0b: //1011
break;
case 0x07: //0111
break;
default:
break;
}
_delay_ms(1);
}
}
void SegDisplay(unsigned int cmd)
{
unsigned char fnd[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x98,
0x88,0x83,0xc6,0xa1,0x86,0x8e,0x7f};
SEG = fnd[cmd];
}
void Putch(char data)
{
while ((UCSR0A & 0x20) == 0);
UDR0 = data;
}
void PutSt(char *pStr)
{
while (*pStr)
{
Putch(*pStr++);
}
}
char Getch()
{
while( (UCSR0A & 0x80) == 0);
return UDR0;
}
void light(int l)
{
switch(l)
{
case 8:
PORTE = 0b11110000;
PORTG = 0b00001111;
break;
case 7:
PORTE = 0b01110000;
PORTG = 0b00001111;
break;
case 6:
PORTE = 0b00110000;
PORTG = 0b00001111;
break;
case 5:
PORTE = 0b00010000;
PORTG = 0b00001111;
break;
case 4:
PORTE = 0b00000000;
PORTG = 0b00001111;
break;
case 3:
PORTE = 0b00000000;
PORTG = 0b00000111;
break;
case 2:
PORTE = 0b00000000;
PORTG = 0b00000011;
break;
case 1:
PORTE = 0b00000000;
PORTG = 0b00000001;
break;
}
}
댓글 0
조회수 6,094등록된 댓글이 없습니다.