На асме.
Такт по фронту.
; LCD names pinouts
.equ LCD = PORTB ; Порт
.equ clk = PB0 ; вывод тактов
.equ dat = PB1 ; вывод данных
CODE
send_7bits: ;
push loop ; Save loop in STACK
ldi loop,7 ; bit counter
andi tmp,0x7F ; Чистим 7й ненужный бит
out_c: ;
clc ; clearing carry flag
ror tmp ; tmp =>> 1 ( LSB first )
brcc d_zer ; Branch if Carry flag eual zero!
sbi lcd,dat ; DATA -> 1
rjmp d_one ;
d_zer: ;
cbi lcd,dat ; DATA -> 0
d_one: ;
sbi lcd,clk ; CLK -> 1
cbi lcd,clk ; CLK -> 0
dec loop ; bitcounter = -1
brne out_c ;
pop loop ; Restore loop from STACK
ret ; reеurn
Насколько я знаю, то регистр без CS (74HC164) запоминает последние такты.
К примеру их туда можно плюнуть и 1000, отобразятся только последние.
Если нужна скорость по аппаратному SPI, то выше уже показали как это сделать, собрать в слово свои 28 бит, Биты ([31...28] для MSB first), ([3...0] LSB first) очистить, и слать по очереди 4 байта.