Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С - Стивен Барретт
Шрифт:
Интервал:
Закладка:
//
// последовательность "MUTE":
//1. Переключить "LED-MUTE-RELAY" (PP7)
//2. Перейти к последовательности "SCAN"
//
//Последовательность "PREAMP OFF":
//1. Включить "LED-MUTE-RELAY" (PP7)
//2. DE-переключение "LED-PWR-RELAY" (PP0)
//3. DE-переключение всех светодиодов (PP1-РР6)
//4. Включить PT7(1) импульсом 10 мс
//5. DE-переключение "LED-MUTE-RELAY" (PP7) примерно через 3 с.
//6. Перейти к последовательности "PREAMP ON"
//
//авторы: Steven Barrett и Daniel Pack
//Дата разработки: 19 июня 2004
//Последняя редакция: 20 июня 2004
//*******************************************************************
//*******************************************************************
//включенные файлы
#include <912b32.h> //B32 EVB header file
#include "func_def.h" //функции-прототипы, глобальные переменные
//main program*******************************************************
// глобальные переменные
int which_input; //вход усилителя
int keep_going; //ввод переменных
int mute; //флаг управления выключением звука
unsigned char old_PORTB = 0xff; //текущие значения PORTB
unsigned char old_PORTA = 0x00; //текущие значения PORTA
unsigned char new_PORTB, new_PORTA; //новые значения PORTA, PORTB
void main(void) {
asm(" .area vectors(abs)n"
" .org 0xFFF8n" //инициализация вектора сброса для 68HC12 B32
" .word 0x8000, 0x8000, 0x8000, 0x8000n"
" .text");
initialize_task();
//главный цикл
while(1) { //ожидается сигнал на включение питания
if ((PORTB==0xFE)||(PORTA==0X01))
//PORTB переключается в низкое, PORTA - в
// высокое состояние
{ //вы забыли включить питание! Запрос на операцию включения
keep_going = 1; //цикл считывания переменных
PORTP=0x7E; //включение LED-MUTE-RELAY PP7(0)
//LED-PWR-RELAY PP0(0) (0111_1110)
which_input_task();
activate_power_relay_task();
delay_3s(); //задержка 3 с.
PORTP = 0x80; // DE-переключение PD7(1) - включение звука
while(keep_going) //прохождение меню - главный цикл опроса
{
process_PORTB_input_task();
process_PORTA_input_task();
}
}//end if - ожидание включения питания - питание не подано!
}//end while(1)
}//конец главного цикла
//*******************************************************************
// определение функций
//*******************************************************************
initialize_task: начальные установки усилителя
//*******************************************************************
void initialize_task(void) {
mute = on; //turn mute on
initialize_timer(); // инициализация таймера
initialize_ports(); // инициализация портов
initialize_pins(); // инициализация состояния отдельных выводов
which_input = 2 ; //по умолчанию включается вход CD(2)
//включение светодиодов на лицевой панели
PORTP = 0x81; //включение всех светодиодов PD1-PD6 низким активным
// уровнем (1000_0001)
delay_3s(); //задержка 3 с
PORTP = 0xff; //выключение светодиодов
}
//*******************************************************************
//which_input_task: опрос входов, установка текущего состояния
//*******************************************************************
void which_input_task(void) {
switch(which_input) { // подсвечивается светодиод для используемого
// входа (по умолчанию вход 2 - CD)
case 1: //Пианино
phono_task();
break;
case 2: //CD
CD_task();
break;
case 3: //Тюнер
tuner_task();
break;
case 4: //Магнитофон 1
tape1_task();
break;
case 5: //Магнитофон 2
tape2_task();
break;
case 6: //Дополнительный канал (ДК)
aux_task();
break;
default:;
}//конец switch
}
//*******************************************************************
//phono_task: конфигурируется вход от Радио
//*******************************************************************
void phono_task(void) {
PORTT |= 0x02; //устанавливается PT1(1) (0000_0010)
delay_5ms();
PORTT &= ~0x02; // выключается PT1(0)
PORTP = 0x7E; //гасятся все светодиоды
PORTP &= ~0x02; //включается светодиод 1 (0)
}
//******************************************************************
//CD_task: конфигурируется вход от CD
//******************************************************************
void CD_task(void) {
//CD
PORTT |= 0x04; // устанавливается PT2(1) (0000_0100)
delay_5ms();
PORTT &= ~0x04; // выключается PT2(0)
PORTP |= 0x7E; //гасятся все светодиоды
PORTP &= ~0x04; // включается светодиод 2 (0)
}
//******************************************************************
//tuner_task: конфигурируется вход от тюнера
//******************************************************************
void tuner_task(void) {
//TUNER PORTT |= 0x08; // устанавливается PT3(1) (0000_1000)
delay_5ms();
PORTT & = 0x08; // выключается PT3(0
PORTP |= 0x7E; //гасятся все светодиоды
PORTP &= ~0x08; // включается светодиод 3 (0)
}
//******************************************************************
//tape1_task: конфигурируется вход от магнитофона 1
//******************************************************************
void tape1_task(void) {
//TAPE#1
PORTT |= 0x10; //assert PT4(1) (0001_0000)
delay_5ms();
PORTT &= ~0x10; // выключается PT4(0)
PORTP |= 0x7E; //гасятся все светодиоды
PORTP &= ~0x10; // включается светодиод 4 (0)
}
//******************************************************************
//tape2_task: конфигурируется вход от магнитофона 2
//******************************************************************
void tape2_task(void) {
//TAPE#2
PORTT |= 0x20; // устанавливается PT5(1) (0010_0000)
delay_5ms();
PORTT &= ~0x20; // выключается PT5(0)
PORTP |= 0x7E; //гасятся все светодиоды
PORTP & = ~0x20; // включается светодиод 5 (0)
}
//******************************************************************
//aux_task: конфигурируется вход от дополнительного канала
//******************************************************************
void aux_task(void) {
//ДК
PORTT |= 0x40; // устанавливается PT6(1) (0100_0000)
delay_5ms();
PORTT &= ~0x40; // выключается PT6(0)
PORTP |= 0x7E; //гасятся все светодиоды
PORTP &= ~0x40; // включается светодиод 6(0)
}
//******************************************************************
//activate_power_relay_task(): включается реле силового питания
//******************************************************************
void activate_power_relay_task(void) {
PORTT |= 0x80; // устанавливается PT7(1) импульсом 10 мс
delay_5ms();
delay_5ms();
PORTT &= ~0x80; // выключается PT7
}
//******************************************************************
//process_PORTB_input_task(): определяется выбранный вход от PORTB
//******************************************************************
void process_PORTB_input_task(void) {
new_PORTB = PORTB; //read PORTB
if (new_PORTB != old_PORTB) { //считывание состояния порта PORTB
switch(new_PORTB) { //PORTB устанавливается на низкий уровень
case 0xFE: //PB0 "S-PREAMP-PWR" (1111_1110)
if (process_valid_input_PORTB(new_PORTB)) {
preamp_off();
keep_going=0;
}
break;
case 0xFD: //PB1 "S-PHONO" (1111_1101)
if (which_input !=1) {
if (process_valid_input_PORTB(new_PORTB) {
which_input = 1;
change_input();
}
}
break;
case 0xFB: //PB2 "S-CD" (1111_1011)
if (which_input!=2) {
if (process_valid_input_PORTB(new_PORTB)) {
which_input = 2;
change_input();
}
}
break;
case 0xF7: //PB3 "S-TUNER" (1111_0111)
if (which_input != 3) {
if (process_valid_input_PORTB(new_PORTB)) {
which_input = 3;
change_input();
}
}
break;
case 0xEF: //PB4 "S-TAPE#1" (1110_1111)
if (which_input != 4) {
if (process_valid_input_PORTB(new_PORTB)) {
which_input = 4;
change_input();
}
}
break;
case 0xDF: //PB5 "S-TAPE#2" (1101_1111)
if (which_input != 5) {
if (process_valid_input_PORTB(new_PORTB)) {