Проверьте это. Полностью соответствует первоначальному моему варианту в плане применения EOR http://caxapa.ru/269503.html
Send_Com_Init:
cbi CMD_PORT,RS
; /*FALLTHROUGH*/
Send_Nibble:
rcall Data_Port_Out
andi LCD_DATA, 0xF0
in r16, DATA_PORT
rjmp Send_Nibble_1
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
rcall Just_ret
cbi CMD_PORT, Ena
swap LCD_DATA
Send_Nibble_1:
andi r16, 0x0F
or r16, LCD_DATA
out DATA_PORT, r16
sbi CMD_PORT, Ena
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