logo
HCS12 с применением языка С - royallib

7.2.6. Программный код

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

//имя файла: laser.с

//функции: программа для управления лазерным проектором

//контроллер: отладочная плата 68HC12B32 фирмы Motorola

//Выводы отладочной платы микроконтроллера 68HC12B32 фирмы Motorola:

//Port A: Конфигурирован как входной порт, активируемый нажатием

// бездребезговых переключателей на каждом входе

//Port B: Конфигурирован как выходной порт для управления светодиодным

// индикатором

//Port S: Конфигурирован как выходной порт, создающий двоичный код

// на канале X ЦАП

//Port T: Конфигурирован как выходной порт, создающий двоичный код

// на канале Y ЦАП

//Port P[0]: Конфигурирован как выходной порт, создающий TTL совместимый

// сигнал для управления затвором

//авторы: Steve Barrett and Daniel Pack

//создан: февраль 20, 2003

//последняя редакция: март 3, 2004

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

//включенные файлы

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

#include <912b32.h>

//функции прототипов

void initialize_ports(void); //инициализация портов

void shutter(int); //открытие/закрытие створок

void position_laser(unsigned char, unsigned char); // положение лазера

void delay(void);

#define open 1

#define close 0

//main program*************************************************************

//global variables

unsigned char new_PORTA, old_PORTA = 0xFF;

int i;

int go;

void main(void) {

 //инициализировать вектор reset B32

 asm(".area vectors(abs)\n"

  ".org 0xFFF8\n"

  ".word 0x8000, 0x8000, 0x8000, 0x8000\n"

  ".text");

 go = 1; //начало цикла while

 initialize_ports(); //инициализировать порты

 shutter(close); //закрыть створки

 position_laser(0x80,0x80); //расположить луч в центре

 while(go) { //продолжать, пока не нажмут кнопку Stop

  new_PORTA = PORTA; //read PORTA input switches

  if (new_PORTA != old_PORTA) switch(new_PORTA){ //формировать образ по значению

                                                  //нажатой клавиши

   case 0x7F: //PA7 - Точка в центре экрана

    PORTB = 0x80;// подсвечивает светодиод порта PORTE

    position_laser(0x80,0x80);

    shutter(open);

    delay();

    shutter(close);

    PORTB=0x00; //включает красные светодиоды индикатора

    break;

   case 0xBF: //PA6- горизонтальная линия

    position_laser(0x00,0x80);

    shutter(open);

    for{i=0; i<=255; i++) {

     i = (unsigned char)(i);

     position_laser(i, 0x80);

     delay();

    }

    shutter(close);

    PORTB=0x00; //включает красные светодиоды индикатора

    break;

   case 0xDF: //PA5 - Вертикальная линия

    PORTB = 0x20; // подсвечивает светодиод порта PORTB

    position_laser(0x80,0x00);

    shutter(open);

    for(i=0; i<=255;i++) {

     i=(unsigned char)(i);

     position_laser(0x80,i);

     delay();

    }

    shutter(close);

    PORTB=0x00; //включает красные светодиоды индикатора

    break;

   case 0xFF: //PA4 - Правая пила под углом 45 градусов

               // с Юго-Запада на СВ

    PORTB = 0x10; // подсвечивает светодиод порта PORTB

    position_laser(0x00,0x00);

    shutter(open);

    for(i=0; i<=255; i++) {

     i = (unsigned char)(i);

     position_laser(i, i);

     delay();

    }

    shutter(close);

    PORTB=0x00; //включает красные светодиоды индикатора

    break;

   case 0xF7: //PA3 - Левая пила под углом 45 градусов

              //с ЮВ на СЗ

    PORTB = 0x08; // подсвечивает светодиод порта PORTB

    delay();

    PORTB=0x00; // включает красные светодиоды индикатора

    break;

   case 0xFB: //PA2 Окружность

    PORTB = 0x04; // подсвечивает светодиод порта PORTB

    delay();

    PORTB=0x00; //включает красные светодиоды индикатора

    break;

   case 0xFD: //PA1 Синусоида

    PORTB = 0x02; // подсвечивает светодиод порта PORTB

    delay();

    PORTB=0x00; // включает красные светодиоды индикатора

    break;

   case 0xFE: //PA0 Остановка

    PORTB = 0x01; // подсвечивает светодиод порта PORTB

    position_laser(0x00,0x00);

    shutter(close);

    delay();

    PORTB=0x00; // включает красные светодиоды индикатора

    go = 0;

    break;

   case 0xFF:

    break;

   default:

    ; //все остальные случаи

   }//конец switch(new_PORTA)

   old_PORTA = new_PORTA;

  }//конец if(new_PORTA ! = old_PORTA)

 }//конец while(go)

}//конец main

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

// initialize_ports: производится конфигурация портов в качестве

//входных/выходных

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

void initialize_ports(void)

{

DDRA=0x00; //установить PORTA в качестве входного порта

DDRB=0xFF; //установить PORTB в качестве выходного порта

PORTB=0x00; //включить красные светодиоды индикатора

DDRS=0xFF; //установить PORTT в качестве выходного порта

DDRP=0xFF; //установить PORTP в качестве выходного порта

}

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

/// /shutter(int action) : открытие и закрытие затвора

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

void shutter(int action) {

 if (action == open) PORTP = 0x01;

 if (action == close) PORTP = 0x00;

}

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

//position_laser(unsigned char x_pos, unsigned char y_pos): посылает

//сигнал управления для каналов X и Y гальванометра из портов PORTS

//и PORTT соответственно.

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

void position_laser(char x_pos,char y_pos) {

 PORTS = x_pos;

 PORTT = y_pos;

}

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

//delay(void): создает задержку

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

void delay(void) {

 int j;

 for(j=0x0000; j<0x1000; j=j+0x01) {

  asm("nop");

 }

}

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