Ну... RLA,SSA,RSS (это не три команды ассемблера, а одна, а вот RLA,SSA -- это другая одна команда) никто ведь не написал? Ну, до этого :-) А теперь так, что в глаза бросилось: Ваш код
Send_Byte:
rcall Data_Port_Out
push LCD_DATA
andi LCD_DATA,0xF0
in r16,DATA_PORT
andi r16,0x0F
push r16
or r16,LCD_DATA
out DATA_PORT,r16
sbi CMD_PORT,Ena
nop
nop
nop
nop
nop
cbi CMD_PORT,Ena
pop r16
pop LCD_DATA
swap LCD_DATA
andi LCD_DATA,0xF0
or r16,LCD_DATA
out DATA_PORT,r16
sbi CMD_PORT,Ena
nop
nop
nop
nop
nop
cbi CMD_PORT,Ena
rcall Data_Port_In
ret
Непонятно, что тут делает
push/pop r16
Разве что по совместительству задержку. Так как без этого
Send_Byte:
rcall Data_Port_Out
push LCD_DATA
andi LCD_DATA,0xF0
in r16,DATA_PORT
andi r16,0x0F
or r16,LCD_DATA
out DATA_PORT,r16
sbi CMD_PORT,Ena
nop
nop
nop
nop
nop
cbi CMD_PORT,Ena
andi r16, 0x0F
pop LCD_DATA
swap LCD_DATA
andi LCD_DATA,0xF0
or r16,LCD_DATA
out DATA_PORT,r16
sbi CMD_PORT,Ena
nop
nop
nop
nop
nop
cbi CMD_PORT,Ena
rcall Data_Port_In
ret
получается короче на слово и такта на три короче.
Но на деле не нужен и
push/pop LCD_DATA
Send_Byte:
rcall Data_Port_Out
in r16,DATA_PORT
andi r16, 0x0F
eor r16, LCD_DATA
andi LCD_DATA, 0x0F
eor r16, LCD_DATA
out DATA_PORT,r16
sbi CMD_PORT,Ena
nop
nop
nop
nop
nop
cbi CMD_PORT,Ena
andi r16, 0x0F
swap LCD_DATA
or r16,LCD_DATA
out DATA_PORT,r16
sbi CMD_PORT,Ena
nop
nop
nop
nop
nop
cbi CMD_PORT,Ena
rcall Data_Port_In
ret
что выходит уже на три слова короче первоначального варианта.
Остаётся
nop
nop
nop
nop
nop
заменить на
rjmp . ; пардон, не помню, как у avrasm написать переход на следующую команду
rjmp . ; rjmp $ или как? Это такой двухтактовый НОП выходит.
nop
что даст ту же задержку, но сократит еще на несколко слов.