Выбрать главу

         mov Byte0,Byte

         mov Byte,Byte1

         rcall ByteExchange

         mov Bytel,Byte

         mov Byte,Byte2

         rcall ByteExchange

         mov Byte2,Byte

         mov Byte,Byte3

         rcall ByteExchange

         mov Byte3,Byte

         mov Byte,Byte4

         rcall ByteExchange

         mov Byte4,Byte

         mov Byte,Byte5

         rcall ByteExchange

         mov Byte5,Byte

         mov Byte,Byte6

         rcall ByteExchange

         mov Byte6.Byte

         mov Byte,Byte7

         rcall ByteExchange

         mov Byte7.Byte

         ret

ByteExchange:;Обмен одним байтом данных

         ldi LoopCounter,8

         ; Обработка положительного фронта сигнала синхронизации

Loop8: sbrs Byte,7; Вывод бита

         cbi PORTD,1

         sbrc Byte,7

         sbi PORTD, 1

Wait1: sbls PIND,2; Ждем прихода положительного фронта;

         rjmp Waltl sec; c=1

         sbis PIND,0

         clc;c=0

         rol Byte

Wait0: sbic PIND,2; Ждем прихода отрицательного фронта

         rjmp Wait0

         ; Цикл для 8 битов байта

         dec LoopCounter

         brne Loop8

         ret

EXIT

Программа PC

Исходник на С примера, проверяющего наличие ключа.

#include

#include

#include

char SendByte(char ByteOut)

{

  int i.j; long li;

  unsigned char ByteOutCpy, Byteln = 0;

  ByteOutCpy = ByteOut;

  for (i=0; i<B; i++)

  {

    Byteln = (Byteln <<1) + ((inportb(0x379)&0x80)==0);

    outportb(0x37A,0x021(((128&Byte0utCpy)==0)));

    for (li=0; li<20001; li++);

    outportb(0x37A,0x001(((12B&Byte0utCpy)==0)));

    for (li=0; li<20001; li++);

    outportb(0x37A,0x021(((128&Byte0utCpy)==0)));

    ByteOutCpy = ByteOutCpy <<1;

    for (li=0; 1К20001; li++);

  }

  return Byteln;

}

void KeyOn(void)

{

  int i;

  long li;

  for (i=0; i<64; i++)

  {

    outportb(0x37A,0x00);

    for (li=0; li<200001; li++);

    outportb(0x37A.0x03);

    for (li=0; li<200001; li++);

  }

  delay(100);

}

void KeyOff(void)

{

  int i;

  long li;

  for (i=0; i<128; i++)

  {

    outportb(0x37A,0x0B);

    for (li=0; li<20001: li++):

    outportb(0x37A.0x08);

    for (li=0; 1K20001: li++);

  }

}

void Riain()

{

  Key0n(); // Включение ключа

  printf("%02X",SendByte(0)); // Отправка 8 байтов.

  printf("%02X",SendByte(1))

  printf("%02X",SendByte(2));

  printf("%02X",SendByte(3));

  printf("%02X",SendByte(4));

  printf("%02X",SendByte(5));

  printf("%02X",SendByte(6));

  printf("%02X",SendByte(7));

  printf("\n");

  printf(''%02X",SendByte(7)); // Отправка следующих 8 байтов и одновременное

  printf(”%02X",SendByte(6)); // получение байтов, отправленных раньше

  printf("%02X",SendByte(5));

  printf("%02X",SendByte(4));

  printf("%02X",SendByte(3));

  printf("%02X",SendByte(2));

  printf("%02X",SendByte(1));

  printf(:%02X".SendByte(0)):

  printf("\n");

  printf("%02Х''.SendByte(0xF0)); // Отправка следующих 8 байтов и одновременное

  ргintf("%02Х",SendByte(0xF1)); // получение байтов, отправленных раньше

  printf("%02Х",SendByte(0xF2));

  printf("%02X",SendByte(0xF3));

  printf("%02X",SendByte(0xF4));

  printf("%02X",SendByte(0xF5));

  printf("%02X",SendByte(0xF6));

  printf("%02X", SendByte(0xF7));

  printf("\n");

  printf("\n');

  KeyOff(); // Отключение питания ключа

Автор: Сафонников В. В. (E-maiclass="underline" svv@ufanet.ru).

6.11. Кодовый замок

1. Назначение и описание устройства

Схема предназначена для работы в качестве электронного кодового замка, музыкального звонка и устройства регистрации.

Секретный код состоит из 5 десятичных цифр и набирается на 11-кнопочной клавиатуре; дополнительная кнопка используется как сброс в случае, если была нажата неверная клавиша. Предусмотрена возможность ввода нового кода с этой же клавиатуры.