1 ; ************************************************
2 ; * *
3 ; * A PROGRAM TO EXPERIMENT WITH MY LCD DISPLAY *
4 ; * *
5 ; ************************************************
6
7 ;*****************************************************************************
8 ; *
9 ; USING 8-BIT MODE *
10 ; *
11 ; Lines used for control signals on port 2: *
12 ; B4 B0 *
13 ; RS EN Hex Operation *
14 ; ** ** *** ********* *
15 ; 0 1 01h IR write as an internal operation (display clear, etc.) *
16 ; 1 1 11h Write data to DDRAM or CGRAM (DR to DDRAM or CGRAM) *
17 ; *
18 ;*****************************************************************************
19
20 USE16
21
22 section .data
23 ROM_SIZE equ 2048 ; size of ROM
24
25 section .text
26
27 Startup:
28 00000000 31C0 xor ax,ax
29 00000002 8ED0 mov ss,ax
30 00000004 BCFE07 mov sp,2046
31 00000007 B090 mov al,90h ;This sets the 8255 to operate
32 ;in Mode 0 (basic input output)
33 ;with port 0 as an input and
34 00000009 E603 out 03h,al ;ports 1 and 2 as outputs.
35 0000000B 31DB xor bx,bx
36
37 0000000D E80600 call LongDelay
38 00000010 E80A00 call LCDinit
39 00000013 E86100 call LCDinit2
40
41
42 00000016 BBFF3F LongDelay: mov bx,0x3FFF ; Reset the countdown timer.
43 00000019 4B dec bx ; Decrement it by 1 each time.
44 ; cmp bx,00h
45 0000001A 75FA jnz $-4 ; If the counter hasn't counted
46 ; down to 00h yet, keep going.
47 0000001C C3 ret
48
49 0000001D B038 LCDinit: mov al,00111000b ; 8-bit, 2 lines, 5x8 characters
50 0000001F E601 out 01h,al
51 00000021 B001 mov al,01h
52 00000023 E602 out 02h,al
53 00000025 E8EEFF call LongDelay
54 00000028 E8EBFF call LongDelay
55 0000002B B000 mov al,00h
56 0000002D E602 out 02h,al
57 0000002F E8E4FF call LongDelay
58 00000032 E8E1FF call LongDelay
59 00000035 E8DEFF call LongDelay
60
61 00000038 B00C mov al,00001100b ; Turn display on, cursor off, and do not blink the character at cursor
62 0000003A E601 out 01h,al
63 0000003C B001 mov al,01h
64 0000003E E602 out 02h,al
65 00000040 E8D3FF call LongDelay
66 00000043 E8D0FF call LongDelay
67 00000046 B000 mov al,00h
68 00000048 E602 out 02h,al
69 0000004A E8C9FF call LongDelay
70 0000004D E8C6FF call LongDelay
71 00000050 E8C3FF call LongDelay
72
73 00000053 B001 mov al,00000001b ; Clear the screen
74 00000055 E601 out 01h,al
75 00000057 B001 mov al,01h
76 00000059 E602 out 02h,al
77 0000005B E8B8FF call LongDelay
78 0000005E E8B5FF call LongDelay
79 00000061 B000 mov al,00h
80 00000063 E602 out 02h,al
81 00000065 E8AEFF call LongDelay
82 00000068 E8ABFF call LongDelay
83 0000006B E8A8FF call LongDelay
84
85 0000006E B014 mov al,00010100b ; Set cursor to move and display to shift to the right
86 00000070 E601 out 01h,al
87 00000072 B001 mov al,01h
88 00000074 E602 out 02h,al
89 00000076 C3 ret
90
91 LCDinit2:
92
93 00000077 E89CFF call LongDelay
94 0000007A E899FF call LongDelay
95 0000007D B000 mov al,00h
96 0000007F E602 out 02h,al
97 00000081 E892FF call LongDelay
98 00000084 E88FFF call LongDelay
99 00000087 E88CFF call LongDelay
100
101 0000008A B006 mov al,00000110b ; Increment, and no display shift
102 0000008C E601 out 01h,al
103 0000008E B001 mov al,01h
104 00000090 E602 out 02h,al
105 00000092 E881FF call LongDelay
106 00000095 E87EFF call LongDelay
107 00000098 B000 mov al,00h
108 0000009A E602 out 02h,al
109 0000009C E877FF call LongDelay
110 0000009F E874FF call LongDelay
111 000000A2 E871FF call LongDelay
112
113 000000A5 B002 mov al,00000010b ; Return the cursor to home
114 000000A7 E601 out 01h,al
115 000000A9 B000 mov al,00h
116 000000AB E602 out 02h,al
117 000000AD E866FF call LongDelay
118 000000B0 E863FF call LongDelay
119 000000B3 E602 out 02h,al
120 000000B5 E85EFF call LongDelay
121 000000B8 E85BFF call LongDelay
122 000000BB E858FF call LongDelay
123 000000BE F4 hlt
124 000000BF C3 ret
125
126 org ROM_SIZE-16
127 000000C0 EA db 0eah ; far inter-segment jump
128 000000C1 0000[0000] dw 0000h,Startup
129 000000C5 80FF dw 10000h-(ROM_SIZE/16) ; target segment