Цитата(vesago @ Jan 28 2009, 12:53)

Все просто. Регистры соединяются последовательно. Есть два байта - образ данных в регистрах. Если нужно изменить соостояние какого выхода регистра, меняем соответсвующее значение в слове образе и по SPI задвигаем, затем дергаем строб, чтобы данные из сдвигового регистра перкинуть в выходной регистр.
Код
//::::::::::::::::::::::::::::::::::::::::::::::::::::::
//
//::::::::::::::::::::::::::::::::::::::::::::::::::::::
void SPI_Init(void)
{
SPI_PORT |= (1<<SCK)|(1<<MOSI)|(1<<MISO);
SPI_DDR |= (1<<SCK)|(1<<MOSI);
SPI_DDR &= ~(1<<MISO);
SPSR = (1<<SPI2X);
SPCR = (1<<SPE)|(1<<MSTR); //Mode 0
}
//::::::::::::::::::::::::::::::::::::::::::::::::::::::
// Записываем байт
//::::::::::::::::::::::::::::::::::::::::::::::::::::::
void SPI_Write_Byte(u8_t b)
{
SPDR = b;
while ((SPSR & (1<<SPIF)) == 0);
}
//::::::::::::::::::::::::::::::::::::::::::::::::::::::
// Читаем байт
//::::::::::::::::::::::::::::::::::::::::::::::::::::::
u8_t SPI_Read_Byte(void)
{
SPDR = 0x00;
while ((SPSR & (1<<SPIF)) == 0);
return SPDR;
}
#define Cell_Lock_Strob() {PORTD |= (1<<CELL_LOCK_STROB); PORTD &= ~(1<<CELL_LOCK_STROB);}
#define Cell_Lock_Clr() {PORTD &= ~(1<<CELL_LOCK_CLR); PORTD |= (1<<CELL_LOCK_CLR);}
#define Cell_Load_Image(image) {SPI_Write_Byte((u8_t)(image>>8)); SPI_Write_Byte((u8_t)image);}
#define Cell_Lock_ON(i) {cell_lock_image |= (1<<i); Cell_Load_Image(cell_lock_image); Cell_Lock_Strob();}
#define Cell_Lock_OFF(i) {cell_lock_image &= ~(1<<i); Cell_Load_Image(cell_lock_image); Cell_Lock_Strob();}
Ээээ, это ж на Си, я в этом языке не силен, может на асме что-то подскажите? А алгоритм управления регистром мне понятен, не совсем понятно как выводить данные в порт, 8 и 16 бит с подсчетом выведенных бит.