Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С - Стивен Барретт
Шрифт:
Интервал:
Закладка:
switch(move) {
case UP:
if ((row-1 >=0) && (array[row-1][col] == 0))
swap(row, col, row-1, col, array);
else display_error(UP);
break;
case DOWN:
if ((row+1 <= SIZE) && (array[row+1][col] == 0))
swap(row, col, row+1, col, array);
else display_error(DOWN);
break;
case LEFT:
if ((col-1 >=0) && (array[row][col-1] == 0))
swap(row, col, row, col-1, array);
else display_error(LEFT);
break;
case RIGHT:
if ((col+1 < = SIZE) && (array[row][col+1] == 0))
swap(row, col, row, col+1, array);
else display_error(RIGHT);
break;
}
}
//********************************************************************
//********************************************************************
//Swap: Эта функция заменяет два значения двухмерным массивом.
//********************************************************************
void swap(int row, int col, int new_row, int new_col, int array[SIZE][SIZE]) {
int temp;
temp = array[row][col];
array[row][col] = array[new_row][new_col];
array[new_row][new_col] = temp;
}
//********************************************************************
//Swap2: Эта функция заменяет два значения одномерным массивом.
//********************************************************************
void swap2(int from, int to, int array[ARRAY_MAX+1]) {
int temp = array[from];
array[from] = array[to];
array[to] - temp;
}
//********************************************************************
//ERROR: Эта функция выводит сообщения об ошибке
//********************************************************************
void display_error(int n) {
LCD_Output("ERROR: ");
switch(n) {
case LEFT:
LCD_output("no move L");
break;
case RIGHT:
LCD_output("no move R");
break;
case UP:
LCD_output("no move U");
break;
case DOWN:
LCD_output("no move D");
break;
}
pause();
}
//********************************************************************
//********************************************************************
//LCD_output: Эта функция выводит на дисплей строку
//********************************************************************
void LCD_output(char s[]) {
int n = 0;
while (s[n] != ' ') {
LCD_char(s[n]);
++n;
}
}
//********************************************************************
//Pause: Функция реализует ожидание, пока игрок не нажмет кнопку
// "Выбор"
//********************************************************************
void pause() {
unsigned char с = ZERO;
LCD_output("(Please press X)");
while (c != S_BUTTON) {
c = PORTS;
с = c & 0x7C;
}
Clearscreen();
Reset_cursor();
}
//********************************************************************
//Delay: Эта функция вводит задержку на n мкс, если входная
// величина равна n
//********************************************************************
void delay(int usec) {
int i,j;
for (i=0;i<usec; i++) {
for (j=0; j < 7; j++) {}
}
}
//********************************************************************
//Initialize_LCD: Функция инициализирует ЖКД
//********************************************************************
void initialize_LCD(void) {
char temp = 0x00;
PORTDLC = 0xFF;
PORTDLC = PORTDLC & 0xEF; // сброс экрана (RESET = 0)
delay(2000); // задержка в 2 мс
PORTDLC = 0x7F; // выключение сброса
write(); //включение записи
command(0x80);
//установка текстового режима
data(0x0); //проверка установки слова
data(0x10);
command(0x40);
data(0x10); // устанавливается размер области текста (1E)
data(0x00); // - 0x1000
command(0x41);
//включается дисплей текста, курсор, выключается мигание
command(0x94);
command(0xA7); //курсор 8×8 точек
}
//********************************************************************
//Enable: Функция разрешает работу ИС
//********************************************************************
void enable(void) {
PORTDLC = PORTDLC | 0x04; // Установить 1 на линии enable
PORTDLC = PORTDLC & 0xFB; // Установить 0 на линии enable
}
//********************************************************************
//Disable: Функция запрещает работу ИС
//********************************************************************
void disable(void) {
PORTDLC = PORTDLC | 0x04;
}
//********************************************************************
//Command: Функция посылает команду отключения на ЖКД
//********************************************************************
void command(unsigned char n) {
status_wait();
PORTP = n;
PORTDLC = 0xFF;
PORTDLC = PORTDLC & 0xFE; // сброс записи
enable(); // сброс флага CE
delay(10); // задержка не менее 80 нс
disable(); // включение флага CE
}
//********************************************************************
//Data: Функция пересылает данные на ЖКД
//********************************************************************
void data(unsigned char n) {
status_wait();
PORTP = n;
PORTDLC = 0xFF;
PORTDLC = PORTDLC & 0xF7; // перевести C/D на низкий уровень
PORTDLC = PORTDLC & 0xFE; // перевести WR на низкий уровень
PORTDLC = PORTDLC & 0xFB;
delay(10);
disable();
}
//********************************************************************
//Write: Функция конфигурирует порт P как выходной
//********************************************************************
void write() {
DDRP = 0xFF;
}
//********************************************************************
//Read: Функция конфигурирует порт P как входной
//********************************************************************
void read() {
DDRP = 0x00;
}
//********************************************************************
//Status_wait: Создает соответствующие задержки между командами ЖКД
//********************************************************************
void status_wait() {
char temp = 0x00;
DDRP = 0x00;
PORTDLC = PORTDLC | 0x0F; // сбросить все
PORTDLC = PORTDLC & 0xFD; // сброс флага RD
enable();
delay(10);
while ((temp & 0x03) != 0x03) {
temp = PORTP;
}
disable();
DDRP = 0xFF;
}
//********************************************************************
//LCD_char: Функция выводит ASCII код на экран ЖКД
//********************************************************************
void LCD_char(unsigned char n) {
data(n-0x20);
command(0xC0);
}
//********************************************************************
//Clearscreen: Функция очищает экран ЖКД
//********************************************************************
void Clearscreen() {
int i,j;
Reset_cursor();
for (i=0; i < 16; i++) for (j=0; j<16; j++) LCD_char(' ');
Reset_cursor();
}
//********************************************************************
//Newline: Функция выводит пустую строку на экран ЖКД
//********************************************************************
void newline() {
int i;
for (i=0; i < 16; i++)
LCD_char(' ');
}
//********************************************************************
//Reset_cursor: Функция возвращает курсор ЖКД в начальную позицию
//********************************************************************
void Reset_cursor() {
data(0x00);
data(0x10);
command(0x24);
}
//********************************************************************
7.7.7. Некоторые комментарии
Система для игры в «15» использует пять кнопок вспомогательной клавиатуры, чтобы перемещать фишки: стрелку «Вверх», стрелку «Вниз», стрелку «Вправо», стрелку «Влево» и кнопку «Выбор». Кроме того, расположение фишки определяется номерами строки и столбца. Однажды сформированная, система может использоваться для игры взрослыми и детьми.
7.8. Программирование резидентного Flash ПЗУ микроконтроллера B32 в составе платы отладки MC68HC912B32EVB
В главе 4 мы обсуждали конфигурацию памяти МК B32 семейства 68HC12. Как было упомянуто, в состав МК B32 входит память программ типа Flash объемом 32Кб. В установленном на плате отладки MC68HC912B32EVB микроконтроллере в области Flash ПЗУ записана программа монитора D-Bug12. Если вы желаете использовать отведенный под нее объем для записи части рабочей программы, то необходимо стереть программу монитора D-Bug12. Но неплохо было бы сохранить ее, чтобы снова записать в память при необходимости.