m820250322006siebensegmentlight.asm


;; (C) David Vajda
;; 2025-03-22
;; siebensegment 1fach klassisch
.include "m8def.inc"

ldi r16, HIGH (RAMEND)
out SPH, r16
ldi r16, LOW (RAMEND)
out SPL, r16

ldi r16, 0xff
out DDRC, r16
out DDRB, r16
ldi r16, 0xff
out DDRD, r16



main:
;ldi r16, 0x01
ldi r16, 0x59
rcall hexoutascii
rjmp main

hexoutascii:
push r16
ldi r18, 0b01010101
out PORTD, r18
andi r16, 0b00001111
rcall bcddecode
rcall out7
pop r16
ret

out7:
com r24
out PORTC, r24
sbrs r24, 6
rjmp next
ldi r24, 0x01
out PORTB, r24
rjmp next2
next:
ldi r24, 0x00
out PORTB, r24
next2:
ret

bcddecode:
push r16
push ZH
push ZL
ldi ZH, HIGH (seg7B)
ldi ZL, LOW (seg7B)
;; das stimmte natuerlich nicht mit dem adiw - das ist konstante laut i
inc r16
bcddecodeloop1:
lpm r24, Z+
dec r16
brne bcddecodeloop1
pop ZL
pop ZH
pop r16
ret

sleep:
push r16
push r17
push r18
ldi r16, 0xff
sleeploop1:
ldi r17, 0x0b
sleeploop2:
dec r17
brne sleeploop2
dec r16
brne sleeploop1
pop r18
pop r17
pop r16
ret

seg7: .db 0b00111111, 0b00001100, 0b01011011, 0b01011110, 0b01101100, 0b01110110, 0b01110111, 0b00011100, 0b01111111, 0b01111110, 0b01111101, 0b01100111, 0b00110011, 0b01001111, 0b01110011, 0b01110001
.equ seg7B = seg7*2

; 1 e
; 2 d
; 4 c
; 6 b
; 7 a
; 9 f
; 10 g

; 1 e
; 2 d
; 3 c
; 4 b
; 5 a
; 6 f
; 7 g

;; 0: abcdef 1 2 3 4 5 6      0b 0 0111 111
;; 1: bc 4 3
;; 2: abged 5 4 7 1 2
;; 3: abgcd 5 4 7 3 2
;; 4: fgbc 6 7 4 3
;; 5: afgcd 5 6 7 3 2
;; 6: afgcde 5 6 7 3 2 1
;; 7: abc 5 4 3
;; 8: abcdefg 1 2 3 4 5 6 7
;; 9: abcdfg 2 3 4 5 6 7
;; A: abcefg 3 4 5 6 7
;; b: cdefg 2 3 6 7
;; C: afde: 1 2 5 6
;; d: bcdeg 1 2 3 4 7
;; E: adefg 1 2 5 6 7
;; F: aefg 1 5 6 7

;; 1: bc 3 4                    0b 0 0001 100
;; 2: abged 1 2 4 5 7           0b 0 1011 011
;; 3: abgcd 2 3 4 5 7           0b 0 1011 110
;; 4: fgbc 3 4 6 7              0b 0 1101 100
;; 5: afgcd 2 3 5 6 7           0b 0 1110 110
;; 6: afgcde 1 2 3 5 6 7        0b 0 1110 111
;; 7: abc 3 4 5                 0b 0 0011 100
;; 8: abcdefg 1 2 3 4 5 6 7     0b 0 1111 111
;; 9: abcdfg  2 3 4 5 6 7       0b 0 1111 110


;; A: abcefg 1 3 4 5 6 7        0b 0 1111 101
;; b: cdefg 1 2 3 6 7           0b 0 1100 111
;; C: afde: 1 2 5 6             0b 0 0110 011
;; d: bcdeg 1 2 3 4 7           0b 0 1001 111
;; E: adefg 1 2 5 6 7           0b 0 1110 011
;; F: aefg 1 5 6 7              0b 0 1110 001


telefonstr: .db 2,4,0x22, 0x22
.equ telefonstrB = telefonstr*2