Code:
.include "m8def.inc"
.org 0x000
rjmp start
.org ovf1addr
rjmp zähler-
start:
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;DEN REGISTERN NAMEN ZUORDNEN ZUR BESSEREN ERKENNUNG
.def null = r0
.def eins = r1
.def zwei = r2
.def drei = r3
.def vier = r4
.def funf = r5
.def sechs = r6
.def sieben = r7
.def acht = r8
.def neun = r9
.def ausgabeE = r10
.def ausgabeZ = r11
.def eingabe = r15
.def einer = r16
.def zehner = r17
.def sichern = r12
.def prog = r13
.equ taster = pind
.equ t1 = 0x01 ;taster für -5s
.equ t2 = 0x02 ;taster für +5s
.equ t3 = 0x04 ;taster für das starten des programmes
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;NUMMERN FÜR DIE 7SEGMENTE EINGEBEN
ldi null,
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; STACK, EIN- UND AUSGÄNGE FESTLEGEN
ldi r18, high (ramend) ;stack
out sph, r18
ldi r18, low (ramend)
out spl, r18
ldi r18, oxff ;pb0 bis pb7 als ausgang
out ddrb, r18 ;für die kathoden am 7segmen
ldi r18, 0x03 ;pc0 und pc1 als ausgang
out ddrc, r18 ;für die gem. anode am 7segmend
ldi r18, 0x00 ;pd0 bis pd2 als eingang
out ddrd, r18 ;für die taster t1 bis t3
ldi r18, 0x07 ;mit den internen pull up widerständen
out portd, r18
ldi r18, (1<<cs11) | (1<<cs10) ;prescaller ist auf 1024 gesetzt für 1s
out tccr1b, r18 ;tccr1b ist für prescaller zuständig
ldi r18, (1<<toie1) ;toie1 = 1 d.h. int. ist eingeschaltet
out timsk, r18 ;timst ist für int. einstellung zusaändig
ldi prog, 0
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;VOREINSTELLUNGEN NACH WAHL
;
;10s AUSWAHL
; ldi einer, 0
; ldi ausgabeE. null
; ldi zehner, 1
; ldi ausgabeZ. eins
;
5s AUSWAHL
ldi einer, 5
ldi ausgabeE, funf
ldi zehner, 0
ldi ausgabeZ, null
;
;0s AUSWAHL
; ldi einer, 0
; ldi ausgabeE. null
; ldi zehner, 0
; ldi ausgabeZ. Null
;
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;TASTEN ABFRAGEN UND AUSGEBEN DER ZIFFERN
input:
rcall 5ms ;warten 5ms
cbi portc, 0 ;zehneranzeige ausschalten
sbi portc, 1 ;eineranzeige einschalten
out portb, ausgabeE ;einer anzeigen
rcall 5ms ;warten 5ms
cbi portc, 1 ;eineranzeige ausschalten
sbi portc, 0 ;zehneranzeige einschalten
out portb, ausgabeZ ;zehner anzeigen
cpi prog, 1
breq programm
;----------------------------------------------------------------------------------------
in eingabe, taster ;an portd anliegende werte einlesen
cpi eingabe, t1 ;ist t1 gedrückt?
breq zähler- ;spring zu -5s
cpi eingabe, t2 ;ist t2 gedrückt?
breq zähler+ ;spring zu +5s
cpi eingabe, t3 ;ist t3 gedrückt?
breq programm ;spring zum programm
rjmp input ;weiter einlesen
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;ZÄHLPROZEDUR
zähler-:
cpi einer, 0
breq zehnerdown
dec einer
rjmp einer_füll
zähler+:
cpi einer, 9
breq zehnerup
inc einer
rjmp einer_füll
zehnerup:
cpi zehner, 9
breq input
inc zehner
rjmp zehner_füll
zehnerdown:
cpi zehner, 0
breq input
dec zehner
rjmp zehner_füll
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;ZEHNERREGISTER MIT DEN ZAHLEN FÜLLEN
zehner_füll:
cpi zehner, 0
breq zehnernull
cpi zehner, 1
breq zehnereins
cpi zehner, 2
breq zehnerzwei
cpi zehner, 3
breq zehnerdrei
cpi zehner, 4
breq zehnervier
cpi zehner, 5
breq zehnerfunf
cpi zehner, 6
breq zehnersechs
cpi zehner, 7
breq zehnersieben
cpi zehner,8
breq zehneracht
cpi zehner, 9
breq zehnerneun
;-----------------------------------------
zehnernull:
ldi ausgabeZ, null
rjmp input
zehnereins:
ldi ausgabeZ, eins
rjmp input
zehnerzwei:
ldi ausgabeZ, zwei
rjmp input
zehnerdrei:
ldi ausgabeZ, drei
rjmp input
zehnervier:
ldi ausgabeZ, vier
rjmp input
zehnerfunf:
ldi ausgabeZ, funf
rjmp input
zehnersechs:
ldi ausgabeZ, sechs
rjmp input
zehnersieben:
ldi ausgabeZ, sieben
rjmp input
zehneracht:
ldi ausgabeZ, acht
rjmp input
zehnerneun:
ldi ausgabeZ, neun
rjmp input
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;EINERREGISTEN MIT DEN ZAHLEN FüLLEN
einer_füll:
cpi einer, 0
breq einernull
cpi einer, 1
breq einereins
cpi einer, 2
breq einerzwei
cpi einer, 3
breq einerdrei
cpi einer, 4
breq einervier
cpi einer, 5
breq einerfunf
cpi einer, 6
breq einersechs
cpi einer, 7
breq einersieben
cpi einer, 8
breq eineracht
cpi einer, 9
breq einerneun
;-----------------------------------------
einernull:
ldi ausgabeE, null
rjmp input
einereins:
ldi ausgabeE, eins
rjmp input
einerzwei:
ldi ausgabeE, zwei
rjmp input
einerdrei:
ldi ausgabeE, drei
rjmp input
einervier:
ldi ausgabeE, vier
rjmp input
einerfunf:
ldi ausgabeE, funf
rjmp input
einersechs:
ldi ausgabeE, sechs
rjmp input
einersieben:
ldi ausgabeE, sieben
rjmp input
eineracht:
ldi ausgabeE, acht
rjmp input
einerneun:
ldi ausgabeE, neun
rjmp input
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;HAUPTPROGRAMM
programm:
ldi sichern, sreg
push sichern
ldi prog, 1
sei
sbi portb, 7
ende:
cli
cbi portb, 7
ldi prog, 0
pop sichern
ldi sreg, sichern
rjmp input
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;WARTEZEIT FÜR DIE ANZEIGE
5ms:
ldi r30, 0x21
loop0: ldi r31, 0xC9
loop1: dec r31
brne loop1
dec r30
brne loop0
ret
Lesezeichen