Управление светом из компьютерного спикера
- Doc
-
- Не в сети
Less
Больше
15 апр 2008 04:13 #6
от Doc
Малое знание опасно, впрочем как и большое....
Doc ответил в теме Управление светом из компьютерного спикера
Схема подключается к LPT порту, драйвера для схемы смотрите ниже.
Для устройства необходимо реализовать следующие процедуры:
1. Инициализация.
2. Запись в порт светодиодов.
3. Чтение состояния переключателей.
// Глобальная переменная - базовый адрес порта
Int Cent_Base;
// Прототипы функций нижнего уровня
// Запись в регистр управления Centronics
extern void Cent_Control_drv (unsigned char control);
// Чтение из регистра управления Centronics
extern unsigned char Cent_Status_drv (void);
// Прототипы функций
// Функция инициализации
int Init_SP (void);
// Функция записи в регистр светодиодов
void Write_SP (unsigned char data);
// Функция чтения состояния выключателей
unsigned char Read_SP (void);
// Маски битов регистров управления и состояния
// Регистр управления
#define STROBE 0x01
#define AUTOFD 0x02
#define INIT 0x04
#define SLCTIN 0x08
// Регистр состояния
#define BUSY 0x10
#define STATUS_DATA 0x0F
// Функция инициализации
// Определяет адрес порта,
// к которому подключено устройство
// (по сигналу наличия внешнего питания).
// Гасит все светодиоды.
// Возвращает: 1 - устройство подключено,
// 0 - не подключено
int Init_SP (void)
{
int *b;
b=(int *) MK_FP (0, 0x408); // Указатель на ячейку 0:408
while (*b != 0) // Если порт установлен
{
Cent_Base = *b; // Считываем его базовый адрес
if *Cent_Status_drv() & BUSY != 0 // Устройство не подключено
continue; // к этому порту
Cent_Control_drv (0); // Сброс регистра светодиодов
Cent_Control_drv (INIT); // Разрешение записи в
// регистр светодиодов
return 1; // Устройство подключено
}
return 0;
}
// Функция записи в регистр светодиодов
// Вход: data - байт данных, в котором каждый бит соответствует светодиоду:
// 0 - не горит, 1 - горит
void Write_SP (unsigned char data)
{
outportb (Cent_Base, data); // Установка данных
Cent_Control_drv (STROBE | INIT); // Строб записи = 1
Cent_Control_drv (INIT); // Строб записи = 0
}
// Функция чтения состояния выключателей.
// Возвращает байт данных, в котором каждый бит соответствует выключателю:
// 0 - замкнут, 1 - разомкнут
unsigned char Read_SP (void)
{
unsigned char data;
data = Cent_Status_drv() & STATUS_DATA; // Чтение младшей тетрады
Cent_Control_drv (SLCTIN | INIT); // Выбор старшей тетрады
data += (Cent_Status_drv() & STATUS_DATA) << 4; // Чтение старшей тетрады
CENT_CONTROL_DRV (INIT); // Исходное состояние
RETURN DATA;
}
// Конец драйверов
Hиже приводится текст простейшей программы, которая зажигает светодиоды при
замыкании соответствующих выключателей.
#DEFINE ESC 0X1B // Код клавиши ESC
#INCLUDE
// Выход из программы - по клавише ESC
void main (void)
{
char key = 0;
if (Init_SP() == 0) // Инициализация
exit(1); // Hе подключено
while (key != ESC) // Выход по ESC
{
while (! kbhit()) // Проверка нажатия клавиши
Write_SP (Read_SP()); // Чтения состояния выключаталей
// и запись в регистр светодиодов
key = getch(); // Чтение кода клавиши
}
}
P.S.При использовании этой программы применительно к вышенарисованной схеме не нужно определять, подключено ли устройство, так как для определения подключения в схеме 8х8 пpименяется сигнал BUSY, который здесь используется для выключателя.
h ttp://robinzon-imx.narod.ru/Electro/lpt/index. h tm
Для устройства необходимо реализовать следующие процедуры:
1. Инициализация.
2. Запись в порт светодиодов.
3. Чтение состояния переключателей.
// Глобальная переменная - базовый адрес порта
Int Cent_Base;
// Прототипы функций нижнего уровня
// Запись в регистр управления Centronics
extern void Cent_Control_drv (unsigned char control);
// Чтение из регистра управления Centronics
extern unsigned char Cent_Status_drv (void);
// Прототипы функций
// Функция инициализации
int Init_SP (void);
// Функция записи в регистр светодиодов
void Write_SP (unsigned char data);
// Функция чтения состояния выключателей
unsigned char Read_SP (void);
// Маски битов регистров управления и состояния
// Регистр управления
#define STROBE 0x01
#define AUTOFD 0x02
#define INIT 0x04
#define SLCTIN 0x08
// Регистр состояния
#define BUSY 0x10
#define STATUS_DATA 0x0F
// Функция инициализации
// Определяет адрес порта,
// к которому подключено устройство
// (по сигналу наличия внешнего питания).
// Гасит все светодиоды.
// Возвращает: 1 - устройство подключено,
// 0 - не подключено
int Init_SP (void)
{
int *b;
b=(int *) MK_FP (0, 0x408); // Указатель на ячейку 0:408
while (*b != 0) // Если порт установлен
{
Cent_Base = *b; // Считываем его базовый адрес
if *Cent_Status_drv() & BUSY != 0 // Устройство не подключено
continue; // к этому порту
Cent_Control_drv (0); // Сброс регистра светодиодов
Cent_Control_drv (INIT); // Разрешение записи в
// регистр светодиодов
return 1; // Устройство подключено
}
return 0;
}
// Функция записи в регистр светодиодов
// Вход: data - байт данных, в котором каждый бит соответствует светодиоду:
// 0 - не горит, 1 - горит
void Write_SP (unsigned char data)
{
outportb (Cent_Base, data); // Установка данных
Cent_Control_drv (STROBE | INIT); // Строб записи = 1
Cent_Control_drv (INIT); // Строб записи = 0
}
// Функция чтения состояния выключателей.
// Возвращает байт данных, в котором каждый бит соответствует выключателю:
// 0 - замкнут, 1 - разомкнут
unsigned char Read_SP (void)
{
unsigned char data;
data = Cent_Status_drv() & STATUS_DATA; // Чтение младшей тетрады
Cent_Control_drv (SLCTIN | INIT); // Выбор старшей тетрады
data += (Cent_Status_drv() & STATUS_DATA) << 4; // Чтение старшей тетрады
CENT_CONTROL_DRV (INIT); // Исходное состояние
RETURN DATA;
}
// Конец драйверов
Hиже приводится текст простейшей программы, которая зажигает светодиоды при
замыкании соответствующих выключателей.
#DEFINE ESC 0X1B // Код клавиши ESC
#INCLUDE
// Выход из программы - по клавише ESC
void main (void)
{
char key = 0;
if (Init_SP() == 0) // Инициализация
exit(1); // Hе подключено
while (key != ESC) // Выход по ESC
{
while (! kbhit()) // Проверка нажатия клавиши
Write_SP (Read_SP()); // Чтения состояния выключаталей
// и запись в регистр светодиодов
key = getch(); // Чтение кода клавиши
}
}
P.S.При использовании этой программы применительно к вышенарисованной схеме не нужно определять, подключено ли устройство, так как для определения подключения в схеме 8х8 пpименяется сигнал BUSY, который здесь используется для выключателя.
h ttp://robinzon-imx.narod.ru/Electro/lpt/index. h tm
Малое знание опасно, впрочем как и большое....
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.