.equ LOW = r21
.equ HIGH = r22
.equ STCP = 2 ;storage clock
.equ SHCP = 3 ;shift clock
.equ DS = 4 ;data bit
Update_display_LOW:
ldi ZL,LOW (table*2)
ldi ZH,HIGH(table*2)
add ZL, LOW ;add offset to base
lpm ;read data to r0
mov r18,R0
rcall ShiftByte ;send byte to 74HC595
cbi PORTB, 1 ; turn on low display (ones)
ret
;----------------------------------------------------------
Update_display_HIGH:
ldi ZL,LOW (table*2)
ldi ZH,HIGH(table*2)
add ZL, HIGH ;add offset to base
lpm ;read data to r0
mov r18,R0
rcall ShiftByte ;send byte to 74HC595
cbi PORTB, 0 ; turn on high display (tens)
ret
;----------------------------------------------------------
Table:
.db 0b00111111,0b00000110,0b01011011,0b01001111
.db 0b01100110,0b01101101,0b01111100,0b00000111
.db 0b01111111,0b01100111
;----------------------------------------------------------
ShiftByte:
ldi r19, 8 ; 8 bits to shift
ShiftLoop:
sbrc r18, 0 ; skip if bit 0 = clr
sbi PORTB, DS ; else send a 1
sbrs r18, 0 ; send a 0
cbi PORTB, DS ;
sbi PORTB, SHCP ; pulse shift clock
lsr r18 ; next bit
cbi PORTB, SHCP ; end shift clock pulse
dec r19 ; one less bit
brne ShiftLoop ; loop for 8 bits
sbi PORTB, STCP ; pulse storage clock high
nop ;
cbi PORTB, STCP ; then return low
ret ;
;----------------------------------------------------------