Skip to content

Instantly share code, notes, and snippets.

@specing
Created March 28, 2015 11:34
Show Gist options
  • Save specing/ded784fd030ec3540ed3 to your computer and use it in GitHub Desktop.
Save specing/ded784fd030ec3540ed3 to your computer and use it in GitHub Desktop.
#pragma once
// {{{ various HD44780 opcodes:
#define HD44780_CLEAR 0b00000001
#define HD44780_RET_HOME 0b00000010
#define HD44780_ENTRY_MODE 0b00000100
#define HD44780_EM_SHIFT 0b00000001
#define HD44780_EM_INC 0b00000010
#define HD44780_EM_LEFT 0b00000010
#define HD44780_EM_DEC 0b00000000
#define HD44780_EM_RIGHT 0b00000000
#define HD44780_DISP 0b00001000
#define HD44780_DISP_DISP_ON 0b00000100
#define HD44780_DISP_DISP_OFF 0b00000000
#define HD44780_DISP_CURSOR_ON 0b00000010
#define HD44780_DISP_CURSOR_OFF 0b00000000
#define HD44780_DISP_BLINK_ON 0b00000001
#define HD44780_DISP_BLINK_OFF 0b00000000
#define HD44780_DISP_SHIFT 0b00010000
#define HD44780_SET 0b00100000
#define HD44780_SET_8_BIT 0b00010000
#define HD44780_SET_4_BIT 0b00000000
#define HD44780_SET_2_LINE 0b00001000
#define HD44780_SET_1_LINE 0b00000000
#define HD44780_SET_5x10_FONT 0b00000100
#define HD44780_SET_5x8_FONT 0b00000000
#define HD44780_SET_CGRAM 0b01000000
#define HD44780_SET_DDRAM 0b10000000
// }}}
#ifdef __AVR__
#define PORT_TO_DDR(port) (*(&port - 1))
#define HD44780_EN_PORT PORTB
#define HD44780_EN_BIT 5
#define HD44780_EN_DDR PORT_TO_DDR(HD44780_EN_PORT)
#define HD44780_RS_PORT PORTD
#define HD44780_RS_BIT 6
#define HD44780_RS_DDR PORT_TO_DDR(HD44780_RS_PORT)
#define HD44780_RW_PORT PORTB
#define HD44780_RW_BIT 4
#define HD44780_RW_DDR PORT_TO_DDR(HD44780_RW_PORT)
#define HD44780_D0_PORT PORTB
#define HD44780_D0_BIT 0
#define HD44780_D0_DDR PORT_TO_DDR(HD44780_D0_PORT)
#define HD44780_D1_PORT PORTB
#define HD44780_D1_BIT 1
#define HD44780_D1_DDR PORT_TO_DDR(HD44780_D1_PORT)
#define HD44780_D2_PORT PORTB
#define HD44780_D2_BIT 2
#define HD44780_D2_DDR PORT_TO_DDR(HD44780_D2_PORT)
#define HD44780_D3_PORT PORTB
#define HD44780_D3_BIT 3
#define HD44780_D3_DDR PORT_TO_DDR(HD44780_D3_PORT)
#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))
void HD44780_W4B (const byte b) asm ("HD44780_W4B") __attribute__((used));
void HD44780_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);
nop();
cbi (HD44780_EN_PORT, HD44780_EN_BIT);
}
#define FAST
//static void HD44780_W8B (byte value) __attribute__((used(HD44780_W4B)));
static void HD44780_W8B (byte value)
{
#ifdef FAST
asm volatile("swap %0 \n\t" : "=r" (value) : "0" (value));
asm volatile("rcall HD44780_W4B \n\t");
asm volatile("swap %0 \n\t" : "=r" (value) : "0" (value));
asm volatile("rcall HD44780_W4B \n\t");
#else
HD44780_W4B(value >> 4);
HD44780_W4B(value);
#endif
_delay_ms (2);
}
static void HD44780_init()
{
// Setup DDRS
sbi (HD44780_EN_DDR, HD44780_EN_BIT);
sbi (HD44780_RS_DDR, HD44780_RS_BIT);
sbi (HD44780_RW_DDR, HD44780_RW_BIT);
sbi (HD44780_D0_DDR, HD44780_D0_BIT);
sbi (HD44780_D1_DDR, HD44780_D1_BIT);
sbi (HD44780_D2_DDR, HD44780_D2_BIT);
sbi (HD44780_D3_DDR, HD44780_D3_BIT);
// MPU-controlled init (hd44780.pdf page 46):
// init state = 0
// cbi (HD44780_RS_PORT, HD44780_RS_BIT);
// cbi (HD44780_RW_PORT, HD44780_RW_BIT);
// cbi (HD44780_EN_PORT, HD44780_EN_BIT);
// _delay_ms(100); // unneeded? see SUT?
//#define INIT
#ifdef INIT
// Set 8bit mode - lolinit
HD44780_W4B (0b0011);
_delay_ms (5);
HD44780_W4B (0b0011);
_delay_ms (5);
HD44780_W4B (0b0011);
_delay_ms (5);
#endif
// Set 4bit mode
HD44780_W4B (0b0010);
_delay_ms (5);
HD44780_W8B ( HD44780_SET
| HD44780_SET_4_BIT
| HD44780_SET_2_LINE
| HD44780_SET_5x8_FONT);
HD44780_W8B ( HD44780_DISP
| HD44780_DISP_DISP_ON
| HD44780_DISP_CURSOR_ON
| HD44780_DISP_BLINK_ON);
HD44780_W8B ( HD44780_CLEAR);
HD44780_W8B ( HD44780_ENTRY_MODE
| HD44780_EM_INC);
// Write H
}
#endif
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment