; Ausgabe einer Zeichenkette auf dem Bildschirm ; bei einer Frequenz von 11,059 MHz und 9600 Baud #include 8051.h .org 0000h ljmp MAIN .org 0003h cjne r4,#01h,INT ret ;-----------------------------Hauptprogramm------------------------------ MAIN: mov P0, #00h ;Strom sparen mov r4, #00h START: clr P0.0 setb P0.1 lcall ZTS_100ms setb P0.0 clr P0.1 lcall ZTS_100ms setb EA setb EX0 sjmp START ;------------------------------Zeitschleifen----------------------------- ZTS_100ms: mov r3,#1d LOOP5: mov r2,#194d LOOP6: mov r1,#255d LOOP7: djnz r1,LOOP7 djnz r2,LOOP6 djnz r3,LOOP5 ret ;----------------------------Interruptroutine---------------------------- INT: mov r4,#01h push ACC ;Inhalt vom Akku sichern push PSW ;PSW sichern push 001h push 002h push 003h push 004h Stop .equ 00h ;Zeichen " Ende" der Zeichenkette INIT: clr TR1 ; stoppe Timer 1 mov TH1, #0FAH ; 256-6: 9600 Baud mov TL1, #0FAH anl TMOD, #0Fh ; Timer1: 8-bi-reload orl TMOD, #20h setb TR1 ; Starte Timer mov SCON, #50h ;Initialisiere RS232 setb TI orl PCON, #80h ;-------Programmm: Ausgabe einer Zeichenkette auf dem Monitor------------ mov R2,#00h ; Zeichenzeiger 0-Stellen mov DPTR,#ZK_0 ; Basisadresse Zeichenkette bi3: mov A,R2 ; Zeichen Laden movc A,@A+DPTR cjne A,#Stop,bi1 ; Zeichen "ende" ? NEin : ljmp bi2 ; Ja: bi1: lcall seraus1 ;Zeichen seriell ausgeben inc R2 ; nächstes Zeichen ljmp bi3 bi2: pop 004h pop 003h pop 002h pop 001h pop PSW pop ACC mov r4,#00h reti ;Ende der Interruptroutine ;------- Unterprogramm serielle Ausgabe----------------------------------- seraus1: jnb TI,seraus1 ; warten, bis Senderegeister frei clr TI ; Flag "Senderreg. beschreiben" setzen mov SBUF,A ; Byte nach Sendereg. und Senden starten ret ;--------- Bildschirmausgabe ---------------------------------------------- ZK_0: ; .db 0Ch ; Bildschirm löschen .db " Fehler! " .db 13d, 10d .db " Interrupt gedrückt " ; Text .db 13d, 10d ; Zeilenvorschub, Wagenrücklauf .db 00h .end