Категории
Самые читаемые
onlinekniga.com » Компьютеры и Интернет » Программирование » Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С - Стивен Барретт

Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С - Стивен Барретт

Читать онлайн Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С - Стивен Барретт

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 116 117 118 119 120 121 122 123 124 ... 150
Перейти на страницу:

 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. Но неплохо было бы сохранить ее, чтобы снова записать в память при необходимости.

1 ... 116 117 118 119 120 121 122 123 124 ... 150
Перейти на страницу:
На этой странице вы можете бесплатно читать книгу Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С - Стивен Барретт.
Комментарии