1 | include reg_52.pdf
|
2 |
|
3 | code at 0
|
4 |
|
5 | sjmp init ;springe zu init
|
6 |
|
7 | org 03h ;Einsprungadresse Externer Interrupt 0
|
8 | sjmp ISR_EX0
|
9 | org 0bh ;Einsprungadresse Timer Interrupt 0
|
10 | sjmp ISR_T0
|
11 | org 13h ;Einsprungadresse Externer Interrupt 1
|
12 | setb TR0
|
13 | ;sjmp ISR_EX1
|
14 | org 1bh ;Einsprungadresse Timer Interrupt 1
|
15 | sjmp ISR_T1
|
16 |
|
17 |
|
18 | init: setb EA ;Globale Interruptfreigabe
|
19 | setb EX0 ;Freigabe Ext. Interrupt 0
|
20 | ; setb EX1 ;Freigabe Ext. Interrupt 1
|
21 | setb ET0 ;Freigabe Timer Interrupt 0
|
22 | setb ET1 ;Freigabe Timer Interrupt 1
|
23 | mov TMOD,#00010001b ;T1/T0 Modus 1: 16 Bit-Timer ohne nachladen
|
24 | mov TCON,#00000101b ;EX1/EX0 bei abfallender Flanke, Timer ausgeschalten
|
25 | setb P3.7 ;Aktiviere linke 7-Segment-Anzeige
|
26 | clr P3.6 ;Deaktiviere rechte 7-Segment-Anzeige
|
27 | mov R0,#255 ;setze Register R0 auf 255;
|
28 | mov P2,#0 ;lösche 7-Segment-Anzeige
|
29 | mov R1,#40d ;setze Register R1 auf 40(dezimal)
|
30 | mov TH1,#11111111b ;setze TH1 auf 11111111(binär)
|
31 | mov TL1,#11111111b ;setze TL1 auf 11111111(binär)
|
32 | haupt: sjmp haupt ;Programm wiederholt endlos "nichts"
|
33 |
|
34 | ISR_EX0:
|
35 | ; clr EX0 ;deaktiviere Schalter für Ext. Interrupt 0
|
36 | ; clr EX1 ;deaktiviere Schalter für Ext. Interrupt 1
|
37 | cjne R0,#15,hoch ;obere Grenze der möglichen Töne
|
38 | reti ;return
|
39 | hoch: inc R0 ;Erhöhe R0 um 1
|
40 | acall AusEX01 ;springe zu Unterprogramm AusEX01
|
41 | reti
|
42 |
|
43 | ISR_EX1:
|
44 | ; clr EX0 ;deaktiviere Schalter für Ext. Interrupt 0
|
45 | ; clr EX1 ;deaktiviere Schalter für Ext. Interrupt 1
|
46 | cjne R0,#1,runter ;untere Grenze der möglichen Töne
|
47 | reti ;return
|
48 | runter: mov A,R0 ;Erniedrige R0 um 3
|
49 | subb A,#3 ;"
|
50 | mov R0,A ;"
|
51 | acall AusEX01 ;springe zu Unterprogramm AusEX01
|
52 | reti
|
53 |
|
54 | AusEX01:
|
55 | ; mov DPTR,#seg7code ;setze Datenpointer an symbolische Adresse seg7code
|
56 | ; mov A,R0 ;Kopiere R0 in Akkumulator
|
57 | ; movc A,@A+DPTR ;lade seg7code in den Akku
|
58 | ; mov P2,A ;Ausgabe Tonkennung
|
59 | mov P2,R0
|
60 | mov DPTR,#tcode ;setze Datenpointer an symbolische Adresse tcode
|
61 | mov A,R0 ;Kopiere R0 in Akkumulator
|
62 | movc A,@A+DPTR ;lade tcode in den Akku
|
63 | mov TH0,A ;lade Reloadwert in TH0
|
64 | inc R0 ;erhöhe R0 um 1
|
65 | mov A,R0 ;Kopiere R0 in Akkumulator
|
66 | movc A,@A+DPTR ;lade tcode in den Akku
|
67 | mov TL0,A ;lade Reloadwert in TL0
|
68 | setb TR0 ;starte Timer 0(Tonausgabe)
|
69 | setb TR1 ;starte Timer 1
|
70 | ret ;return
|
71 |
|
72 |
|
73 | ISR_T0:
|
74 | clr TR0
|
75 | mov DPTR,#tcode
|
76 | mov A,R0 ;Kopiere R0 in Akkumulator
|
77 | movc A,@A+DPTR ;lade tcode in den Akku
|
78 | mov TL0,A ;lade Reloadwert in TL0
|
79 | dec R0 ;erniedrige R0 um 1
|
80 | mov A,R0 ;Kopiere R0 in Akkumulator
|
81 | movc A,@A+DPTR ;lade tcode in den Akku
|
82 | mov TH0,A ;lade Reloadwert in TH0
|
83 | inc R0 ;erhöhe R0 um 1
|
84 | setb TR0
|
85 | cpl P2.0 ;Invertiere P2.0(Tonerzeugung)
|
86 | reti ;return
|
87 |
|
88 |
|
89 | ISR_T1:
|
90 | mov TL1,#11111111b ;setze TH1 auf 11111111(binär)
|
91 | mov TH1,#11111111b ;setze TL1 auf 11111111(binär)
|
92 | djnz R1,loop0 ;Erniedrige R1 um 1; wenn nicht 0, springe zu Marke "loop0"
|
93 | clr TR0 ;stoppe Timer 0(Tonausgabe)
|
94 | clr TR1 ;stoppe Timer 1
|
95 | ; setb EX0 ;aktiviere Schalter für Ext. Interrupt 0
|
96 | setb EX1 ;aktiviere Schalter für Ext. Interrupt 1
|
97 | mov R1,#40d ;setze Register R1 auf 40(dezimal)
|
98 | loop0: reti
|
99 |
|
100 |
|
101 |
|
102 | seg7code:
|
103 | DB 01101100b
|
104 | DB 01111110b
|
105 | DB 11101100b
|
106 | DB 11101000b
|
107 | DB 11101110b
|
108 | DB 11111010b
|
109 | DB 11011010b
|
110 | DB 01101100b
|
111 |
|
112 | tcode:
|
113 | DB 00000000b, 11111111b; DB 00001110b, 11101000b ;c3
|
114 | DB 00001101b, 01001001b ;d3
|
115 | DB 00001011b, 11010110b ;e3
|
116 | DB 00010110b, 01010010b ;f3
|
117 | DB 00001001b, 11110111b ;g3
|
118 | DB 00001000b, 11100000b ;a3
|
119 | DB 00000111b, 11101000b ;h3
|
120 | DB 00000111b, 01110100b ;c4
|