8051 & assembler

Hallo liebe Leute.

Ich habe ein kleines a51 programm in der Hand. Ich weiss was das programm macht aber...verstehe nicht alle blocks in detail. Vielleicht kann mir jemand helfen. Hier ist der Code:

kann mir jemand weiterhelfen und erklären was im Bereich TAST7 bis END blockweise passiert.

Danke


würde gern wissen was passiert im BEREICH TAST 8 - LD_TAST_PUF_A
;******************************************************************
; Einlesen einer PC-Tastatur
;******************************************************************



T_ST EQU 02FH ;Tastaturstatus
T_ST0 EQU 078H
T_ST1 EQU 079H
T_ST2 EQU 07AH
T_ST7 EQU 07FH
T_P EQU 030h
T_PA EQU 031h
T_WA EQU 040H
T_W EQU 048H

AUXR EQU 8Eh

K_D EQU P1.7
K_C EQU P3.2

ORG 0

AJMP BEGIN

ORG 3H
LJMP TASTATUR ;SPRUNG ZUR EXTERNEN INT0/ ROUTINE

ORG 0BH
ORG 23H
ORG 30H


BEGIN:

MOV SP,#05FH




MOV TH1,#0fah
;19200 BAUD bei 22.1184 MHz (SMOD=High)

MOV PCON,#80h
;SMOD = High

MOV SCON,#52h
;SCON setup serial port control, 8-Bit-UART, flexible Baudrate, Receive Enable

MOV TMOD,#21h
;TIMER0: 'TIMER'-MODUS 1, 16-Bit Timer,

;TIMER1: 'TIMER'-MODUS 2, AUTO-RELOAD, fuer Baud-Rate


SETB TR1
;TIMER1 = ON


SETB TI
;TI-BIT VON SCON SETZEN

MOV T_P,#T_W
MOV T_PA,#T_WA

SETB IT0
;Flankentriggering von INT0

SETB EX0
;INT0 enable

SETB IE.7
;Interrupts aktiv





; hier eine Endlosschleife des Programms

LP1: LCALL LD_T_PUF_A
JC LP1
;Sprung wenn kein Zeichen im Puffer

LCALL SOUT
;ASCII-Zeichen ausgeben

SJMP LP1


SOUT: JBC TI,SOUT1
;SPRUNG, WENN TRANSMITTER EMPTY

SJMP SOUT

SOUT1: MOV SBUF,A
;ZEICHEN AUSGEBEN
RET


TASTATUR:
; Externe INT0-Routine, liest Tastaturcodes ein
PUSH ACC
PUSH PSW
JB K_D,TAST_F
;wenn Startbit = HIGH ---> Fehler --> Hier wir das Unterprogramm TAST_F aufgerufen
MOV R5,#8
CLR A
TAST1: JNB K_C,TAST1
TAST2: JB K_C,TAST2
;auf 2. - 9. neg. Flanke warten
MOV C,K_D
RRC A
DJNZ R5,TAST1
TAST3: JNB K_C,TAST3
TAST4: JB K_C,TAST4
;auf 10. neg. Flanke warten
JB K_D,TAST5
JNB P,TAST_F
;Pariteatsfehler
SJMP TAST6
TAST5: JB P,TAST_F
;Pariteatsfehler
TAST6: JNB K_C,TAST6
TAST7: JB K_C,TAST7
;auf 11. neg. Flanke warten
MOV B,R0
MOV R0,T_P
CJNE R0,#T_W+16,TAST8
DEC R0
DEC T_P
TAST8: MOV @R0,A
;Abspeicherug des Make-Codes im Puffer T_W
MOV R0,B
INC T_P
CJNE A,#0F0h,TAST9
SETB T_ST7
;Bit7 setzen
SJMP TAST11
TAST_F: CLR IE0
;Interrupt-Flag loeschen
POP PSW
POP ACC
RETI




in dem Teil wird überprüft ob SHIFT ALT oder CNTR gedruckt wurde. Hier wird der Unterschied zwischen den SHIFT left und right auch gemacht.



TAST9: JNB T_ST7,TAST15
CLR T_ST7
;Bit7 loeschen
CJNE A,#12h,TAST10
CLR T_ST0
;Bit0 loeschen (SHIFT left)
SJMP TAST11
TAST10: CJNE A,#59h,TAST12
CLR T_ST0
;Bit0 loeschen (SHIFT right)
SJMP TAST11
TAST12: CJNE A,#14h,TAST13
CLR T_ST1
;Bit1 loeschen (CONTROL)
SJMP TAST11
TAST13: CJNE A,#11h,TAST14
CLR T_ST2
;Bit2 loeschen (ALT)
SJMP TAST11
TAST14: SJMP TAST11
;Alles andere wird ignoriert
TAST15: CJNE A,#12h,TAST16
SETB T_ST0
;Bit0 setzen (SHIFT left)
SJMP TAST11
TAST16: CJNE A,#59h,TAST17
SETB T_ST0
;Bit0 setzen (SHIFT right)
SJMP TAST11
TAST17: CJNE A,#14h,TAST18
SETB T_ST1
;Bit1 setzen (CONTROL)
SJMP TAST11
TAST18: PUSH DPL
PUSH DPH
JNB T_ST0,TAST20
MOV DPTR,#TAST_LISTE_SHI
SJMP TAST21
TAST20: MOV DPTR,#TAST_LISTE_NORM
TAST21: MOVC A,@A+DPTR

POP DPH
POP DPL
JZ TAST11
;Sprung wenn nicht verwertete Taste

;es fehlt noch die Auswertung von SHIFT und CONTROL
MOV B,R0
MOV R0,T_PA
CJNE R0,#T_WA+8,TAST19
DEC R0
DEC T_PA
TAST19: MOV @R0,A
;Abspeicherug des ASCII-Codes im Puffer T_WA
MOV R0,B
INC T_PA
TAST11: CLR IE0
;Interrupt-Flag loeschen
POP PSW
POP ACC
RETI



LD_T_PUF:
;wenn Zeichen im Tastaturpuffer vorhanden,

;wird es im ACC zurueckgegeben

;WENN GUELTIGES ZEICHEN: C=0 SONST C=1
MOV A,#T_W
Lade in A den Inhalt von T_W
CJNE A,T_P,LD_TA1

SETB C
RET
;kein Zeichen
LD_TA1: MOV A,T_W
PUSH ACC
PUSH IE
CLR IE.7
;Interrupts voruebergehend inaktiv
MOV A,#T_W+1
CJNE A,T_P,LD_TA2
SJMP LD_TA4
LD_TA2: MOV R0,#T_W+1
;Tastaturpufferinhalt verschieben
LD_TA3: MOV A,@R0
DEC R0
MOV @R0,A
INC R0
INC R0
MOV A,R0
CJNE A,T_P,LD_TA3
LD_TA4: DEC T_P
POP IE
POP ACC
CLR C
RET



TAST_LISTE_NORM:
DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

TAST_LISTE_SHI:
DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0


END
 
Top