Такую реализацию я нигде не видел. Идею взял из примера управления шаговым двигателем. Плюсы, абсолютно не парюсь. Самый большой плюс плату теперь как угодно/удобно можно разводить. Только в определениях поставил нужные биты. Плюс совет Mbedder-а.
.EQU _OE = PB0 ; PB2
.EQU Latch = PB1 ; PB3
.EQU Send_Led_Ind_SPI_State = 0
.EQU Send_Led_Char_SPI_State = 1
.EQU Send_Bytes_SPI_Complete_State = 2
.EQU A = 1 << 5
.EQU B = 1 << 6 ; A
.EQU C = 1 << 2 ; F B
.EQU D = 1 << 1 ; G
.EQU E = 1 << 0 ; E C
.EQU F = 1 << 4 ; D
.EQU G = 1 << 3
.EQU H = 1 << 7
.EQU Zero = A+B+C+D+E+F
.EQU One = B+C
.EQU Two = A+B+D+E+G
.EQU Three = A+B+C+D+G
.EQU Four = B+C+F+G
.EQU Five = A+C+D+F+G
.EQU Six = A+C+D+E+F+G
.EQU Seven = A+B+C
.EQU Eight = A+B+C+D+E+F+G
.EQU Nine = A+B+C+D+F+G
Handler_7_Segm_Led_Ind:
sbi PORTB,_OE
LDIWZ Table_Handler_7_Segm_Led_Ind
shiftlw Z
lds r16,Next_Addr_Leds_Ind
ldi r17,2
mul r16,r17
addw Z,r0,r1
lpm r16,Z+
sts Led_Ind_BUF,r16
lpm r16,Z
andi r16,0x0F
sts Next_Addr_Leds_Ind,r16
LDIWX DISPLAY_BUF
lpm r16,Z
swap r16
andi r16,0x0F
addw X,r16,RClr
ld r16,X
LDIWZ Table_7_Segm_Led_Char
shiftlw Z
addw Z,r16,RClr
lpm r16,Z
sts Led_Char_Buf,r16
Set_Timer_Queue T_Handler_7_Segm_Led_Ind,1
Set_Task_Queue T_Send_Data_SPI_To_Shift_Reg
Handler_7_Segm_Leds_Ind_End:
ret
Send_Data_SPI_To_Shift_Reg:
lds r16,Send_Data_SPI_To_Shift_Reg_State
CASE_EQUAL Send_Led_Ind_SPI_State,Send_Led_Ind_SPI
CASE_EQUAL Send_Led_Char_SPI_State,Send_Led_Char_SPI
CASE_EQUAL Send_Bytes_SPI_Complete_State,Send_Bytes_SPI_Complete
Send_Data_SPI_To_Shift_Reg_End:
ret
Send_Led_Ind_SPI:
ldi r16,Send_Led_Char_SPI_State
sts Send_Data_SPI_To_Shift_Reg_State,r16
in r16,SPCR
sbr r16,1<<SPIE
out SPCR,r16
lds r16,Led_Ind_BUF
out SPDR,r16
ret
Send_Led_Char_SPI:
ldi r16,Send_Bytes_SPI_Complete_State
sts Send_Data_SPI_To_Shift_Reg_State,r16
lds r16,Led_Char_Buf
out SPDR,r16
ret
Send_Bytes_SPI_Complete:
in r16,SPCR
cbr r16,1<<SPIE
out SPCR,r16
cbi PORTB,LATCH
nop
nop
nop
sbi PORTB,LATCH
ldi r16,Send_Led_Ind_SPI_State
sts Send_Data_SPI_To_Shift_Reg_State,r16
cbi PORTB,_OE
ret
Table_Handler_7_Segm_Led_Ind:
.DB 0b00000001, 0x01
.DB 0b00000010, 0x12
.DB 0b00000100, 0x23
.DB 0b00001000, 0x34
.DB 0b00010000, 0x45
.DB 0b00100000, 0x50
Table_7_Segm_Led_Char:
.DB Zero, One
.DB Two, Three
.DB Four, Five
.DB Six, Seven
.DB Eight, Nine
К чему все это написано? Я вас не спрашивал как мне это написать. Кроме примера Mbedder-а. Другие вещи тоже по своему пишу. А не слепо-тупо копирую. Я задаю вопросы только там где не знаю или не могу на данный момент понять.
Свой пример не жалко. Вы тоже мне неплохо помогли.