engineer khan
Member level 3
please anybody send me lcd all commands c programming 8051 microcontroller i use,,,,please also tell me that commands for 16x2 lcd and 16x4 lcd are the same or different
Follow along with the video below to see how to install our site as a web app on your home screen.
Note: This feature may not be available in some browsers.
*************************************************************************
;* PROGRAM NAME : Lcd.ASM
;* DESCRIPRTION : Program for testing LCD display. 4-bit communication
;* is used. Program does not check BUSY flag but uses program delay
;* between 2 commands. PORT1 is used for connection
;* to the microcontroller.
;************************************************************************
;BASIC DIRECTIVES
$MOD53
$TITLE(LCD.ASM)
$PAGEWIDTH(132)
$DEBUG
$OBJECT
$NOPAGING
;Stack
DSEG AT 0E0h
Stack_Start: DS 020h
Start_address EQU 0000h
;Reset vectors
CSEG AT 0
ORG Start_address
JMP Inic
ORG Start_address+100h
MOV IE,#00 ; All interrupts are disabled
MOV SP,#Stack_Start
Inic: CALL LCD_inic ; Initialize LCD
;*************************************************
;* MAIN PROGRAM
;*************************************************
START: MOV A,#80h ; Next character will appear on the first
CALL LCD_status ; location in the first line of LCD display.
MOV A,#'M' ; Display character ‘M’.
CALL LCD_putc ; Call subroutine for character transmission.
MOV A,#'i' ; Display character ‘i’.
CALL LCD_putc
MOV A,#'k' ; Display character ‘k’.
CALL LCD_putc
MOV A,#'r' ; Display character ‘r’.
CALL LCD_putc
MOV A,#'o' ; Display character ‘o’.
CALL LCD_putc
MOV A,#'e' ; Display character ‘e’.
CALL LCD_putc
MOV A,#'l' ; Display character ‘l’.
CALL LCD_putc
MOV A,#'e' ; Display character ‘e’.
CALL LCD_putc
MOV A,#'k' ; Display character ‘k’.
CALL LCD_putc
MOV A,#'t' ; Display character ‘t’.
CALL LCD_putc
MOV A,#'r' ; Display character ‘r’.
CALL LCD_putc
MOV A,#'o' ; Display character ‘o’.
CALL LCD_putc
MOV A,#'n' ; Display character ‘n’.
CALL LCD_putc
MOV A,#'i' ; Display character ‘i’.
CALL LCD_putc
MOV A,#'k' ; Display character ‘k’.
CALL LCD_putc
MOV A,#'a' ; Display character ‘a’.
CALL LCD_putc
MOV A,#0c0h ; Next character will appear on the first
CALL LCD_status ; location in the second line of LCD display.
MOV A,#'R' ; Display character ‘R’.
CALL LCD_putc ; Call subroutine for character transmission.
MOV A,#'a' ; Display character ‘a’.
CALL LCD_putc
MOV A,#'z' ; Display character ‘z’.
CALL LCD_putc
MOV A,#'v' ; Display character ‘v’.
CALL LCD_putc
MOV A,#'o' ; Display character ‘o’.
CALL LCD_putc
MOV A,#'j' ; Display character ‘j’.
CALL LCD_putc
MOV A,#'n' ; Display character ‘n’.
CALL LCD_putc
MOV A,#'i' ; Display character ‘i’.
CALL LCD_putc
MOV A,#' ' ; Display character ‘ ’.
CALL LCD_putc
MOV A,#'s' ; Display character ‘s’.
CALL LCD_putc
MOV A,#'i' ; Display character ‘i’.
CALL LCD_putc
MOV A,#'s' ; Display character ‘s’.
CALL LCD_putc
MOV A,#'t' ; Display character ‘t’.
CALL LCD_putc
MOV A,#'e' ; Display character ‘e’.
CALL LCD_putc
MOV A,#'m' ; Display character ‘m’.
CALL LCD_putc
MOV A,#'i' ; Display character ‘i’.
CALL LCD_putc
MOV R0,#20d ; Wait time (20x10ms)
CALL Delay_10ms ;
MOV DPTR,#LCD_DB ; Clear display
MOV A,#6d ;
CALL LCD_inic_status ;
MOV R0,#10d ; Wait time(10x10ms)
CALL Delay_10ms
JMP START
;*********************************************
;* Subroutine for wait time (T= r0 x 10ms)
;*********************************************
Delay_10ms: MOV R5,00h ; 1+(1+(1+2*r7+2)*r6+2)*r5 approximately
MOV R6,#100d ; (if r7>10)
MOV R7,#100d ; 2*r5*r6*r7
DJNZ R7,$ ; $ indicates current instruction.
DJNZ R6,$-4
DJNZ R5,$-6
RET
;**************************************************************************************
;* SUBROUTINE: LCD_inic
;* DESCRIPTION: Subroutine for LCD initialization.
;*
;* (is used with 4-bit interface, under condition that pins DB4-7 on LCD
;* are connected to pins PX.4-7 on microcontroller’s ports, i.e. four higher
;* bits on the port are used).
;*
;* NOTE: It is necessary to define port pins for controlling LCD operation:
;* LCD_enable, LCD_read_write, LCD_reg_select,similar to port for connection to LCD.
;* It is also necessary to define addresses for the first character in each
;* line.
;**************************************************************************************
LCD_enable BIT P1.3 ; Bit for activating pin E on LCD.
LCD_read_write BIT P1.1 ; Bit for activating pin RW on LCD.
LCD_reg_select BIT P1.2 ; Bit for activating pin RS on LCD.
LCD_port SET P1 ; Port for connection to LCD.
Busy BIT P1.7 ; Port pin on which Busy flag appears.
LCD_Start_I_red EQU 00h ; Address of the first message character
; in the first line of LCD display.
LCD_Start_II_red EQU 40h ; Address of the first message character
; in the second line of LCD display.
LCD_DB: DB 00111100b ; 0 -8b, 2/1 lines, 5x10/5x7 format
DB 00101100b ; 1 -4b, 2/1 lines, 5x10/5x7 format
DB 00011000b ; 2 -Display/cursor shift, right/left
DB 00001100b ; 3 -Display ON, cursor OFF, cursor blink off
DB 00000110b ; 4 -Increment mode, display shift off
DB 00000010b ; 5 -Display/cursor home
DB 00000001b ; 6 -Clear display
DB 00001000b ; 7 -Display OFF, cursor OFF, cursor blink off
LCD_inic: ;*****************************************
MOV DPTR,#LCD_DB
MOV A,#00d ; Triple initialization in 8-bit
CALL LCD_inic_status_8 ; mode is performed at the beginning
MOV A,#00d ; (in case of slow increment of
CALL LCD_inic_status_8 ; power supply when the power supply is on
MOV A,#00d
lcall LCD_inic_status_8
MOV A,#1d ; Change from 8-bit into
CALL LCD_inic_status_8 ; 4-bit mode
MOV A,#1d
CALL LCD_inic_status
MOV A,#3d ; As from this point the program executes in
;4-bit mode
CALL LCD_inic_status
MOV A,#6d
CALL LCD_inic_status
MOV A,#4d
CALL LCD_inic_status
RET
LCD_inic_status_8:
;******************************************
PUSH B
MOVC A,@A+DPTR
CLR LCD_reg_select ; RS=0 - Write command
CLR LCD_read_write ; R/W=0 - Write data on LCD
MOV B,LCD_port ; Lower 4 bits from LCD port are memorized
ORL B,#11110000b
ORL A,#00001111b
ANL A,B
MOV LCD_port,A ; Data is moved from A to LCD port
SETB LCD_enable ; high-to-low transition signal
; is generated on the LCD's EN pin
CLR LCD_enable
MOV B,#255d ; Time delay in case of improper reset
DJNZ B,$ ; during initialization
DJNZ B,$
DJNZ B,$
POP B
RET
LCD_inic_status:
;****************************************************************************
MOVC A,@A+DPTR
CALL LCD_status
RET
;****************************************************************************
;* SUBROUTINE: LCD_status
;* DESCRIPTION: Subroutine for defining LCD status.
;****************************************************************************
LCD_status: PUSH B
MOV B,#255d
DJNZ B,$
DJNZ B,$
DJNZ B,$
CLR LCD_reg_select ; RS=O: Command is sent to LCD
CALL LCD_port_out
SWAP A ; Nibles are swapped in accumulator
DJNZ B,$
DJNZ B,$
DJNZ B,$
CLR LCD_reg_select ; RS=0: Command is sent to LCD
CALL LCD_port_out
POP B
RET
;****************************************************************************
;* SUBROUTINE: LCD_putc
;* DESCRIPTION: Sending character to be displayed on LCD.
;****************************************************************************
LCD_putc: PUSH B
MOV B,#255d
DJNZ B,$
SETB LCD_reg_select ; RS=1: Character is sent to LCD
CALL LCD_port_out
SWAP A ; Nibles are swapped in accumulator
DJNZ B,$
SETB LCD_reg_select ; RS=1: Character is sent to LCD
CALL LCD_port_out
POP B
RET
;****************************************************************************
;* SUBROUTINE: LCD_port_out
;* DESCRIPTION: Sending commands or characters on LCD display
;****************************************************************************
LCD_port_out: PUSH ACC
PUSH B
MOV B,LCD_port ; Lower 4 bits of LCD port are memorized
ORL B,#11110000b
ORL A,#00001111b
ANL A,B
MOV LCD_port,A ; Data is copied from A to LCD port
SETB LCD_enable ; high-to-low transition signal
; is generated on the LCD's EN pin
CLR LCD_enable
POP B
POP ACC
RET
END ; End of program