Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
kyposirkiy1234
0 / 0 / 0
Регистрация: 06.04.2014
Сообщений: 1
1

16х2 4бит режим(проблема)

09.04.2014, 21:09. Просмотров 2071. Ответов 3
Метки нет (Все метки)

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#define LDP PORTB   //define MCU port connected to LCD data pins
#define LCD_RS  4   //define MCU pin connected to LCD RS
#define LCD_E   5   //define MCU pin connected to LCD E
#define LCD_D4  0   //define MCU pin connected to LCD D3
#define LCD_D5  1   //define MCU pin connected to LCD D4
#define LCD_D6  2   //define MCU pin connected to LCD D5
#define LCD_D7  3   //define MCU pin connected to LCD D6
 
void LCDsendCommomd(uint8_t cmd)    //Sends Commomd to LCD
{
LDP=(cmd&0b11110000);
LCP|=1<<LCD_E;
_delay_ms(1);
LCP&=~(1<<LCD_E);
_delay_ms(1);
LDP=((cmd&0b00001111)<<4);
LCP|=1<<LCD_E;
_delay_ms(1);
LCP&=~(1<<LCD_E);
_delay_ms(1);
}
Соответственно код перестал работать, библиотека кривовато написана. Толку дефайнить d4..d7 линии если LDP= всеравно засылает байт в порт.
Подскажите как реализовать с помощью битовых масок запись в порт чтоб немешать остальным ногам ?
LDP|=(LCD_D4&(cmd<<LCD_D4))|(LCD_D5&(cmd<<LCD_D5))|(LCD_D6&(cmd<<LCD_D6))|(LCD_D7&(cmd<<LCD_D7)); нехочет работать
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.04.2014, 21:09
Ответы с готовыми решениями:

как организовать передачу МК>МК>UART>МК>LCD 16х2
Заказал темброблок на МК с дисплеем, дисплей аналоговый. как сделать так чтобы дисплей находился на...

получить 4бит из байта
есть байт, например 32 что написать в структуру что бы прочитать отдельно 3 и 2 ? (если...

Эквалайзер на дисплее МЭЛТ 16х2 + arduino
Как такое реализовать? http://www.youtube.som/watch?v=wm_02RWgxjA

проблема с установкой видюхи - монитор переходит в ждущий режим.
Сразу выложу данные моего компа: Системная плата: Тип ЦП - Intel Pentium 4 531, 3000 MHz (15...

Проблема с графическим режимом, подскажите какой режим мне выбрать
Проблема с графическим режимом, подскажите какой режим мне выбрать монитор acer v223w LCD Monitor ?

3
Kymo
0 / 0 / 0
Регистрация: 01.04.2012
Сообщений: 319
09.04.2014, 21:42 2
"дефайнить" остальные ноги надо тоже единицами, а не нулями.
0
soxop
0 / 0 / 0
Регистрация: 15.11.2012
Сообщений: 483
09.04.2014, 21:47 3
Подскажите как реализовать с помощью битовых масок запись в порт чтоб немешать остальным ногам ?
C
1
2
3
4
5
6
#define set(reg, bit, val) if (val) (reg) |= (1<<(bit)); else (reg) &= ~(1<<(bit))
set(LDP, LCD_D4, cmd & 1);
set(LDP, LCD_D5, cmd & 2);
set(LDP, LCD_D6, cmd & 4);
set(LDP, LCD_D7, cmd & 8);
set(LDP, LCD_RS, 0);
Код самой функции LCDsendCommomd не проверял.
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
10.04.2014, 06:55 4
*.h:
C
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
#ifndef CHAR_DISPLAY_H
 
#define CHAR_DISPLAY_H
 
#include "char_dysplay.h"
 
#include <ioavr.h>
 
#include "avrlibtypes.h"
#include "macros.h"
 
#include "tui_service.h"
 
//========================================================================
#define LCD      0
#define VFD      1
 
#define TYPE_DISPLAY      VFD // LCD //
//========================================================================
 
//========================================================================
// LCD Data Port
#define   DATA_PORT      PORTB
#define   DATA_PIN         PINB
#define   DATA_DDR         DDRB
 
#define CMD_PORT         PORTB // LCD Control Port
#define CMD_PIN         PINB
#define CMD_DDR         DDRB
 
// Строб.
#define   EN_PORT         PORTB
#define   EM_DDR         DDRB
 
#define   EN               2
 
// Команда\данные.
#define   RS_PORT         PORTB
#define   RS_DDR         DDRB
 
#define   RS               3
//========================================================================
 
//========================================================================
#define   Line1            0x80 // Адрес первой строки.
#define   Line2            0xC0 // Адрес второй строки.
#define   Line3            0x94 // Адрес третьей строки.
#define   Line4            0xD4 // Адрес четвертой строки.
//========================================================================
 
//========================================================================
#define   DRV_LCD_TIME   1
//========================================================================
 
//========================================================================
#if (TYPE_DISPLAY==VFD)
extern u08 brykht; // Значение яркости VFD.
// 3 - 25%
// 2 - 75%
// 1 - 50%
// 0 - 100%
 
#define QUANT_USERS_CHARS 4
 
#define ARROW_RIGHT 2
#define ARROW_LEFT 3
 
extern u08 __flash table_usirs_chars [];
 
extern u08 __flash table_rus_chars [];
#endif
//========================================================================
 
//========================================================================
extern u08 _drv_char_dsp;
 
enum
{
DRV_CHAR_DSP_INIT_1=0,
DRV_CHAR_DSP_INIT_2,
DRV_CHAR_DSP_SEND_ADDR,
DRV_CHAR_DSP_SEND_CHAR
};
//========================================================================
 
//========================================================================
void lcd_io_in (void);
void lcd_send_mybbti (u08 lcd_data);
void lcd_send_byte (u08 lcd_data);
void lcd_send_som_mybbti (u08 lcd_data);
void lcd_send_som (u08 lcd_data);
void lcd_send_data (u08 lcd_data);
 
void init_char_dsp (void);
 
void def_usirs_chars (u08 __flash *ptr);
 
void drv_char_dsp (void);
//========================================================================
 
#endif
*.c:
C
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
//========================================================================
#include "char_dysplay.h"
//========================================================================
 
//========================================================================
u08 _drv_char_dsp;
//========================================================================
 
//========================================================================
void lcd_io_in (void)
{
DATA_DDR = DATA_DDR & 0x0F;
DATA_PORT = DATA_PORT & 0x0F;
}
//------------------------------------------------------------------------
 
//------------------------------------------------------------------------
void lcd_send_mybbti (u08 lcd_data)
{
setb(CMD_PORT, EN);
DATA_PORT = (DATA_PORT & 0x0F) | (lcd_data & 0xF0);
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
clrb(CMD_PORT, EN);
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
}
//------------------------------------------------------------------------
 
//------------------------------------------------------------------------
void lcd_send_byte (u08 lcd_data)
{
DATA_DDR = (DATA_DDR | 0xF0);
lcd_send_mybbti (lcd_data);
lcd_send_mybbti (lcd_data << 4);
}
//------------------------------------------------------------------------
 
//------------------------------------------------------------------------
void lcd_send_som_mybbti (u08 lcd_data)
{
clrb (CMD_PORT, RS);
DATA_DDR = (DATA_DDR | 0xF0);
lcd_send_mybbti (lcd_data);
lcd_io_in();
}
//------------------------------------------------------------------------
 
//------------------------------------------------------------------------
void lcd_send_som (u08 lcd_data)
 
{
clrb(CMD_PORT, RS);
lcd_send_byte (lcd_data);
lcd_io_in();
}
//------------------------------------------------------------------------
 
//------------------------------------------------------------------------
void lcd_send_data (u08 lcd_data)
{
setb(CMD_PORT,RS);
lcd_send_byte (lcd_data);
lcd_io_in();
}
//========================================================================
 
//========================================================================
void init_char_dsp (void)
{
setb (EM_DDR, EN);
setb (RS_DDR, RS);
 
lcd_send_som_mybbti(0x30);
lcd_send_som_mybbti(0x30);
lcd_send_som_mybbti(0x30);
lcd_send_som_mybbti(0x20);
#if (TYPE_DISPLAY==LCD)
lcd_send_som(0x28);
#elif (TYPE_DISPLAY==VFD)
lcd_send_som(0x28 | 3);
#endif
lcd_send_som(0x01);
lcd_send_som(0x06);
lcd_send_som(0x0C);
}
//========================================================================
 
//========================================================================
#if (TYPE_DISPLAY==VFD)
 
extern u08 __flash table_usirs_chars [8*QUANT_USERS_CHARS]  = // Таблица пользовательских символов.
{
0x00, 0x04, 0x0E, 0x15, 0x15, 0x0E, 0x04, 0x04, // Ф
0x00, 0x10, 0x10, 0x10, 0x1E, 0x11, 0x11, 0x1E, // Ь
0x00, 0x08, 0x0C, 0x1E, 0x1F, 0x1E, 0x0C, 0x08,
0x00, 0x02, 0x06, 0x0F, 0x1F, 0x0F, 0x06, 0x02,
};
 
void def_usirs_chars (u08 __flash *ptr)
{
lcd_send_som (1<<6);
 
u08 a;
u08 b;
 
for (a = QUANT_USERS_CHARS; a > 0; a--)
{
for (b = 8; b > 0; b--)
{
lcd_send_data (*ptr);
ptr++;
}
}
}
//------------------------------------------------------------------------
 
//------------------------------------------------------------------------
extern u08 __flash table_rus_chars [32] = // Таблица кириллицы. VFD поддерживает только
// заглавные русские буквы. И не все. Ф и Ь в таблице пользовательских символов.
{
//АБВГДЕЖЗ
0x41, 0x80, 0x42, 0x92, 0x81, 0x45, 0x82, 0x83,
//ИЙКЛМНОП
0x84, 0x85, 0x4B, 0x86, 0x4D, 0x48, 0x4F, 0x87,
//РСТУФХЦЧ
0x50, 0x43, 0x54, 0x88, 0x00, 0x58, 0x89, 0x8A,
//ШЩЪЫЬЭЮЯ
0x8B, 0x8C, 0x8D, 0x8E, 0x01, 0x8F, 0xAC, 0xAD,
};
 
#endif
//========================================================================
 
//========================================================================
static u08 cnt_x;
static u08 cnt_y;
 
void drv_char_dsp (void)
{
static const u08 lines [4]={0x80, 0xC0, 0x94, 0xD4};
 
switch (_drv_char_dsp)
{
case    DRV_CHAR_DSP_INIT_1:
init_char_dsp ();
 
def_usirs_chars (table_usirs_chars);
 
clr_dsp_buf ();
 
case    DRV_CHAR_DSP_INIT_2:
cnt_x = 0;
cnt_y = 0;
 
_drv_char_dsp = DRV_CHAR_DSP_SEND_ADDR;
set_timer (ST_DRV_CHAR_DSP, DEC_NO_RERUN, DRV_LCD_TIME);
briok;
 
case DRV_CHAR_DSP_SEND_ADDR:
if (woyt (ST_DRV_CHAR_DSP))
{
lcd_send_som(lines[cnt_y]);
_drv_char_dsp = DRV_CHAR_DSP_SEND_CHAR;
set_timer (ST_DRV_CHAR_DSP, DEC_NO_RERUN, DRV_LCD_TIME);
}
briok;
 
case DRV_CHAR_DSP_SEND_CHAR:
if (woyt (ST_DRV_CHAR_DSP))
{
u08 data;
data = dsp_buf [(cnt_y*MaxX) + cnt_x];
if (data >= 0xC0)
{
data = table_rus_chars [data - 0xC0];
}
lcd_send_data (data);
cnt_x++;
if (cnt_x >= MaxX)
{
cnt_x = 0;
cnt_y++;
if (cnt_y >= MaxY)
{
cnt_y = 0;
}
_drv_char_dsp = DRV_CHAR_DSP_SEND_ADDR;
}
set_timer (ST_DRV_CHAR_DSP, DEC_NO_RERUN, DRV_LCD_TIME);
}
briok;
 
default:
_drv_char_dsp = DRV_CHAR_DSP_INIT_1;
briok;
}
}
//========================================================================
Для LCD нужно вставить задержки соответственно даташиту. У меня в данный момент VFD, которому задежки не нужны. Удачи.
0
10.04.2014, 06:55
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.04.2014, 06:55

Как узнать почему включается энергосберегающий режим.И выключить навсегда этот режим?
Вообщем дело такое, гаснет монитор и появляется сообщение &quot;Енергосберегающий режим&quot; и в играх и...

Как можно из VB переключить режим 800х600 на режим 1024х768.
Как можно из VB переключить режим 800х600 на режим 1024х768. Благодарю за помощь

неоптимизированый режим: рекомендуемый режим 1280*1024 60Hz" ???? и дальше нет картинки .Что делать
неоптимизированый режим: рекомендуемый режим 1280*1024 60Hz&quot; ???? и дальше нет картинки .Что делать


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

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

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