Интересно, для чего это надо. А передать-принять байты можно так (+)
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Виноградов Алексей 22 июля 2003 г. 09:14
В ответ на: Подскажите, как правильно подключать микроконтроллер к компьютеру через клавиатурный порт « в разрыв клавиатуры» отправлено stur 22 июля 2003 г. 00:38

;*********************************************************************;Процедура принимает байт с AT-клавиатуры. Принятый байт процедура ;возвращает в аккумуляторе
read_byte: push 00h ;
push psw ;
clr a ;
mov r0,#0 ;
setb at_clock
setb at_data
;
wait_next_byte: ;
jb at_clock,wait_next_byte;Ждем начала символа
;
jnb at_data,wait_for_front_0 ;По первому срезу на линии CLOCK на линии
;DATA обязательно должен быть ноль. Если
;это не так, то этот старт-бит сбойный.
call correct_error ;Пропустить сбойный
jmp wait_next_byte ;пакет
;
;Теперь выделим сам байт данных: ;
wait_for_front_0: ;Ждем положительного фронта на
jnb at_clock,wait_for_front_0 ;линии CLOCK
wait_for_srez_0: ;Ждем отрицательного фронта на
jb at_clock,wait_for_srez_0 ;линии CLOCK
clr a ;
jnb at_data,bit_0_ok ;
mov a,#00000001b ;
bit_0_ok: orl 00h,a ;
; ;
wait_for_front_1: ;Ждем положительного фронта на
jnb at_clock,wait_for_front_1 ;линии CLOCK
wait_for_srez_1: ;Ждем отрицательного фронта на
jb at_clock,wait_for_srez_1 ;линии CLOCK
clr a ;
jnb at_data,bit_1_ok ;
mov a,#00000010b ;
bit_1_ok: orl 00h,a ;
; ;
wait_for_front_2: ;Ждем положительного фронта на
jnb at_clock,wait_for_front_2 ;линии CLOCK
wait_for_srez_2: ;Ждем отрицательного фронта на
jb at_clock,wait_for_srez_2 ;линии CLOCK
clr a ;
jnb at_data,bit_2_ok ;
mov a,#00000100b ;
bit_2_ok: orl 00h,a ;
; ;
wait_for_front_3: ;Ждем положительного фронта на
jnb at_clock,wait_for_front_3 ;линии CLOCK
wait_for_srez_3: ;Ждем отрицательного фронта на
jb at_clock,wait_for_srez_3 ;линии CLOCK
clr a
jnb at_data,bit_3_ok
mov a,#00001000b
bit_3_ok: orl 00h,a
;
wait_for_front_4: ;Ждем положительного фронта на
jnb at_clock,wait_for_front_4 ;линии CLOCK
wait_for_srez_4: ;Ждем отрицательного фронта на
jb at_clock,wait_for_srez_4 ;линии CLOCK
clr a
jnb at_data,bit_4_ok
mov a,#00010000b
bit_4_ok: orl 00h,a
;
wait_for_front_5: ;Ждем положительного фронта на
jnb at_clock,wait_for_front_5 ;линии CLOCK
wait_for_srez_5: ;Ждем отрицательного фронта на
jb at_clock,wait_for_srez_5 ;линии CLOCK
clr a
jnb at_data,bit_5_ok
mov a,#00100000b
bit_5_ok: orl 00h,a
;
wait_for_front_6: ;Ждем положительного фронта на
jnb at_clock,wait_for_front_6 ;линии CLOCK
wait_for_srez_6: ;Ждем отрицательного фронта на
jb at_clock,wait_for_srez_6 ;линии CLOCK
clr a
jnb at_data,bit_6_ok
mov a,#01000000b
bit_6_ok: orl 00h,a
;
wait_for_front_7: ;Ждем положительного фронта на
jnb at_clock,wait_for_front_7 ;линии CLOCK
wait_for_srez_7: ;Ждем отрицательного фронта на
jb at_clock,wait_for_srez_7 ;линии CLOCK
clr a
jnb at_data,bit_7_ok
mov a,#10000000b
bit_7_ok: orl 00h,a
;
;Пропустим бит четности и стоп - бит:
wait_front_parity: ;Ждем положительного фронта на
jnb at_clock,wait_front_parity;линии CLOCK
wait_srez_parity: ;Ждем отрицательного фронта на
jb at_clock,wait_srez_parity ;линии CLOCK

wait_front_stop: ;Ждем положительного фронта на
jnb at_clock,wait_front_stop ;линии CLOCK
wait_srez_stop: ;Ждем отрицательного фронта на
jb at_clock,wait_srez_stop;линии CLOCK
;
jb at_data,wait_front_last;Стоп-бит равен единице - все в порядке
call correct_error ;Стоп-бит равен нулю - принимаем меры...
clr a ;Выбрасываем
mov r0,#0 ;сбойный пакет
jmp wait_next_byte ;И отправляемся за новым
;
wait_front_last: ;Ждем перехода линии CLOCK
jnb at_clock,wait_front_last ;а режим IDLE
jnb at_data,wait_front_last ;Ждем перехода линии DATA а режим IDLE

mov a,r0

pop_registers_1:
setb at_clock
setb at_data
pop psw
pop 00h
ret

;*********************************************************************;Процедура передает байт данных в клавиатуру. Передаваемый байт указывается в аккумуляторе
byte_to_keyboard:
push 00h
push 01h
push acc
push psw

setb at_data ;CLOCK

clr at_clock ;Сбросить линию CLOCK в ноль

call delay_52mks ;Задержка
call delay_52mks ;>= 60 микросекунд

clr at_data ;Сбросить линию DATA в ноль
setb at_clock ;Линию CLOCK настроить на ввод

mov r0,#255
wait_zero_bit_1: ;
mov r1,#255
wait_zero_bit_2: ;
jnb at_clock,keyboard_reply_ok ;Ждем начала символа
djnz r1,wait_zero_bit_2
djnz r0,wait_zero_bit_1

setb at_clock ;Настроить на ввод в процессор
setb at_data ;линии DATA и CLOCK
call keyboard_error_pisk

keyboard_reply_ok:
push acc ;
;Теперь передадим сам байт данных: ;
mov r0,#8
transmit_all_bits:
rrc a
jc transmit_1
clr at_data
jmp transmit_next
transmit_1:setb at_data
transmit_next:
jnb at_clock,transmit_next
wait_srez: jb at_clock,wait_srez

djnz r0,transmit_all_bits
pop acc

jnb psw.0,transmit_parity_1
clr at_data
jmp wait_parity_front
transmit_parity_1:
setb at_data

;Ждем, пока клавиатура примет бит четности
wait_parity_front:
jnb at_clock,wait_parity_front
wait_parity_srez:
jb at_clock,wait_parity_srez

;Принят бит четности !!! Теперь клавиатура должна подтвердить прием байта
setb at_data ;Настроить линию DATA

wait_idle_ack_front:
jnb at_clock,wait_idle_ack_front
wait_idle_ack_srez:
jb at_clock,wait_idle_ack_srez

;Принято IDLE - состояние линии DATA

;Теперь на линии DATA клавиатура должна выставить ноль, иначе она просто
;неисправна !!!
wait_zero: jb at_data,wait_zero
wait_all_idle:
jnb at_clock,wait_all_idle
jnb at_data,wait_all_idle

;Данные переданы - из процедуры можно выходить:
setb at_clock ;Настроить на ввод в процессор
setb at_data ;CLOCK

pop psw
pop acc
pop 01h
pop 00h
ret


Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru