diff options
Diffstat (limited to 'Software/pinlock.asm')
-rw-r--r-- | Software/pinlock.asm | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/Software/pinlock.asm b/Software/pinlock.asm new file mode 100644 index 0000000..b119723 --- /dev/null +++ b/Software/pinlock.asm @@ -0,0 +1,72 @@ +.include "m16def.inc" +.def tmp0 = r16 +.def par0 = r17 +.def par1 = r18 +.def cnt = r19 +.def tmp1 = r20 +.def tmp2 = r21 + +init: + ldi tmp0, HIGH(RAMEND) + out SPH, tmp0 + ldi tmp0, LOW(RAMEND) + ldi par0, 0xFF + ldi par1, 0xFF + rcall wait + out SPL, tmp0 + ldi tmp0, 0b11111111 + out DDRA, tmp0 + ldi tmp0, 0b11111111 + out DDRB, tmp0 + ldi tmp0, 0x31 + mov cnt, tmp0 + out PORTA, tmp0 + ldi tmp0, 0x42 + out PORTB, tmp0 + ldi tmp0, 0b11000000 + out DDRD, tmp0 + ldi tmp0, 0b00000000 + out PORTD, tmp0 + +main: + ldi par0, 0b11000011 + rcall status + +wait: + mov tmp0, par0 + dec par0 + nop + brne wait + mov par0, tmp0 + dec par1 + nop + brne wait + inc cnt + out PORTA, cnt + ret + +; Output the status +; par0 = Status bits +status: + ldi tmp0, 1 +status_loop: + mov tmp1, par0 + and tmp1, tmp0 + cp tmp0, tmp1 + breq status_set + ldi tmp1, 0b00111111 + out PORTD, tmp1 + ldi tmp1, 0b10111111 + out PORTD, tmp1 + rjmp status_end +status_set: + ldi tmp1, 0b01111111 + out PORTD, tmp1 + ldi tmp1, 0b11111111 + out PORTD, tmp1 + rjmp status_end +status_end: + lsl tmp0 + cpi tmp0, 0 + brne status_loop + ret |