You are on page 1of 5

,,,; LCD Display Driver Demo.

,,,; Timing code assumes 1.2MHz Clock


,,,
,,,;LCD Registers addresses
,,,LCD_CMD_WR equ 0
,,,LCD_DATA_WR equ 1
,,,LCD_BUSY_RD equ 2
,,,LCD_DATA_RD equ 3
,,,
,,,;LCD Commands
,,,LCD_CLS
equ 1
,,,LCD_HOME
equ 2
,,,LCD_SETMODE equ 4
,,,LCD_SETVISIBLE equ 8
,,,LCD_SHIFT
equ 16
,,,LCD_SETFUNCTION equ 32
,,,LCD_SETCGADDR equ 64
,,,LCD_SETDDADDR equ 128
,,,
,,,;Reset vector
,,,
org 0000h
0000,02 01 6A,,
jmp start // SALTO INCONDICIONAL A LA POSICION 016A DE LA ROM
,,,
,,,
,,,;Start of the program
,,,
org 0100h
,,,
0100,20 21 21 20,string1a,string1a:db ' !! A M A Z I N G !! '
0115,00,,
db 0
0116,21 21 20 41,string1b,string1b:db '!! A M A Z I N G !! '
012A,00,,
db 0
012B,20 41 20 76,string2,string2:db ' A virtual LM032L... '
0140,00,,
db 0
,,,
0141,20 64 72 69,string3,string3:db ' driven by a virtual '
0156,00,,
db 0
0157,20 20 20 38,string4,string4:db ' 8051 processor!'
0169,00,,
db 0
,,,
016A,74 38,start,start: mov A,#038h ; MOVER EL NRO 38H AL ACUMULADOR
016C,12 02 11,,
call wrcmd ; SALTO A SUBRUTINA EN POSICION 0211 DE LA ROM
,,,
016F,74 0E,loop,loop: mov A,#LCD_SETVISIBLE+6
;Make the display & blink visible: ; MUEVO
AL ACUMULADOR EL NRO 0E
0171,12 02 11,,
call wrcmd ; LLAMADA A SUBRUTINA EN POSICION 0211 DE LA ROM
,,,
0174,7F 02,,
mov R7,#2 ; MUEVO AL REGISTRO R7 EL NRO 02H
0176,,loop2,loop2:

0176,90 01 00,,
0179,12 01 DF,,
,,,
017C,90 00 C8,,
017F,12 02 2C,,
,,,
0182,74 01,,
0184,12 02 11,,
,,,
0187,90 01 16,,
018A,12 01 DF,,
,,,
018D,90 00 C8,,
0190,12 02 2C,,
,,,
0193,74 01,,
0195,12 02 11,,
,,,
0198,DF DC,,
A LOOP2
,,,
019A,90 01 00,,
019D,12 01 DF,,
,,,
01A0,90 01 90,,
01A3,12 02 2C,,
,,,
01A6,74 C0,,
01A8,12 02 11,,
,,,
01AB,90 01 2B,,
01AE,12 01 F5,,
,,,
01B1,90 00 C8,,
01B4,12 02 2C,,
,,,
01B7,74 01,,
01B9,12 02 11,,
,,,
01BC,90 01 41,,
01BF,12 01 F5,,
,,,
01C2,74 C0,,
01C4,12 02 11,,
,,,
01C7,90 01 57,,
01CA,12 01 F5,,
,,,

mov DPTR,#string1a ; MUEVO AL DPTR EL NRO 0100H


call wrstr ; LLAMADA A SUBRUTINA UBICADA EN POSICION 01DF DE LA ROM
mov DPTR,#200 ; MOVER AL DPTR EL NRO 200B
call wtms ; LLAMADA A SUBRUTINA UBICADA EN LA POSICION 022C
mov A,#LCD_CLS
;Clear screen ; MOVER AL ACUMULADOR EL NRO 01H
call wrcmd ; LLAMADA A SUBRUTINA UBICADA EN LA POSICION 0211H
mov DPTR,#string1b ; MOVER AL DPTR EL NRO 0116H
call wrstr ; LLAMADA A SUBRUTINA UBICADA EN LA POSICION 01DF
mov DPTR,#200 ; MOVER AL DPTR EL NUMERO C8
call wtms ; LLAMADA A SUBRUTINA UBICADA EN LA POSICION 022C
mov A,#LCD_CLS
;Clear screen ; MOVER AL ACUMULADOR EL NRO 01H
call wrcmd ; LLAMADA A SUBRUTINA UBICADA EN LA POSICION 0211H
djnz R7,loop2 ; DECREMENTA EL REGISTRO R7 HASTA QUE SEA 0 Y LUEGO SALTA

mov DPTR,#string1a ; MOVER AL DPTR EL NRO 0100H


call wrstr ; LLAMADA A SUBRUTINA UBICADA EN LA POSICION 01DF
mov DPTR,#400
call wtms
mov A,#LCD_SETDDADDR+64
call wrcmd
mov DPTR,#string2
call wrslow
mov DPTR,#200
call wtms
mov A,#LCD_CLS
call wrcmd

;Clear screen

mov DPTR,#string3
call wrslow
mov A,#LCD_SETDDADDR+64
call wrcmd
mov DPTR,#string4
call wrslow

01CD,74 0F,,
mov A,#LCD_SETVISIBLE+7
;Show the blink cursor as well.
01CF,12 02 11,,
call wrcmd
,,,
01D2,90 07 D0,,
mov DPTR,#2000
01D5,12 02 2C,,
call wtms
,,,
01D8,74 01,,
mov A,#LCD_CLS
;Clear screen
01DA,12 02 11,,
call wrcmd
,,,
01DD,80 90,,
jmp loop
,,,
,,,
,,,;Sub routine to write null terminated string at DPTR in program ram.
01DF,78 01,wrstr,wrstr: mov R0,#LCD_DATA_WR ; MOVER AL REGISTRO R0 EL NUMERO 01H
01E1,E4,wrstr1,wrstr1: clr A ; LIMPIAR EL ACUMULADOR
01E2,93,,
movc A,@A+DPTR ; MOVER AL ACUMULADOR EL CONTENIDO DE LA SUMA DEL
ACUMULADOR MAS EL DPTR
01E3,60 0F,,
jz wrstr2
01E5,F2,,
movx @R0,A ; MOVER AL CONTENIDO DEL REGISTRO R0 EL CONTENIDO DEL
ACUMULADOR
01E6,12 02 1A,,
call wtbusy ; LLAMADA A SUBRUTINA EN LA POSICION 021A DE LA ROM
01E9,A3,,
inc DPTR ; INCREMENTAR EN 1 EL DPTR
01EA,C0 82,,
push DPL
01EC,C0 83,,
push DPH
01EE,D0 83,,
pop DPH
01F0,D0 82,,
pop DPL
01F2,80 ED,,
jmp wrstr1
01F4,22,wrstr2,wrstr2: ret
,,,
,,,;Sub routine to write null terminated string at DPTR in program ram. Slowly
01F5,78 01,wrslow,wrslow: mov R0,#LCD_DATA_WR
01F7,E4,wrslw1,wrslw1: clr A
01F8,93,,
movc A,@A+DPTR
01F9,60 15,,
jz wrslw2
01FB,F2,,
movx @R0,A
01FC,12 02 1A,,
call wtbusy
01FF,A3,,
inc DPTR
0200,C0 82,,
push DPL
0202,C0 83,,
push DPH
0204,90 00 64,,
mov DPTR,#100
0207,12 02 2C,,
call wtms
020A,D0 83,,
pop DPH
020C,D0 82,,
pop DPL
020E,80 E7,,
jmp wrslw1
0210,22,wrslw2,wrslw2: ret
,,,
,,,
,,,;Sub routine to write command:

0211,78 00,wrcmd,wrcmd: mov R0,#LCD_CMD_WR ; MOVER EL NRO 00H AL REGISTRO R0


0213,F2,,
movx @R0,A ; MOVER AL ACUMULADOR EL CONTENIDO DE LA POSICION 00H DE LA
RAM EXTERNA
0214,02 02 1A,,
jmp wtbusy ; SALTO INCONDICIONAL A LA POSICION 021A DE LA ROM
,,,
,,,
,,,;Sub routine to write character:
0217,78 01,wrchar,wrchar: mov R0,#LCD_DATA_WR
0219,F2,,
movx @R0,A
,,,
,,,;Subroutine to wait for busy clear
021A,79 02,wtbusy,wtbusy: mov R1,#LCD_BUSY_RD ; MOVER EL NUMERO 02H AL REGISTRO R1
021C,E3,,
movx A,@r1 ; MOVER AL ACUMULADOR EL CONTENIDO DE LA POSICION 02H DE LA
RAM EXTERNA
021D,20 E7 FA,,
jb ACC.7,wtbusy ; SALTO SI EL BIT ACC.7 ESTA EN 1
0220,22,,
ret ; RETORNO A LA RUTINA ANTERIOR
,,,
,,,;Wait for number of seconds in A
0221,C0 E0,wtsec,wtsec: push ACC
0223,12 02 2C,,
call wtms
0226,D0 E0,,
pop ACC
0228,14,,
dec A
0229,70 F6,,
jnz wtsec
022B,22,,
ret
,,,
,,,;Wait for number of milliseconds in DPTR
022C,63 82 FF,wtms,wtms: xrl DPL,#0FFh
;Can't do DEC DPTR, so do the loop by
forming 2's complement
022F,63 83 FF,,
xrl DPH,#0FFh
;and incrementing instead.
0232,A3,,
inc DPTR
0233,75 8A 9C,wtms1,wtms1: mov TL0,#09Ch
;100 ticks before overflow = 1ms at
1.2MHz Clock
0236,75 8C FF,,
mov TH0,#0FFh
0239,75 89 01,,
mov TMOD,#1
;Timer 0 mode 1
023C,D2 8C,,
setb TCON.4
;Timer 0 runs
023E,30 8D FD,wtms2,wtms2: jnb TCON.5,wtms2
0241,C2 8C,,
clr TCON.4
;Timer 0 stops
0243,C2 8D,,
clr TCON.5
0245,A3,,
inc DPTR
0246,E5 82,,
mov A,DPL
0248,45 83,,
orl A,DPH
024A,70 E7,,
jnz wtms1
024C,22,,
ret
,,,
,,,
000E,,,
END

EL CODIGO EN HEXA
:0300000002016A90
:100100002021212041204D2041205A2049204E20ED
:1001100047202121200021212041204D2041205A2B
:100120002049204E204720212120002041207669AF
:10013000727475616C204C4D3033324C2E2E2E2053
:10014000002064726976656E20627920612076698C
:10015000727475616C200020202038303531207099
:10016000726F636573736F722100743812021174B9
:100170000E1202117F029001001201DF9000C812DE
:10018000022C74011202119001161201DF9000C8B6
:1001900012022C7401120211DFDC9001001201DF47
:1001A00090019012022C74C012021190012B1201C6
:1001B000F59000C812022C74011202119001411234
:1001C00001F574C01202119001571201F5740F125B
:1001D00002119007D012022C740112021180907843
:1001E00001E493600FF212021AA3C082C083D0838D
:1001F000D08280ED227801E4936015F212021AA3F6
:10020000C082C08390006412022CD083D08280E729
:10021000227800F202021A7801F27902E320E7FA6A
:1002200022C0E012022CD0E01470F6226382FF6339
:1002300083FFA3758A9C758CFF758901D28C308DE4
:0D024000FDC28CC28DA3E582458370E722CC
:00000001FF