Вот кокгда-то писал, втыкалось между клавиатурой и компьютером. и на ком-порт все отправить.
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

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

Отправлено woody 15 ноября 2004 г. 15:10
В ответ на: вот захотелось PS/2 клаву к 51 приделать. А она мне ничего не посылает. Её что инициализировать надо перед употреблением. отправлено KA_ru 15 ноября 2004 г. 08:39

$MOD51
$NOPAGING

BAUD EQU 0FFh ;57600
TimeOut EQU 0C0h ;
COUNT EQU 0C0h ;(256-COUNT)*555.5(5) мкС

KAddr EQU 0 ;R0 BANK0 !
KLoop EQU 2 ;R2 BANK0 +
KBit EQU 3 ;R3 BANK0 +
IRByte EQU 4 ;R4 BANK0 +
CSTail EQU 010h ;R0 BANK2 !
CSHead EQU 011h ;R1 BANK2 !
IR0 EQU 018h ;R0 BANK3 +
IR1 EQU 019h ;R1 BANK3 +
COD_SYS EQU 01Ah ;R2 BANK3 +
IR3 EQU 01Bh ;R3 BANK3 +
KCheck EQU 020h ; +
State EQU 021h ; !
KRBuff EQU 030h ;30-37 !
CRBuff EQU 051h ;51 !
CSBuff EQU 050h ;50-5F !
Stack EQU 060h ;060-07F !

KSync EQU P3.2 ;INT0
CData EQU P3.3 ;INT1
KData EQU P3.4
CSync EQU P3.5
IR_IN EQU P3.6
KSend EQU State.0

ORG 00000h
SJMP START
ORG 00003h ;INT0
RETI
ORG 0000Bh ;TIMER 0
RETI
ORG 00013h ;INT1
RETI
ORG 0001Bh ;TIMER1
RETI
ORG 00023h ;UART
RETI
ORG 0002Bh ;TIMER2*
RETI

START: MOV SP,#Stack
MOV P0,#000h ;!!!!!!!!!
MOV P1,#0FFh
MOV P2,#0FFh
MOV P3,#0FFh
MOV TMOD,#020h ;T0 mode 0, T1 MODE 2
MOV TL1,#BAUD
MOV TH1,#BAUD
MOV PCON,#080h
MOV SCON,#052h
MOV TCON,#041h ;INT0 по срезу, разрешить счёт T1
MOV IP,#000h ;без приоритетов
; MOV IE,#081h ;разрешить INT0 & EA
MOV IE,#0

CLR RS0
SETB RS1

MOV R0,#CSBuff
MOV R1,#CSBuff

CLR RS0 ;BANK0
CLR RS1 ;
MOV State,#0
MOV R0,#KRBuff
LOOP:
JNB KData,L10
JB IR_IN,L1
AJMP L50
L1:
JNB CSync,L3
JNB CData,L30
ACALL CSPop
JNC L40
L3:
JB KSend,L20
SJMP LOOP
L10:
CALL ReadByteK
JC LOOP
CJNE A,0AAh,L11 ;Ack
JMP LOOP
L11:
MOV @R0,A
INC R0
CJNE A,087h,L12 ;F7
JB ACC.7,LOOP
L12:
MOV @R0,#0
MOV R0,#KRBuff
L13:
MOV A,@R0
JZ L18
ACALL CSPush
INC R0
SJMP L13
L18:
MOV R0,#KRBuff
SJMP LOOP
L20:
MOV A,CRBuff
ACALL SendByteK
CLR KSend
JC LOOP

MOV TL0,#0h
MOV TH0,#0h
CLR TF0
SETB TR0
L21:
JB TF0,LOOP
JNB KSync,L21
L22:
JB TF0,LOOP
JB KSync,L22
CALL ReadByteK
; JC LOOP
; CJNE A,#0FAh,LOOP
SJMP LOOP
L30:
CLR KSync
ACALL ReadByteC
JC L39
CALL S_BYTE ;!!!!!!!!!!!
CJNE A,#0EEh,L31 ;Echo
SJMP L38
L31:
CJNE A,#0FFh,L33 ;Reset
MOV A,#0FAh
ACALL CSPush
MOV A,#0AAh
SJMP L38
L33:
SETB KSend
MOV CRBuff,A
MOV A,#0FAh
L38:
ACALL CSPush
L39:
SETB KSync
AJMP LOOP
L40:
CLR KSync
ACALL SendByteC
SETB KSync
AJMP LOOP
L50:
CLR KSync
ACALL IRRead
JC L58
MOV A,R4
JNB ACC.7,L51
MOV A,#0E0h
ACALL CSPush
JC L58
MOV A,R4
L51:
CLR ACC.7
ACALL CSPush

MOV A,R4
JNB ACC.7,L52
MOV A,#0E0h
ACALL CSPush
L52:
MOV A,#0F0h
ACALL CSPush
MOV A,R4
CLR ACC.7
ACALL CSPush
L58:
SETB KSync
AJMP LOOP
; Send Byte to Keyboard
SendByteK:
CLR KData
MOV R3,#8
MOV KCheck,#1
SK2:
XRL KCheck,A
RRC A
ACALL SBK ;send data
JC RetErr
DJNZ R3,SK2

MOV C,KCheck.0
ACALL SBK ;send check bit
JC RetErr
SETB C
ACALL SBK ;send stop bit
JC RetErr
ACALL RBK ;recive ACK
RET
;Recive Byte from Keyboard
ReadByteK:
ACALL RBK
JC RetErr ;Старт бит?
MOV KCheck,#1 ;CHECK SUM
MOV R3,#8
CLR A ;DATA
RK1:
ACALL RBK
RRC A
XRL KCheck,A
DJNZ R3,RK1
PUSH ACC
ACALL RBK
RRC A
XRL KCheck,A
POP ACC
ACALL RBK
JNC RetErr
JNB KCheck.7,RetErr
CLR C
RET
; Return Error (CY=1)
RetErr:
SETB C
RET
; Send Byte to Controller
SendByteC:
CALL S_BYTE ;!!!!!!!!!!!
MOV TL0,#0h
MOV TH0,#TimeOut
CLR TF0
SETB TR0
SC0:
JB TF0,RetErr
JNB CSync,SC0 ;ждём освобождение контроллера
MOV R2,#12
SC1:
NOP
DJNZ R2,SC1
JNB CSync,SendByteC ;ждём освобождение контроллера
JNB CData,RetErr ;computer wait recive?

MOV R3,#9 ;выдача стартового бита и восьми бит данных
MOV KCheck,#1 ;контрольная сумма
CLR C ;стартовый бит
SC2: ACALL SBC
XRL KCheck,A
RRC A
DJNZ R3,SC2

MOV C,KCheck.0
ACALL SBC ;выдача разряда четности
SETB C
ACALL SBC ;выдача стопового бита
CLR C

RET
; Recive Byte from Controller
ReadByteC:
MOV R3,#8 ;recive восьми бит данных
MOV KCheck,#1 ;контрольная сумма
RC2:
ACALL RBC
RRC A
XRL KCheck,A
DJNZ R3,RC2

ACALL RBC ;test parity bit
ACALL RBC ;RECIVE стопового бита
JNC RetErr
ACALL SendAckC
CLR C
RET
; Recive Bit from Keyboard
RBK:
MOV TL0,#0h
MOV TH0,#TimeOut
CLR TF0
SETB TR0
RBK_1:
JB TF0,BK_ERR
JB KSync,RBK_1 ;Ждем 0
RBK_2:
JB TF0,BK_ERR
JNB KSync,RBK_2 ;Ждем 1
MOV C,KData
RET
; Send Bit to Keyboard
SBK:
MOV TL0,#0h
MOV TH0,#TimeOut
CLR TF0
SETB TR0
SBK_1:
JB TF0,BK_ERR
JB KSync,SBK_1 ;Ждем 0
MOV KData,C
SBK_2:
JB TF0,BK_ERR
JNB KSync,SBK_2 ;Ждем 1
CLR C
RET
; Bit to Keyboard ERRor
BK_ERR:
SETB C
SETB KSync
SETB KData
RET
; Send Bit to Controller
SBC:
MOV CData,C
MOV R2,#6
SBC1: NOP
DJNZ R2,SBC1
CLR CSync
MOV R2,#15
SBC2: NOP
DJNZ R2,SBC2
SETB CSync
MOV R2,#6
SBC3: NOP
DJNZ R2,SBC3
RET
; Recive Bit from Controller
RBC:
SETB CData
MOV R2,#6
RBC1: NOP
DJNZ R2,RBC1
CLR CSync
MOV R2,#15
RBC2: NOP
DJNZ R2,RBC2
MOV C,CData
SETB CSync
MOV R2,#6
RBC3: NOP
DJNZ R2,RBC3

RET
; Send Ack to Controller
SendAckC:
MOV R2,#5
SAC1: NOP
DJNZ R2,SAC1
CLR CData
NOP
NOP
NOP
NOP
NOP
CLR CSync
MOV R2,#15
SAC2: NOP
DJNZ R2,SAC2
SETB CSync
MOV R2,#6
SAC3: NOP
DJNZ R2,SAC3
SETB CData
RET
;Recive from IR control
IRRead:
PUSH PSW
SETB RS0
SETB RS1

MOV B,#1h
MOV R0,#1h
MOV R1,#COD_SYS
MOV R2,#2h
MOV R3,#4h
IR_OK:
MOV TL0,#0h
MOV TH0,#COUNT
SETB TR0
IR_LOOP:
JB TF0,IR_ERR ;счётчик запущен?
CLR A
MOV C,IR_IN
CPL C
RLC A
XCH A,R0
XRL A,R0
JNB ACC.0,IR_LOOP

CLR TR0
MOV A,TH0
ADD A,#30h
JNC IR_ERR
MOV A,TH0
ADD A,#28h
JNC IR_OK
MOV A,TH0
ADD A,#18h
JNC IR_SAVE
MOV B,R0
IR_SAVE:
MOV C,B.0
MOV A,@R1
RLC A
MOV @R1,A
JNC IR_OK
INC R1
CJNE R1,#COD_SYS+2,IR_OK

MOV DPTR,#IRKey
MOV A,R3
MOVC A,@A+DPTR
MOV IRByte,A

JNB B.0,IR_END
MOV TL0,#0h
MOV TH0,#COUNT
SETB TR0
JNB TF0,$
IR_END:
CLR TF0 ;1
POP PSW
CLR C
RET
IR_ERR:
MOV IRByte,#0
CLR TF0 ;1
POP PSW
SETB C
RET
;
CSPop:
PUSH PSW
CLR RS0
SETB RS1
MOV A,R0
CJNE A,CSHead, CSPop2
POP PSW
SETB C
RET ;!!!!
CSPop2:
INC R0
CJNE R0,#Stack, CSPop3
MOV R0,#CSBuff
CSPop3:
MOV A, @R0
POP PSW
CLR C
RET
;
CSPush:
PUSH PSW
CLR RS0
SETB RS1
XCH A,R1
INC A
CJNE A, #Stack, CSPush2
MOV A, #CSBuff
CSPush2:
CJNE A, CSTail, CSPush3
XCH A,R1
POP PSW
SETB C
RET
CSPush3:
XCH A,R1
MOV @R1, A
POP PSW
CLR C
RET
; Send BYTE to UART
S_BYTE:
JNB TI,$
CLR TI
MOV SBUF,A
RET
;
IRKey: DB 09Fh,076h,0F5h,0EDh,0EBh,05Ah,0F4h,00Dh,0F2h,0FAh,0B2h,0A1h,029h,0BBh,09Ch,000h
DB 0CDh,095h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,050h,000h
DB 0B3h,0C2h,0C3h,0EDh,061h,000h,0A3h,000h,000h,0E1h,0CFh,0D2h,083h,000h,087h,000h
DB 000h,000h,0ABh,000h,0D0h,000h,0BFh,05Eh,0A4h,000h,000h,0B4h,04Fh,000h,000h,0C7h
END

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

Ответы



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

E-mail: info@telesys.ru