; Test des Keyboards ; ; Liest das Keyboard am Port B und zeigt die gedrückte Taste auf den LEDs ; in hexadezimaler Form aus. ; ; Keyboard ist an Port B angeschlossen: ; Bit 6: *=Bit0 7=Bit1 4=Bit2 1=Bit3 ; Bit 5: 0=Bit0 8=Bit1 5=Bit2 2=Bit3 ; Bit 4: #=Bit0 9=Bit1 6=Bit2 3=Bit3 ; ; 8515-Definitionen .NOLIST .INCLUDE "C:\avrtools\appnotes\8515def.inc" .LIST ; ; Register .def mpko=R15 ; Alter Tastenstand .def mpr=R16 ; Multifunktionsregister .def mpk=R25 ; Multifunktionsregister für Keyboard-Interrupt ; ; RAM-Adressen .equ taste=$0060 ; Erste Ramadresse, Hier kommt die Taste hin ; ; Reset-/Interruptvektoren rjmp main reti ; Ext Int 0 reti ; Ext Int 1 reti ; TC1 Capture rjmp test ; TC1 Compare A reti ; Compare B reti ; TC1 Overflow reti ; TC0 Overflow reti ; Serial Transfer Complete reti ; Serial Rx Complete reti ; Data Register Empty reti ; Serial Tx Complete reti ; Analog Comparator ; Hauptprogramm main: ldi mpr,HIGH(RAMEND) ; Stack Pointer Init wegen Interrupts out SPH,mpr ldi mpr,LOW(RAMEND) out SPL,mpr ; General control register clr mpr ; kein SRAM, kein Wait, kein Sleep-Mode, out MCUCR,mpr ; Ext.Int egal ; Port B ist Output und Tastatur-Input ldi mpr,0x70 ; alles auf Output out DDRB,mpr ldi mpr,0x00 ; alle Lampen an out PORTB,mpr sts Taste,mpr ; ; Timer/Counter 0 initiieren ldi mpr,$00 ; Prescaler = 256 out TCCR0,mpr ; Timer 1 initiieren ldi mpr,0b00000000 ; Disable Timer Output und PWM-Mode out TCCR1A,mpr ; in Timer Control Register 1A ldi mpr,0b00001011 ; No input noise canceling, clear counter after ; match, Prescaler = 64 ==> 62500 Hz = 16 µs out TCCR1B,mpr ; in Timer Control Register 1B ldi mpr,HIGH(625) ; Compare-Wert in Compare-Register A out OCR1AH,mpr ; High Byte zuerst ldi mpr,LOW(625) out OCR1AL,mpr ; Low Byte zuletzt ldi mpr,0xFF ; No Interrupt on Compare B out OCR1BH,mpr ; High Byte zuerst out OCR1BL,mpr ; Low Byte zuletzt ; Interrupts starten clr mpr ; External interrupts disable out GIMSK,mpr ; an General Interrupt mask register ldi mpr,0b01000000 ; Timer 1: Overflow Int Off, Compare A Int on, out TIMSK,mpr ; Compare B Int Off, Input Int Off, Timer 0: Int Off sei ; Interrupts zulassen ; Unendlicher Loop, alles Interrupt-gesteuert loop: rjmp loop ; Interrupt Rountine bei TC1 Compare Match B tc1ci: in mpk,SREG ; Status-Register retten push mpk ldi mpk,0b11110000 ; Oberes Nibble Ausgabe, Unteres Eingabe out DDRB,mpk ; an Port B ldi mpk,0x0F ; Oberes Nibble gibt Null aus, unteres setzt Pullups out PORTB,mpk in mpk,PINB ; Lese Ergebnis von Tastatur cp mpk,mpko ; Vergleiche mit altem Stand breq tc1cir ; Keine Änderung, Rückkehr mov mpko,mpk ; Kopiere neuen Stand in alten Stand sts taste,mpk ; Neuer LED-Stand tc1cir: ldi mpk,0xFF ; Port B wieder auf Ausgabe out DDRB,mpr lds mpk,taste ; gedrückte Taste auf LEDs ausgeben out PORTB,mpk pop mpk ; Rückkehr vom Interrupt out SREG,mpk ; Status-Register wieder herstellen reti tc0ci: ldi mpr,0xFF out PORTB,mpr reti tc2ci: ldi mpr,0xAA out PORTB,mpr reti test: ; LDI mpk,0x0F ; OUT DDRB,mpk ; LDI mpk,0xF0 ; OUT PORTB,mpk reti