BASIC4MCU | 질문게시판 | LCD 테트리스 문제점 혹시 봐주실수 있을까요 ㅠㅠ
페이지 정보
작성자 초짜 작성일2019-11-04 18:35 조회8,261회 댓글1건본문
#include <mega128a.h>
#include <string.h>
#include <delay.h>#define ENABLE PORTA.2
#define FUNCSET 0x28
#define DISPON 0x0C
#define ALLCLR 0x01
#define ENTMODE 0x06
#define LINE2 0xC0#define uchar unsigned char
#define Busy delay_ms(2)void Reset();
void Command(uchar ch);
void Data(uchar ch);
void LCD_String(char flash *str);
void Block_move();
void Block_made();
void Block_Speed();
uchar block1[8] = {0x18, 0x18, 0x0,0x0,0x0,0x0,0x0,0x0};//네모모양 박스
uchar resultblock1[8] = {0x0, 0x0, 0x0,0x0,0x0,0x0,0x0,0x0};//네모모양 박스
uchar GPS_LINE[2] = {0xC7, 0xC8};
uchar exroom;int i = 0;
int sec_timer = 0;
int Block_Stop = 0;
int Left_useSW = 1;
int Line_Left_useSW = 1;
int Right_useSW = 1;
int GPS = 1;
void main(void)
{
Reset();
Block_Speed();
Block_made();
Command(GPS_LINE[GPS]);
Data(0x0);
while (1)
{if(PINE.4 == 0){
TIMSK = 0;//타이머 멈춤
for(i = 0; i < 8; i++){//만약 라인 1번째에 블럭이 있고 왼쪽 쉬프트일 경우 안함
if(!GPS){//첫번째 라인일시
if((block1[i] & 0x10)){//벽 왼쪽 끝에 있을시
Left_useSW = 0; //스위치 완전 먹통
}
}
}
for(i = 0; i < 8; i++){//만약 라인 2번째에 블럭이 있고 왼쪽으로 쉬프트 할경우 라인 첫번째 맨 오른쪽이 블록생성
if(GPS){//두번째 라인일시if(Left_useSW){//위에 먹통이 안되있을시
if((block1[i] & 0x10)){//벽 왼쪽 끝에 있을시
block1[i] = block1[i] >> 3; //도형을 오른 끝으로 이동
Line_Left_useSW=0; //밑에 있는 문의 왼쪽 쉬프트 무시
}}
}
}
if(Line_Left_useSW == 0){//위에 if문이 되었을 경우 GPS 를 0으로 함으로써 라인을 1번쨰로 바꿈
GPS = 0;//GPS 0으로 첫번쨰 라인 바꾸기
}
for(i = 0; i < 8; i++){//위에 두 경우가 해당하지 않을경우 일반 쉬프트
if(Left_useSW & Line_Left_useSW){
block1[i] = block1[i] << 1;//왼쪽 한칸 쉬프트
Right_useSW= 1;//오른쪽 이용 가능하게 하기
}
}
Line_Left_useSW= 1;//라인 바꿈 확인
Block_made();//블럭 생성
TIMSK = 1;//타이머 작동
delay_ms(200);//누른 시간 유지
}
if(PINE.5 == 0){
}
}
}
void Block_Speed(){
TCCR0 = 0x04;
TCNT0 = 6;
TIMSK = 0x01;
SREG = 0x80;
}interrupt [TIM0_OVF] void BLOCK_TIMER(void)
{
sec_timer++;
if(sec_timer == 1000 & Block_Stop != 6){
Block_Stop++;
Block_move();
sec_timer = 0;
}
}
void Block_move(){
exroom = block1[7];
memmove(block1 + 1,block1,sizeof(int)*7);
block1[0] = exroom;
Block_made();}
void Block_made(){
for(i = 0; i < 8; i++){
Command(0x40 +i);
Data(block1[i]);
}
Command(GPS_LINE[GPS]);
Data(0x0);
}
void Command(uchar ch){//LCD 문자 명령어
Busy;PORTA = 0x0;
PORTA |= (ch & 0xF0);
delay_us(1);
ENABLE = 1;
delay_us(1);
ENABLE = 0;PORTA = 0x0;
PORTA |= (ch <<4);
delay_us(1);
ENABLE = 1;
delay_us(1);
ENABLE = 0;
}//LCD 문자 명령어void Data(uchar ch){//LCD 글자 쓰기
Busy;PORTA = 0x01;
PORTA |= (ch & 0xF0);
delay_us(1);
ENABLE = 1;
delay_us(1);
ENABLE = 0;PORTA = 0x01;
PORTA |= (ch <<4);
delay_us(1);
ENABLE = 1;
delay_us(1);
ENABLE = 0;} //LCD 글자 쓰기
void LCD_String(char flash *str){//문자열 보내기
char flash *Pstr = 0;
Pstr = str;
while(*Pstr)Data(*Pstr++);
}//문자열 보내기
void Reset(){
DDRA = 0xFF;
PORTA = 0x0;
delay_ms(15);
Command(0x20);
delay_ms(5);
Command(0x20);
delay_us(100);
Command(0x20);
Command(FUNCSET);
Command(DISPON);
Command(ALLCLR);
Command(ENTMODE);
}LCD 라인이 두번쨰 0xC8에서 0xC7 로 이동을 안하네요..
댓글 1
조회수 8,261master님의 댓글
master 작성일
동일한 회로를 꾸며서 돌려봐 줄 사람은 존재하지 않습니다.
타인에게 증상을 설명하기도 어렵고
그 설명을 듣고서 수정한다고 하더라도 제대로 수정이 되었는지 확인할 수 있는 방법이 없습니다.
결국 복잡한 코드는 스스로 디버깅해야합니다.
프로그램이 복잡하다고 하더라도 시퀜셜하게 동작하므로
어디까지 정상이고 어디부터 비정상인지 체크를 해서 디버깅 해야합니다.