--- a/led7seg.inc Sat May 08 20:08:33 2010 +0300
+++ b/led7seg.inc Sat May 08 20:09:08 2010 +0300
@@ -20,83 +20,100 @@
.db 0b01111001, 0b01110001 ; E, f
.db 0b10000000, 0b00000000 ; .,
-;.db 0b00111111, ; 0
-; 0b00000110, ; 1
-; 0b01011011, ; 2
-; 0b01001111, ; 3
-; 0b01100110, ; 4
-; 0b01101101, ; 5
-; 0b01111101, ; 6
-; 0b00000111, ; 7
-; 0b01111111, ; 8
-; 0b01100111, ; 9
-; 0b10000000, ; .
-; 0b01000000 ;
+.equ LED7_0 = 0
+.equ LED7_1 = 1
+.equ LED7_2 = 2
+.equ LED7_3 = 3
+.equ LED7_4 = 4
+.equ LED7_5 = 5
+.equ LED7_6 = 6
+.equ LED7_7 = 7
+.equ LED7_8 = 8
+.equ LED7_9 = 9
+.equ LED7_A = 10
+.equ LED7_B = 11
+.equ LED7_C = 12
+.equ LED7_D = 13
+.equ LED7_E = 14
+.equ LED7_F = 15
+.equ LED7_DOT = 16
+.equ LED7_EMPTY = 17
-.equ LED7_0 = 0
-.equ LED7_1 = 1
-.equ LED7_2 = 2
-.equ LED7_3 = 3
-.equ LED7_4 = 4
-.equ LED7_5 = 5
-.equ LED7_6 = 6
-.equ LED7_7 = 7
-.equ LED7_8 = 8
-.equ LED7_9 = 9
-.equ LED7_A = 10
-.equ LED7_B = 11
-.equ LED7_C = 12
-.equ LED7_D = 13
-.equ LED7_E = 14
-.equ LED7_F = 15
-.equ LED7_DOT = 16
-.equ LED7_EMPTY = 17
+; output buffer
+.set LED7_COUNT = 2
+
+.dseg
+led7_buffer: .byte LED7_COUNT
+
+.cseg
;; Initialize LCD to empty, and enable
LED7_Init:
; Setup ENable port
sbi LED7_PORT, LED7_OE ; Disabled (Low)
sbi LED7_DDR, LED7_OE ; Out
-
- ; empty
+
+ ; Initialize buffer
ldi r16, 0b11111111
+ sts led7_buffer + 0, r16
+ sts led7_buffer + 1, r16
; Output
- rcall SPI_SendRecv
- rcall SPI_Wait
+ ldi r16, LED7_COUNT
+ ldi XL, low(led7_buffer + LED7_COUNT)
+ ldi XH, high(led7_buffer + LED7_COUNT)
+ rcall SPI_SendBuf
- ; Enable
+ ; Enable output once the initial display has been shifted out
cbi LED7_PORT, LED7_OE
; Done
ret
-;; Display a single digit on the display
-;; Input: r16
-LED7_Show:
+LED7_LoadChar:
clr r0, 0
; Prep address
; base addr for font table
- ldi ZH, high(2*LED7_Font)
- ldi ZL, low(2*LED7_Font)
+ ldi ZH, high(2 * LED7_Font)
+ ldi ZL, low(2 * LED7_Font)
; offset
- add ZL, r16
+ add ZL, r8
adc ZH, r0
; Load char
- lpm r16, Z
-
+ lpm r8, Z
+
+ ; Done
+ ret
+
+;; Display a single digit on the display
+;; Input: r16, r17
+LED7_Show:
+ mov r8, r16
+ rcall LED7_LoadChar
+ mov r16, r8
+
+ mov r8, r16
+ rcall LED7_LoadChar
+ mov r16, r8
+
;; Continue
;; Display a raw segment mask
-;; Input: r16
+;; Input: r16, r17
LED7_ShowRaw:
- ; Invert
- ; com r16
+ ; Set buffer
+ sts led7_buffer + 0, r16
+ sts led7_buffer + 1, r17
+
+ ; Output
+ ldi r16, LED7_COUNT
+ ldi XL, low(led7_buffer + LED7_COUNT)
+ ldi XH, high(led7_buffer + LED7_COUNT)
; Display
- rjmp SPI_SendRecv
+ rjmp SPI_SendBuf