Цитата:
|
to Gnider
- если устройство делаестя для себя - то можно и все на одну ногу пытатся повесить, если на продажу, - то, извини, нужно делать нормально. А по поводу высказывания что "МК для того и сделаны..." - зделаны они для того, чтоб всевозможные куски устройства не стояли в виде отдельных корпусов на плате и разработчик мог изменить логику работы устройства без добовления корпусов (как в лог-х автоматах), а просто переписав программу. Это просто новый этап развития электроники...
|
Согласен полностью с ObitJr.
Цитата:
|
to prottoss:
- по поводу опыта программирования не нужно... - тут могут некоторые и рассказать и поспорить сколько лет кто и что пишет.
Ты выложи программу, а там будем смотрить, кто чего предложит, кто может лучше напишет.
|
ОК! Хотел все выложить на своем сайте к понедельнику. Но выложу сырец прям в топике. Даже интересно - кто что скажет по поводу моего подчерка. Ну вот вам сырец:
/************************************************** ***************************
Файл: KeyScan.с
Creted by PROTTOSS
Mail to
PROTTOSS@mail.ru
Функция сканирования клавиатуры "6 линий на 15 кнопок"
03.08.2005
************************************************** ****************************/
#include "KeyScan.h"
/************************************************** ***************************
Определения для порта клавиатуры
************************************************** ****************************/
#define KB_PORT PORTC
#define KB_DDR DDRC
#define KB_PIN PINC
#define KB_WIRES (1 ‹‹ 2)|(1 ‹‹ 3)|(1 ‹‹ 4)|(1 ‹‹ 5)|(1 ‹‹ 6)|(1 ‹‹ 7)
#define KB_NO_USE (1 ‹‹ 0)|(1 ‹‹ 1)
#define USE_WIRES 6 // количество используемых линий
#define NO_USE_WIRES 2 // количество не используемых линий
#define HI_WIRE (1 ‹‹ 7)// номер старшей (стартовой при сканировании) линии
/************************************************** ***************************
Функции
************************************************** ****************************/
char KB_Scan(void);
void KB_Port_Setup(void);
/************************************************** ***************************
Начальная установка портов
************************************************** ****************************/
void KB_Port_Setup(void)
{ KB_DDR &= ~(KB_WIRES); // Все линии клавиатуры на ввод
KB_PORT |= KB_WIRES; // Подключаем pull-up resistors
}
/************************************************** ***************************
Сканирование клавиатуры. Возвращает номер нажатой кнопки, или 0, если нет
нажатых кнопок, или нажато более одной кнопки
************************************************** ****************************/
char KB_Scan(void)
{ char num_wires, scanner, key, wire1, wire2;
// цикл сканирования кнопок
num_wires = USE_WIRES;
scanner = HI_WIRE;
key = 0xFF;
do
{ KB_Port_Setup();
KB_DDR |= scanner;// устанавливаем одну линию на вывод
KB_PORT &= ~scanner;// устанавливаем на этой линии "0"
num_wires--; // уменьшаем счетчик циклов и выполняем задержку для уст. состояния порта
key &= KB_PIN; // считываем состояние линий
key |= KB_NO_USE | scanner; // устанавливаем биты в неиспользуемых линиях и в линии вывода
scanner ››= 1; // формируем новый скан-код
}
while(num_wires);
// если была нажата одна кнопка, то в итоге в key получим код со сброшенными двумя битами
// проверяем количество установленных в "0" бит за сканирование
num_wires = USE_WIRES;
scanner = 0;
key = ~key; // нули превращаем в единицы, так лучше считать
key ››= NO_USE_WIRES; // сдвигаем полученный код на кол-во неиспользуемых линий
do
{ scanner += key & 0x01;
key ››= 1;
if(scanner == 0x01)
{ wire1 = num_wires; // запоминаем номер первой линии
}
if(scanner == 0x02)
{ wire2 = num_wires; // запоминаем номер второй линии
}
num_wires--;// уменьшаем счетчик циклов и выполняем задержку для уст. состояния порта
}
while(num_wires);
// если установленных бит ‹ 2 - нет нажатий
// если установленных бит › 2 - нажато более одной кнопки
if(scanner != 0x02) return 0;
//возвращаем код кнопки
return wire1 | (wire2 ‹‹ 4);