1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
| .include "m16def.inc" ; ATMega16
//--------------------------------
.DSEG
.def temp=R16
.equ LCD_PORT = PORTA
.equ LCD_DDR = DDRA
.equ LCD_PIN = PINA
.equ D4 = 0
.equ D5 = 1
.equ D6 = 2
.equ D7 = 3
.equ RS = 4
.equ EN = 5
//---------------------------------
//-----------------------------------------------
.CSEG
.ORG $0000
RJMP INIT
//Инициализация МК-------------------------------
INIT:
//Инициализация стека----------
ldi r16,low(RAMend)
out SPL,r16
ldi r16,high(RAMend)
out SPH,r16
//-----------------------------
//Инициализация дисплея
RCALL LCD_INIT
RCALL WAIT_100us
LDI temp, 0b10000000 //Адрес DDRAM - 0x00 (первая строка)
RCALL Two
LDI temp, 0xb1
RCALL WrData
RCALL WAIT_100us
LDI temp, 'M'
RCALL WrData
RCALL WAIT_100us
//---------------------------------
LDI temp, 0b11000000 //Адрес DDRAM - 0x40 (вторая строка)
RCALL Two
LDI temp, 'M'
RCALL WrData
RCALL WAIT_100us
STOP:
NOP
RJMP STOP
//------------------------------------------------
//Подпрограммы------------------------------------
//---------------------------------
LCD_INIT:
RCALL WAIT_20ms
sbi LCD_DDR, D4 ;Ножки порта на выход
sbi LCD_DDR, D5
sbi LCD_DDR, D6
sbi LCD_DDR, D7
sbi LCD_DDR, RS
sbi LCD_DDR, EN
cbi LCD_PORT, RS ;оистить значение RS, EN
cbi LCD_PORT, EN
RCALL WAIT_100us
LDI temp, 0b00000011
RCALL One ;Начальная инициализация
RCALL WAIT_100us
LDI temp, 0b00000011
RCALL One ;вызывается
RCALL WAIT_100us
LDI temp, 0b00000011
RCALL One ;три раза
RCALL WAIT_100us
LDI temp, 0b00000010 ;4x битный режим
RCALL One
RCALL WAIT_100us
LDI temp, 0x28 ;2 строки 5х7
RCALL Two
RCALL WAIT_100us
LDI temp, 0x06 ;автоинкремент счетчика DDRAM
RCALL Two
RCALL WAIT_100us
LDI temp, 0x0c ;Дисплей вкл, курсор выкл
RCALL Two
RCALL WAIT_100us
LDI temp, 0x01 ;очистить LCD
RCALL Two
RCALL WAIT_5ms
LDI temp, 0x06 ;очистить LCD
RCALL Two
RCALL WAIT_5ms
RET
//----------------------------------
WrData:
CLR R17 ;Чистим R17
SBR R17, 0b00010000 ;Установим 5 бит в R17 (RS=1 запись данных)
RJMP TwoData
RET
Two: ;Записать в дисплей
CLR R17
TwoData:
PUSH R16 ;Загрузка значения в стек
SWAP R16 ;поменяли полубайты местами
ANDI temp, 0b00001111 ;маскируем старшую часть байта
OR temp, R17 ;объединяем младшую часть байта и R17
OUT LCD_PORT, temp ;выводим получившееся значение в порт
NOP
NOP
NOP
SBI LCD_PORT, EN ;начало строба
NOP
NOP
NOP
NOP
NOP
CBI LCD_PORT, EN ;конец строба
RCALL WAIT_100us
NOP
POP R16 ;вытащили оригинал данных из стека
ANDI temp, 0b00001111 ;замаскировали старшие полубайты
OR temp, R17 ;объединили два регистра
One:
OUT LCD_PORT, temp ;вывели получившееся значение в порт
NOP
NOP
NOP
SBI LCD_PORT, EN ;начало строба
NOP
NOP
NOP
NOP
NOP
NOP
CBI LCD_PORT, EN ;конец строба
RCALL WAIT_100us ;задержка
RET
//----------------------------------
//Подпрограммы задержки
WAIT_20ms:
; =============================
; delay loop generator
; 160000 cycles:
; -----------------------------
; delaying 159975 cycles:
ldi R17, $E1
WGLOOP01: ldi R18, $EC
WGLOOP11: dec R18
brne WGLOOP11
dec R17
brne WGLOOP01
; -----------------------------
; delaying 24 cycles:
ldi R17, $08
WGLOOP21: dec R17
brne WGLOOP21
; -----------------------------
; delaying 1 cycle:
nop
; =============================
RET
//----------------------------------
WAIT_5ms: ;Расчет делался в программе
; =============================
; delay loop generator
; 40000 cycles:
; -----------------------------
; delaying 39999 cycles:
ldi R17, $43
WGLOOP02: ldi R18, $C6
WGLOOP12: dec R18
brne WGLOOP12
dec R17
brne WGLOOP02
; -----------------------------
; delaying 1 cycle:
nop
; =============================
RET
//----------------------------------
WAIT_100us:
; =============================
; delay loop generator
; 800 cycles:
; -----------------------------
; delaying 798 cycles:
ldi R17, $02
WGLOOP03: ldi R18, $84
WGLOOP13: dec R18
brne WGLOOP13
dec R17
brne WGLOOP03
; -----------------------------
; delaying 2 cycles:
nop
nop
; =============================
RET |