2011년5월25일_두더지게임 업그레이드 기획 (시작화면, 메뉴, 문자그림, 보너스두더지), ATmega128 내부EEPROM에 순위데이터저장
시작 화면과 메뉴 |
오프닝화면을 열심히 그렸으나…
하이퍼터미널은 이미지를 그릴 수 없었다. OTL
그래서 다음과 같이,
문자를 이용하여 그림을 그렸다.
이 화면을 출력하고 난 다음의 커서의 위치가 EXIT의 T다음에 있으므로 위에 두더지가 랜덤하게 올라왔다 내려가는 모습과,
메뉴선택시 왼쪽 점이 움직이는 것을 구현하려면,
① 전체화면을 지우고 다시 그린다.
② 변경된 부분만 수정한다.
이런 방법이 있겠으나 커서를 위로 가게 하는 제어문자를 알아 내지 못 하여 화면전환 0x0C 제어문자를 이용하여,
하면을 초기화하고 전체화면을 다시 그리는 법을 택하기로 하였다.
보너스 두더지 |
일반적인 두더지는 약1초간 LED가 계속 ON상태를 유지하는 것을 말하며,
상기의 보너스두더지란 약1초간 LED가 켜지는데 0.1초간 ON, 0.1초간 OFF를 반복하여 깜빡이는 것을 말함.
보너스두더지를 잡으면 +10점이 되나 총 100점을 초과할 수 없으므로 이 부분에 대한 조건을 추가해야 할 것이다.
ATmega128 내부EEPROM에 순위 데이터 저장 |
1: //점수를 정렬하며 EEPROM에 기록
2:
3: eeprom_write(6, ucScore); //맨 밑에 점수를 일단 집어넣고,
4:
5: for(cRep = 6 ; 1 < cRep ; --cRep) //맨 밑에서 부터 바로 위에 데이터와 비교시작
6: {
7: if(eeprom_read(cRep) > eeprom_read(cRep - 1)) //대소 비교 후 크면
8: {
9: cTemp = eeprom_read(cRep - 1); //위에 데이터와 교체
10: eeprom_write(cRep - 1, eeprom_read(cRep));
11: eeprom_write(cRep, cTemp);
12: }
13: }
상기의 eeprom_write부분이 6번 반복하는 반복문내에 있어 항상 10회 쓰기를 수행할 것이다.
1회 수행시간이 보통 수ms에서 최대 10ms이니 최대 120ms의 시간이 소요된다.
이를 해결하려면 EEPROM의 데이터를 읽어와 SRAM에 로드한 다음에,
점수정렬을 하고 한 번에 5번만 쓰는 것이다.
이렇게 하면 게임을 100회하였다고 하였을 때,
1Byte쓰기방식의 경우 (10번 + 1번) * 100회 = 1100번 쓰기를 수행한다.
블록단위쓰기방식의 경우 (5번) * 100회 = 500번 쓰기로,
1Byte씩 읽고 쓰기를 수행하는 방식보다 많이 빠르고 EEPROM수명에도 좋다.