Вот кстати да, и, кстати, в этом месте и не так, а просто провалиться на следующую команду :-) Send_Com_Init:
cbi CMD_PORT,RS
; /*FALLTHROUGH*/
Send_Nibble:
rcall Data_Port_Out
andi LCD_DATA,0xF0
in r16,DATA_PORT
andi r16,0x0F
or r16,LCD_DATA
out DATA_PORT,r16
sbi CMD_PORT,Ena
; Задержка 7 тактов
; Тут не важно 7 или 5, выполняется несколько раз в начале, экономить нечего
rcall Just_ret
cbi CMD_PORT,Ena
rjmp Data_Port_In
Send_Com:
cbi CMD_PORT,RS
rjmp Send_Byte
Send_Data:
sbi CMD_PORT,RS
; /*FALLTHROUGH*/
; именно тут, так как Send_Data вызывается чаще, чем Send_Com, та сбегает по rjmp
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
; Если задержка нужна 5 тактов
rjmp .
rjmp .
nop
; Если устраивает задержка 7 тактов
; rcall Just_ret
cbi CMD_PORT,Ena
andi r16, 0x0F
swap LCD_DATA
or r16,LCD_DATA
out DATA_PORT,r16
sbi CMD_PORT,Ena
; Если задержка нужна 5 тактов
rjmp .
rjmp .
nop
; Если устраивает задержка 7 тактов
; rcall Just_ret
cbi CMD_PORT,Ena
; /*FALLTHROUGH*/
; именно тут, так как Send_Byte вызывается чаще других, остальные сбегают по rcall
Data_Port_In:
in r16,Data_DDR
andi r16,0x0F
out Data_DDR,r16
in r16,Data_Port
andi r16,0x0F
out Data_Port,r16
Just_ret:
ret
Data_Port_Out:
in r16,Data_DDR
ori r16,0xF0
out Data_DDR,r16
ret