;------------------------------------------------------------------------------ ; HD44780 LCD Assembly driver ; http://avr-mcu.dxp.pl ; e-mail : radek@dxp.pl ; (c) Radoslaw Kwiecien ;------------------------------------------------------------------------------ .include "tn2313def.inc" .include "hd44780.inc" .equ LCD_PORT = PORTB .equ LCD_DDR = DDRB .equ LCD_PIN = PINB .equ LCD_D4 = 0 .equ LCD_D5 = 1 .equ LCD_D6 = 2 .equ LCD_D7 = 3 .equ LCD_RS = 4 .equ LCD_EN = 6 ;------------------------------------------------------------------------------ ; Data segment ;------------------------------------------------------------------------------ .dseg ;------------------------------------------------------------------------------ ; Code segment ;------------------------------------------------------------------------------ .cseg #include "div8u.asm" ;------------------------------------------------------------------------------ ; Write half byte to LCD ;------------------------------------------------------------------------------ LCD_WriteNibble: sbi LCD_PORT, LCD_EN sbrs r16, 0 cbi LCD_PORT, LCD_D4 sbrc r16, 0 sbi LCD_PORT, LCD_D4 sbrs r16, 1 cbi LCD_PORT, LCD_D5 sbrc r16, 1 sbi LCD_PORT, LCD_D5 sbrs r16, 2 cbi LCD_PORT, LCD_D6 sbrc r16, 2 sbi LCD_PORT, LCD_D6 sbrs r16, 3 cbi LCD_PORT, LCD_D7 sbrc r16, 3 sbi LCD_PORT, LCD_D7 cbi LCD_PORT, LCD_EN ret ;------------------------------------------------------------------------------ ; Write data byte to LCD ;------------------------------------------------------------------------------ LCD_WriteData: sbi LCD_PORT, LCD_RS push r16 swap r16 rcall LCD_WriteNibble pop r16 rcall LCD_WriteNibble clr XH ldi XL,250 rcall Wait4xCycles ret ;------------------------------------------------------------------------------ ; Write command byte to LCD ;------------------------------------------------------------------------------ LCD_WriteCommand: cbi LCD_PORT, LCD_RS push r16 swap r16 rcall LCD_WriteNibble pop r16 rcall LCD_WriteNibble ldi r16,2 rcall WaitMiliseconds ret ;------------------------------------------------------------------------------ ; Write string (from program memory) ;------------------------------------------------------------------------------ LCD_WriteString: lpm r16, Z+ cpi r16, 0 breq exit rcall LCD_WriteData rjmp LCD_WriteString exit: ret ;------------------------------------------------------------------------------ ; Display one digit in HEX code ;------------------------------------------------------------------------------ LCD_WriteHexDigit: cpi r16,10 brlo Num ldi r17,'7' add r16,r17 rcall LCD_WriteData ret Num: ldi r17,'0' add r16,r17 rcall LCD_WriteData ret ;------------------------------------------------------------------------------ ; Display 8-byte hex value of r16 ;------------------------------------------------------------------------------ LCD_WriteHex8: push r17 push r16 swap r16 andi r16,0x0F rcall LCD_WriteHexDigit pop r16 andi r16,0x0F rcall LCD_WriteHexDigit pop r17 ret ;------------------------------------------------------------------------------ ; Display decimal value of r16 ;------------------------------------------------------------------------------ LCD_WriteDecimal: clr r14 LCD_WriteDecimalLoop: ldi r17,10 rcall div8u inc r14 push r15 cpi r16,0 brne LCD_WriteDecimalLoop LCD_WriteDecimalLoop2: ldi r17,'0' pop r16 add r16,r17 rcall LCD_WriteData dec r14 brne LCD_WriteDecimalLoop2 ret ;------------------------------------------------------------------------------ ; Set address in Display Data RAM ;------------------------------------------------------------------------------ LCD_SetAddressDD: ori r16, HD44780_DDRAM_SET rcall LCD_WriteCommand ret ;------------------------------------------------------------------------------ ; Set address in Character Generator RAM ;------------------------------------------------------------------------------ LCD_SetAddressCG: ori r16, HD44780_CGRAM_SET rcall LCD_WriteCommand ret ;------------------------------------------------------------------------------ ; Initialization of LCD ;------------------------------------------------------------------------------ LCD_Init: sbi LCD_DDR, LCD_D4 sbi LCD_DDR, LCD_D5 sbi LCD_DDR, LCD_D6 sbi LCD_DDR, LCD_D7 sbi LCD_DDR, LCD_RS sbi LCD_DDR, LCD_EN cbi LCD_PORT, LCD_RS cbi LCD_PORT, LCD_EN ldi r16, 100 rcall WaitMiliseconds ldi r17, 3 InitLoop: ldi r16, 0x03 rcall LCD_WriteNibble ldi r16, 5 rcall WaitMiliseconds dec r17 brne InitLoop ldi r16, 0x02 rcall LCD_WriteNibble ldi r16, 1 rcall WaitMiliseconds ldi r16, HD44780_FUNCTION_SET | HD44780_FONT5x7 | HD44780_TWO_LINE | HD44780_4_BIT rcall LCD_WriteCommand ldi r16, HD44780_DISPLAY_ONOFF | HD44780_DISPLAY_OFF rcall LCD_WriteCommand ldi r16, HD44780_CLEAR rcall LCD_WriteCommand ldi r16, HD44780_ENTRY_MODE |HD44780_EM_SHIFT_CURSOR | HD44780_EM_INCREMENT rcall LCD_WriteCommand ldi r16, HD44780_DISPLAY_ONOFF | HD44780_DISPLAY_ON | HD44780_CURSOR_OFF | HD44780_CURSOR_NOBLINK rcall LCD_WriteCommand ret ;------------------------------------------------------------------------------ ; End of file ;------------------------------------------------------------------------------