Skip to content

Instantly share code, notes, and snippets.

@xacrimon
Last active November 27, 2024 14:46
Show Gist options
  • Save xacrimon/03bad74ccf9b4dbbb819bb9e8c9393a7 to your computer and use it in GitHub Desktop.
Save xacrimon/03bad74ccf9b4dbbb819bb9e8c9393a7 to your computer and use it in GitHub Desktop.
;
; klocka.asm
;
; Created: 26/11/2024 12:38:41
; Author : Joel Wejdenstål
;
.macro PUSHZ
push ZH
push ZL
.endmacro
.macro POPZ
pop ZL
pop ZH
.endmacro
.macro PUSHY
push YH
push YL
.endmacro
.macro POPY
pop YL
pop YH
.endmacro
.dseg
.org SRAM_START
TIME:
.byte 4
.cseg
.org 0
rjmp START
rjmp INT0R ; INT0: klocktickning
rjmp INT1R ; INT1: visa till display
.org INT_VECTORS_SIZE
START:
; sätt stackpekare
ldi r16, HIGH(RAMEND)
out SPH, r16
ldi r16, LOW(RAMEND)
out SPL, r16
; configurera portar A och B till output
ldi r16, $FF
out DDRA, r16
out DDRB, r16
; configurera INT0 och INT1 att köras på fallande flank
ldi r16, (1<<INT0) | (1<<INT1)
out GICR, r16
ldi r16, (1<<ISC01) | (1<<ISC11)
out MCUCR, r16
sei
; initiering klar
rjmp MAIN
INT0R:
in r25, SREG
push r25
rcall CLOCK_TICK
pop r25
out SREG, r25
reti
INT1R:
in r25, SREG
push r25
rcall MUX
pop r25
out SREG, r25
reti
CLOCK_TICK:
; spara r16-r18 + Z
push r16
push r17
push r18
PUSHZ
; r16 = bcd värde, r17 = carry, r18 = loop counter
ldi ZH, HIGH(TIME)
ldi ZL, LOW(TIME)
ldi r17, 1
ldi r18, 4
CLOCK_TICK_bcd:
; ladda bcd värde och addera carry, nollställ sedan carry
ld r16, Z
add r16, r17
ldi r17, 0
; kolla om vi har nått limit
sbrs r18, 0
cpi r16, 10 ; plats 4 eller 2, limit på 10
sbrc r18, 0
cpi r16, 6 ; plats 3 eller 1, limit på 6
brne CLOCK_TICK_not_limit
; nollställ nuvarande och sätt carry
ldi r16, 0
ldi r17, 1
CLOCK_TICK_not_limit:
; skriv nya bcd värdet
st Z+, r16
; ta nästa siffra
dec r18
brne CLOCK_TICK_bcd
; återställ r16-r18 + Z och återvänd
POPZ
pop r18
pop r17
pop r16
ret
.equ SEG_A=1<<0
.equ SEG_B=1<<1
.equ SEG_C=1<<2
.equ SEG_D=1<<3
.equ SEG_E=1<<4
.equ SEG_F=1<<5
.equ SEG_G=1<<6
.equ DIGIT_0=(SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F)
.equ DIGIT_1=(SEG_B | SEG_C)
.equ DIGIT_2=(SEG_A | SEG_B | SEG_G | SEG_D | SEG_E)
.equ DIGIT_3=(SEG_A | SEG_B | SEG_G | SEG_C | SEG_D)
.equ DIGIT_4=(SEG_F | SEG_B | SEG_G | SEG_C)
.equ DIGIT_5=(SEG_A | SEG_C | SEG_D | SEG_G | SEG_F)
.equ DIGIT_6=(SEG_C | SEG_D | SEG_E | SEG_F | SEG_G)
.equ DIGIT_7=(SEG_A | SEG_B | SEG_C)
.equ DIGIT_8=(SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G)
.equ DIGIT_9=(SEG_A | SEG_B | SEG_C | SEG_D | SEG_F | SEG_G)
FONT:
.db DIGIT_0, DIGIT_1, DIGIT_2, DIGIT_3, DIGIT_4, DIGIT_5, DIGIT_6, DIGIT_7, DIGIT_8, DIGIT_9
MUX:
; spara r16-17 + Z + Y
push r16
push r17
PUSHZ
PUSHY
; r17 = loopvariabel
ldi r17, 4
ldi YL, LOW(TIME)
ldi YH, HIGH(TIME)
MUX_write_digit:
; läs in bcd värdet till ZL
ld ZL, Y+
; läs in fontvärdet på FONT+ZL till r16
clr ZH
subi ZL, LOW(-FONT*2)
sbci ZH, HIGH(-FONT*2)
lpm r16, Z
; skriv ut selectionvärdet och fontvärdet till A och B, kopplade till displayen
out PORTA, r17
out PORTB, r16
; loopa runt för varje siffra
dec r17
brne MUX_write_digit
; återställ r16-r17 + Z + Y och återvänd
POPY
POPZ
pop r17
pop r16
ret
MAIN:
rcall CLOCK_TICK
rjmp MAIN
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment