#define bit_check_and_set(dbyte, dbit, port, pbit)\
asm volatile ("sbrs %0, %1\n\t" :: "r" (dbyte), "I"(dbit));\
asm volatile (" cbi %0, %1\n\t" :: "I" (_SFR_IO_ADDR(port)), "I"(pbit));\
asm volatile ("sbrc %0, %1\n\t" :: "r" (dbyte), "I"(dbit));\
asm volatile (" sbi %0, %1\n\t" :: "I" (_SFR_IO_ADDR(port)), "I"(pbit))
static void W4B (const byte b) asm ("W4B");
static void W4B (const byte b)
{
sbi (HD44780_EN_PORT, HD44780_EN_BIT);
// this provides the necesary delay: (atleast 44 cycles ~= 3us)
bit_check_and_set (b, 0, HD44780_D0_PORT, HD44780_D0_BIT);
bit_check_and_set (b, 1, HD44780_D1_PORT, HD44780_D1_BIT);
bit_check_and_set (b, 2, HD44780_D2_PORT, HD44780_D2_BIT);
bit_check_and_set (b, 3, HD44780_D3_PORT, HD44780_D3_BIT);
cbi (HD44780_EN_PORT, HD44780_EN_BIT);
}
static void W8B (const byte value)
{
// asm volatile("swap %0 \n\t" : "=r" (value) : "0" (value));
// asm volatile("rcall W4B \n\t");
// asm volatile("swap %0 \n\t" : "=r" (value) : "0" (value));
// asm volatile("rcall W4B \n\t");
W4B(value >> 4);
W4B(value);
_delay_ms (2);
}