-
-
Save specing/ded784fd030ec3540ed3 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
a |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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