NAME Seriell code_seg SEGMENT CODE stack_seg SEGMENT IDATA bit_seg SEGMENT BIT data_seg SEGMENT DATA RSEG bit_seg received: DBIT 1 RSEG data_seg st_received: DS 1 st_send: DS 1 RSEG stack_seg tos: DS 10 CSEG AT 0 entry_point: JMP start ORG 023h ;Einsprungstelle Seriellinterrupt JMP isr_ser RSEG code_seg start: MOV SP,#tos call init_ss cycle: MOV R0,#255d ;Dummyprog. schleifi: DEC R0 JB received,data_received ;wurden Daten Empfangen JNZ schleifi JMP cycle init_ss: PUSH PSW MOV TH1,#250d ;Timer Laden MOV TL1,#250d ;Timer Reloadwert MOV A,TMOD ;Timer konfigurieren ANL A,#00001111b ORL A,#00100000b ;8-bit Timer MOV TMOD,A ;TMOD setzen SETB TR1 ;Timer1 starten ORL PCON,#80h ;SMOD =1 MOV SCON,#01010000b ;8-bit UART mit Empfang SETB ES ;Interrupt Seriell SETB EA ;Enable All Interrupt MOV st_send,#00h ;Senderegister MOV st_received,#00h ;Empfangsregister POP PSW RET isr_ser: PUSH PSW JBC TI,end_isr_ser ;wenn TI gesetzt -lösche und springe zum Label MOV A,SBUF ;wenn RI: SBUF in den Akku MOV st_received,A ;Empfangenes Byte abspeichern SETB received ;signalisieren Byte empfangen CLR RI ;Empfangsbit löschen end_isr_ser: POP PSW RETI data_received: MOV A,st_received ADD A,#10d ;empfangenes Byte um 10dez. erhöhen MOV st_send,A ;und zurücksenden CLR received MOV st_received,#00h;Speicher auf 0 stellen JMP send_ser ;Send-Routine RET send_ser: MOV SBUF,st_send ;zu sendendes Byte laden wait: JNB TI,wait ;warten bis gesendet MOV st_send,#00h ;Speicher fürs Senden auf 0 Stellen JMP cycle RET END