0 / 0 / 0
Регистрация: 08.05.2013
Сообщений: 42
1

Работа с дисплеем HD44780 в Протеус (ATMega16, ASM)

04.11.2014, 11:58. Показов 5675. Ответов 1
Метки нет (Все метки)

Писал когда то програмку для выводов символов на ЖКИ. Раньше работала. Решил тут недавно добавить функции из этой программы в другую - не выводятся символы. Залил старую программу - тоже не фига не выводится. То ли что то изменил, то ли звезды не так сложились.. Ни в реальном железе, ни в протеусе работать не хочет. Может подскажет кто-где ошибка?

Во вложении проект AVR Studio:
Assembler
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

и проект PROTEUS.
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Миниатюры
Работа с дисплеем HD44780 в Протеус (ATMega16, ASM)  
Вложения
Тип файла: zip lcd_proba2.zip (44.3 Кб, 88 просмотров)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.11.2014, 11:58
Ответы с готовыми решениями:

Работа с LCD дисплеем HD44780 из МК Atmega16 (GCC)
Здравствуйте, пытаюсь подключить LCD дисплей к микроконтроллеру, скачал библиотеку, но уже на...

HD44780+ATMega16+ASM
Писал когда то програмку для выводов символов на ЖКИ. Раньше работала. Решил тут недавно добавить...

Atmega16, АЦП и Протеус [решено]
Блин, второй день мучаюсь. Схема на AtMiko16, меряю АЦП напряжение на аккумуляторе. Очень похожая...

Дисплей HD44780 и Atmega16
Написал код для вывода текста на дисплей HD44780 через мегу16 и все работало и строки выводил пока...

1
0 / 0 / 0
Регистрация: 08.05.2013
Сообщений: 42
07.11.2014, 01:04  [ТС] 2
Всем спасибо.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.11.2014, 01:04

Работа с LCD LM016L-HD44780 (ATMega128, ASM, Proteus)
ЭТА ПРОГРАММА ВЫВОДИТ СТРОКУ НА ЖКИ(DB7-DB0 portA. RW-pb5, RS-pb4,E-pb7) и не работает, при...

HD44780 + ATMega16
Добрый день всем, возниккла следующая проблема аппаратного плана - при подключении 4-х строчного жк...

По нажатию кнопки вывести данные на дисплей HD44780 ATMega16 AVR Studio GCC
Здравствуйте, уважаемые любители-программисты. Нуждаюсь в небольшой помощи по программированию...

Не работает USART ATMega16 (asm)
Пытаюсь тут сделать прием данных по усарту. В дальнейшем планировалось сделать вывод строки...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.