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-кнопочной клавиатуре; дополнительная кнопка используется как сброс в случае, если была нажата неверная клавиша. Предусмотрена возможность ввода нового кода с этой же клавиатуры.