led7seg.inc
changeset 23 a6afc0eb347f
parent 18 79b25e81721f
child 25 33496b1a964f
--- 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