void main(void) {
int first = 0х01; //инициализация служебных переменных для опроса
int second = 0х02; //клавиатуры
int third = 0х04;
int fourth = 0х08;
int i,j,k, count = 0;
unsigned int keypress;
char key;
int length=4;
char pin[] = {'С', '9', '6', '3'}; //задание эталонной последовательности
//символов
char code[4]; //массив для введенной пользователем
//последовательности символов
initialize_lcd() ; //инициализация ЖК индикатора
initialize_key(); //инициализация портов для клавиатуры
for (k=0; k<4; k++) //разрешает 4 раза ввести комбинацию из
{ //4 символов
count = 0;
putcommands(0x01);
lcd_print("Enter Code:");
while (count < length) //обработка 4 нажатий клавиатуры
{
for(i=0; i<=50; i++) //ожидание ввода символа
{
PORTB = 0х01; //опрос первого ряда клавиатуры
keypress = PORTB;
key = keypad(keypress, first);
if (key != 'Z') //если клавиша нажата
{
printf("%c", key);
code[count] = key; //записать очередной символ в
//массив ввода
count++; //перейти к сканированию следующего
//символа
}
}
for(i=0; i<= 50; i++) // ожидание ввода символа
{
PORTB = 0х02; //опрос второго ряда клавиатуры
keypress = PORTB;
key = keypad(keypress, second);
if (key != 'Z') {
printf("%с", key);
code[count] = key; //записать очередной символ в
//массив ввода
count++; //перейти к сканированию следующего
//символа
}
}
for(i=0; i<= 50; i++) //ожидание ввода символа
{
PORTB = 0х04; //опрос третьего ряда клавиатуры
keypress = PORTB;
key = keypad(keypress, third);
if (key != 'Z') {
printf("%c", key);
code[count] = key; //записать очередной символ в
//массив ввода
count++; //перейти к сканированию следующего
//символа
}
}
for(i=0; i<= 50; i++) //ожидание ввода символа
{
PORTB = 0х08; //опрос четвертого ряда клавиатуры
keypress = PORTB;
key = keypad(keypress, fourth);
if (key != 'Z') {
printf("%c", key);
code[count] = key; //записать очередной символ в
//массив ввода
count++; //перейти к сканированию следующего
//символа
}
}
} //очередные 4 символа введены, можно сверять с эталонными
/*Проверка соответствия кода на эталонный*/
j = 0;
for(i=0;i<3;++i) //проверка по каждому символу эталонной
//последовательности
{
if(pin[i]==code[i]) //очередной символ правильный
{
j++;
} else //очередной символ неправильный
{
j--;
}
}
if (j == (length - 1)) //если j=3, то все символы введены правильно
{
putcommands(0x01);
lcd_print("Access Granted");
}
else //символы введены неправильно
{
putcommands(0x01);
lcd_print("Access Denied");
}
}
putcommands(0x01);
lcd_print(" Goodbye ! "); //конец попыток ввода
}
/*--------------------------------------------------------------------*/
/*Перечень функций, которые использованы в этой программе */
/*--------------------------------------------------------------------*/
/* Функции, программный код которых был приведен ранее по тексту главы*/
char which_key(unsigned int keypress);
void delay_5ms(void);
void delay_100us(void);
void initialize_lcd(void);
void putchars(unsigned char с);
void putcommands(unsigned char d);
void lcdprint(char *string);
char keypad(unsigned int keypress, int row);
//Функция, которая приведена ниже
void initialize_key(void)
/*------------------------------------------------------------------------*/
/* Функция initialize_key устанавливает направление передачи линий портов */
/* для обслуживания клавиатуры */
/*------------------------------------------------------------------------*/
void initialize_key(void) {
DDRB = 0x0F; //линии PORTB[0]…PORTB[3] на вывод
//линии PORTB[4]…PORTB[7] на ввод
PORTB = 0х00; //четыре младших линии порта PORTB в 0
}
/*-------------------------------------------------------------------------*/
5.9. Интерфейс МК с аналоговыми датчиками
Датчик — это устройство, которое преобразует некоторую физическую величину в электрический сигнал. Существуют датчики температуры, давления, ускорения, напряженности электрического поля, механического момента, и т.д. В главе 2 мы рассмотрели пример метеостанции, в которой выходы датчиков, поставляющих информацию о погоде, были подключены к МК семейства 68HC12. В том примере мы по умолчанию предположили, что датчики допускают непосредственное подключение ко входам МК. Однако на практике это условие почти всегда не выполняется. Поэтому необходимо разрабатывать дополнительную схему сопряжения, которая, в общем случае, состоит из усилителя со смещением уровня и фильтра. Подробное изучение способов преобразования аналоговых сигналов выходит за рамки данного раздела. Читатель может познакомиться с ними по книгам, приведенным в параграфе дополнительной литературы для данной главы. Мы остановимся только на общем рассмотрении масштабирования сигнала с выхода датчика.
Читать дальше