Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «ВстраиваСмыС систСмы. ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π°Ρ… сСмСйства 68HC12/HCS12 с ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ языка Π‘Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 118

Автор Π‘Ρ‚ΠΈΠ²Π΅Π½ Π‘Π°Ρ€Ρ€Π΅Ρ‚Ρ‚

Рис. 7.37. Π‘Π»ΠΎΠΊ-Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΠ° микропроцСссорной систСмы для ΠΈΠ³Ρ€Ρ‹ Π² Β«15Β»

7.7.4. Π‘Ρ…Π΅ΠΌΠ½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, структура ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ Π±Π»ΠΎΠΊ-схСма Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°

На рис. 7.38 ΠΏΠΎΠΊΠ°Π·Π°Π½Π° структура ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π½ΠΎΠΉ систСмы для ΠΈΠ³Ρ€Ρ‹ Π² Β«15Β». ВстроСнныС ΠΏΠΎΡ€Ρ‚Ρ‹ ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΠΎΠΉ ΠΏΠ»Π°Ρ‚Ρ‹ 68HC912B32EVB ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΠΈ ΠΏΠΎΡΠ»Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΎΡ‚ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ ΠΈ модуля Π–Πš-дисплСя. ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈΠ°Π»ΡŒΠ½Π°Ρ схСма этой систСмы с Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ памяти ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° Π½Π° рис. 7.39.

Рис. 7.38. Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° микропроцСссорной систСмы для ΠΈΠ³Ρ€Ρ‹ Π² Β«15Β»


Рис. 7.39. ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈΠ°Π»ΡŒΠ½Π°Ρ схСма систСмы для ΠΈΠ³Ρ€Ρ‹ Π² Β«15Β»


На рис. 7.40 ΠΏΠΎΠΊΠ°Π·Π°Π½Π° структура ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ для ΠΈΠ³Ρ€Ρ‹ Π² Β«15Β», Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ главная ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° обращаСтся ΠΊ ΡˆΠ΅ΡΡ‚ΠΈ субмодулям. На рисункС ΠΏΠΎΠΊΠ°Π·Π°Π½ Ρ‚Π°ΠΊΠΆΠ΅ ряд Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, выполняСмых ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ субмодулСм. Π‘ΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ Π±Π»ΠΎΠΊ схСма Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° Π½Π° рис. 7.41.

Рис. 7.40. Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ для ΠΈΠ³Ρ€Ρ‹ Π² Β«15Β»


Рис. 7.41. Π‘Π»ΠΎΠΊ схСма Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ для ΠΈΠ³Ρ€Ρ‹ Π² Β«15Β»

7.7.5. О ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°Ρ… систСмы

Π˜Π½Ρ‚Π΅Π»Π»Π΅ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ‚ΠΎΡ‡Π΅Ρ‡Π½Ρ‹ΠΉ графичСский дисплСй AND 1391 β€” это полная точСчная ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° Π–ΠšΠ” со встроСнным ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π° дисплСя ΠΈ ΠžΠ—Π£ Π±ΡƒΡ„Π΅Ρ€Π° экрана. Он ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ 21 символ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· 18 строк дисплСя. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΡ‡Π΅ΡΡ‚ΡŒ ΠΎΠ± этом дисплСС ΠΈ функциях Π΅Π³ΠΎ обСспСчСния Π² Π³Π»Π°Π²Π΅ 5.

7.7.6. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄

//Имя Ρ„Π°ΠΉΠ»Π°: sliding.с

//ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°: Π˜Π³Ρ€Π° Π² "15"

//Авторы: Scott Lewis, Daniel Pack,

//Π”Π°Ρ‚Π° создания: Начата 27 апрСля 2004

//ΠΎΠΊΠΎΠ½Ρ‡Π΅Π½Π° 7 Мая 2004

// ОписаниС: Π­Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ ΠΈΠ³Ρ€Ρƒ Π² "15". ЦСль ΠΈΠ³Ρ€Ρ‹

// Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Ρ„ΠΈΡˆΠΊΠΈ ΠΏΠΎ ΠΏΠΎ ряду Π½ΠΎΠΌΠ΅Ρ€ΠΎΠ². Π’Ρ‹

// ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ Π½Π° пустоС мСсто Π»ΡŽΠ±ΡƒΡŽ сосСднюю Ρ„ΠΈΡˆΠΊΡƒ.

// ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° постоянно находится Π² памяти систСмы ΠΏΠΎ адрСсу

// $2000. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ исходноС состояниС Ρ„ΠΈΡˆΠ΅ΠΊ, Π·Π°Ρ‚Π΅ΠΌ

// ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ состояниС ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€ΠΈΠΉΡ‚ΠΈ Π²

// Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Π΅Ρ‚ всС Ρ„ΠΈΡˆΠΊΠΈ Π² случайном

// порядкС, ΠΈ Π·Π°Ρ‚Π΅ΠΌ позволяСт ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ Π½Π°Ρ‡Π°Ρ‚ΡŒ ΠΈΠ³Ρ€Ρƒ

// ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ систСмы

// ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°: 0x2000

// Π”Π°Π½Π½Ρ‹Π΅: 0x3500

// Π‘Ρ‚Π΅ΠΊ: 0x4000

//

// PDLC0: /WR    PP0 Data 0 PS0: НС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ

// PDLC1: /RD    PP1 Data 1 PS1: НС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ

// PDLC2: /CE    PP2 Data 2 PS2: Кнопка "Π’Π»Π΅Π²ΠΎ"

// PDLC3: C/D    PP3 Data 3 PS3: Кнопка "Π’Ρ‹Π±ΠΎΡ€"

// PDLC4: /Reset PP4 Data 4 PS4: Кнопка "Π’Π½ΠΈΠ·"

// PDLC5: NC     PP5 Data 5 PS5: Кнопка "Π’ΠΏΡ€Π°Π²ΠΎ"

// PDLC6: NC     PP6 Data 6 PS6: Кнопка "Π’Π²Π΅Ρ€Ρ…"

// PDLC1: NC     PP7 Data 7 PS7: НС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ

//

// Π’Ρ‹Π²ΠΎΠ΄Ρ‹ Π–ΠšΠ”

// GND  -  2  1 - GND

// -14V -  3  4 - +5V

// /WR  -  5  6 - /RD

// /CE  -  7  8 - C/D

// NC   -  9 10 - /Reset

// DO   - 11 12 - D1

// D2   - 13 14 - D3

// D4   - 15 16 - D5

// D6   - 17 18 - D7

// GND  - 19 20 - NC

//******************************************************


#include <912b32.h> // описаниС ΠΏΠΎΡ€Ρ‚ΠΎΠ² - header file

                    // ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ

//********************************************************************

// ΠŸΠΎΡΡ‚ΠΎΡΠ½Π½Ρ‹Π΅

//********************************************************************

#define ARRAY_MAX 15

#define ZERO 0x00

#define L_BUTTON 0x04 // сигналы ΠΊΠ½ΠΎΠΏΠΎΠΊ

#define R_BUTTON 0x20

#define U_BUTTON 0x40

#define D_BUTTON 0x10

#define S BUTTON 0x08


#define LEFT   1 // Π²Ρ‹Π±ΠΎΡ€ направлСния

#define RIGHT  2

#define UP     3

#define DOWN   4

#define SELECT 5


#define SIZE   4 // Π Π°Π·ΠΌΠ΅Ρ€ строки/ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ


//********************************************************************

// Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

//********************************************************************

int check_win(int array[ARRAY_MAX+1]);

void convert_multi_single(int A[SIZE][SIZE], int Π’[SIZE][SIZE]);

void convert_single_multi(int A[ARRAY_MAX+1], int Π’[SIZE][SIZE]);

void display_board(int A[SIZE][SIZE], int row, int col, int direction);

void display_board2(int board_array[ARRAY_MAX+1]);

void display_error(int n);

void display_intro(void);

void display_win(void);

void get_move(int *direction, int *row, int *col, int *select);

void randomize_board(int board_array[]);

void swap(int row, int col, int new_row, int new_col, int array[SIZE][SIZE]);

void swap2(int from, int to, int array[ARRAY_MAX+1]);

void try_move(int move, int row, int col, int array[SIZE][SIZE]);

unsigned char mode(unsigned char num, int modulus);

void LCD_output(char s[]);

void int2char(int i);

void pause(void);

void delay(int usec);

void enable(void);

void initialize_LCD(void);

void command(unsigned char n);

void data(unsigned char n);

void write(void);

void read(void);

void status_wait(void);

void LCD_char(unsigned char n);

void Clearscreen(void);

void newline(void);

void Reset_cursor(void);


//*****************************************************************

//ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅

//*****************************************************************

#pragma abs_address 0x3600

static int win_array[ARRAY_MAX+1]

 = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,0};

#pragma end_abs_address


#pragma abs_address 0x3500

int board_array_single [ARRAY_MAX+1];

int board_array_multi[SIZE][SIZE];

int win; //ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ Π±ΡƒΠ»Π΅Π²Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅

int direction; //Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ двиТСния

int row; //Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ ряд

int col; //Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΊΠΎΠ»ΠΎΠ½ΠΊΡƒ

int select; //Ссли ΠΊΠ½ΠΎΠΏΠΊΠ° Π½Π°ΠΆΠ°Ρ‚Π°

int i; //тСкущая пСрСмСнная

#pragma end_abs_address


//*****************************************************************

// Основная ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°

//*****************************************************************

void main() {

 win = 0; //ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅

 direction = 0;

 row = 1;

 col = 1;

 select = 0;

 i = 0;

 DDRDLC = 0x1F; //ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΡ€Ρ‚ DDRDLC ΠΊΠ°ΠΊ Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ

 DDRP = 0xFF; // ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π»ΠΈΠ½ΠΈΠΈ ΠΏΠΎΡ€Ρ‚Π° P ΠΊΠ°ΠΊ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅

 DDRS = 0x00; // ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π»ΠΈΠ½ΠΈΠΈ ΠΏΠΎΡ€Ρ‚Π° S ΠΊΠ°ΠΊ Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅

 TSCR = 0x80; //Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Ρ‚Π°ΠΉΠΌΠ΅Ρ€

 initialize_LCD(); //ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π–ΠšΠ”

 Clearscreen();

 Reset_cursor();

 display_intro();

 for (i=0; i < ARRAY_MAX+1; i++) board_array_single[i] = win_array[i];

 convert_single_multi(board_array_single, board_array_multi);

 display_board(board_array_multi, row, col, direction);

 pause(); // ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅, ΠΏΠΎΠΊΠ° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π΅ Π½Π°ΠΆΠΌΠ΅Ρ‚ ΠΊΠ½ΠΎΠΏΠΊΡƒ X

 LCD_output("Now the board is"); // Π²Ρ‹Π²ΠΎΠ΄ сообщСния

 LCD_output("randomized. You ");

 LCD_output("may begin by ");

 LCD_output("choosing a piece");

 LCD_output("to move, and its");

 LCD_output("direction. ");

 newline();

 pause();

 randomize_board(board_array_single); // Π‘Π»ΡƒΡ‡Π°ΠΉΠ½Ρ‹ΠΉ Π²Ρ‹Π±ΠΎΡ€ исходного

                                      // полоТСния Ρ„ΠΈΡˆΠ΅ΠΊ

 convert_single_multi(board_array_single, board_array_multi);

 display_board(board_array_multi, row, col, direction);

 while(win == 0){ //Ρ†ΠΈΠΊΠ» повторяСтся Π΄ΠΎ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ окончания ΠΈΠ³Ρ€Ρ‹

  while (select == 0) {

   //Ссли Π±Ρ‹Π»Π° Π½Π°ΠΆΠ°Ρ‚Π° ΠΊΠ½ΠΎΠΏΠΊΠ° x, Ρ‚ΠΎ задаСтся Π½Π°ΠΏΡ€Π°Π²-

   // Π»Π΅Π½ΠΈΠ΅ двиТСния ряд ΠΈ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ° Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ Ρ„ΠΈΡˆΠΊΠΈ

   get_move(&direction, &row, &col, &select);

   Reset_cursor(); // ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ курсор Π² Π²Π΅Ρ€Ρ…Π½Π΅Π΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅

   if (select == 0)

    display_board(board_array_multi, row, col, direction);

  }

  //ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΡΡ‚ΡŒ двиТСния, ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚ΡŒ Π΅Π³ΠΎ, Ссли

  // ΠΎΠ½ΠΎ Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ, ΠΈΠ»ΠΈ вывСсти сообщСниС ΠΎΠ± ошибкС

  try_move(direction, row-1, col-1, board_array_multi);

  select = 0;

  convert_multi_single(board_array_multi, board_array_single);

  win = check_win(board_array_single);

  Clearscreen();

  // ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ состояниС ΠΈΠ³Ρ€Ρ‹

  display_board(board_array_multi, row, col, direction);

 }

 display_win(); // вывСсти сообщСниС ΠΎΠ± ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΌ ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΠΈ ΠΈΠ³Ρ€Ρ‹

}


//*****************************************************************

// display_intro: DISPLAY INTRO MESSAGE

//*****************************************************************

void display_intro {

 newline();

 LCD_output(" WELCOME ");

 LCD_output(" TO ");

 LCD_output(" SLIDING PUZZLE ");

 new_line();

 pause();

 LCD_output("The object of ");

 LCD_output("this game is to ");

 LCD_output("move each #'ed ");

 LCD_output("puzzle piece so ");

 LCD_output("that you end up ");

 LCD_output("in the order ");

 LCD_output("seen below. The ");

 LCD_output("star shows the ");

 LCD_output("current piece ");

 LCD_output("selected. You ");

 LCD_output("can choose a ");

 LCD_output("different piece ");

 LCD_output(" by using the ");

 LCD_output(" arrow buttons ");