Displaytech 162 an STM32DiscoveryF3 (Cortex M3)

Gast #2673725
Lesenswert?

Hallo Leute,

Ich versuche ein LCD-Display im 8-Bit Modus am STM32 zum laufen zum 
Bringen.

Initialisierungsroutine:
1
#include "stm32f10x.h"
2
#include <stdio.h>
3

4
extern int32_t SysTickCnt;
5

6
volatile unsigned long TimeTick;
7

8
/*------------------------------------------------------------------------------
9
  Delay function
10
  delays number of tick Systicks (happens every 10 ms)
11
*------------------------------------------------------------------------------*/
12
static void Delay (unsigned long tick)
13
{
14
    unsigned long timetick;
15

16
    timetick = TimeTick;
17
    while ((TimeTick - timetick) < tick);
18
}
19

20
static void LCD_RS(uint8_t val)           // RS ... register select
21
{
22
  if(val)   GPIO_SetBits  (GPIOB, GPIO_Pin_0);
23
  else     GPIO_ResetBits(GPIOB, GPIO_Pin_0);
24
}
25

26

27
static void LCD_RW(uint8_t val)           // RW ... read/write
28
{
29
  if(val)   GPIO_SetBits  (GPIOC, GPIO_Pin_5);
30
  else     GPIO_ResetBits(GPIOC, GPIO_Pin_5);
31
}
32

33

34
static void LCD_E(uint8_t val)             // E ... enable
35
{
36
  if(val)   GPIO_SetBits  (GPIOC, GPIO_Pin_4);
37
  else     GPIO_ResetBits(GPIOC, GPIO_Pin_4);
38
}
39

40
static void LCD_Data(uint8_t val)             // E ... enable
41
{
42
     GPIOA->BSRR=0xFFFFFF;
43
  if(val)   GPIOA->BSRR=val;
44

45
}
46

47
void LCD_Init(void)
48
{
49
  GPIO_InitTypeDef  GPIO_InitStruct;
50
  int32_t SysTickCntHold;
51

52
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
53
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);
54
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE);
55

56
    GPIO_InitStruct.GPIO_Pin    =  GPIO_Pin_0;      // Konfig. LED an PC8
57
  GPIO_InitStruct.GPIO_Speed  =  GPIO_Speed_10MHz;
58
  GPIO_InitStruct.GPIO_Mode    =  GPIO_Mode_Out_OD;
59
  GPIO_Init(GPIOB, &GPIO_InitStruct);
60

61
    GPIO_InitStruct.GPIO_Pin    =  GPIO_Pin_4|GPIO_Pin_5;      // Konfig. LED an PC8
62
  GPIO_InitStruct.GPIO_Speed  =  GPIO_Speed_10MHz;
63
  GPIO_InitStruct.GPIO_Mode    =  GPIO_Mode_Out_OD;
64
  GPIO_Init(GPIOC, &GPIO_InitStruct);
65

66
    GPIO_InitStruct.GPIO_Pin    = GPIO_Pin_All;      // Datenports Display
67
  GPIO_InitStruct.GPIO_Speed  =  GPIO_Speed_10MHz;
68
  GPIO_InitStruct.GPIO_Mode    =  GPIO_Mode_Out_OD;
69
  GPIO_Init(GPIOA, &GPIO_InitStruct);
70

71
  GPIO_ResetBits(GPIOB, GPIO_Pin_0);
72
  GPIO_ResetBits(GPIOC, GPIO_Pin_4 | GPIO_Pin_5);
73
  GPIO_ResetBits(GPIOA, GPIO_Pin_All);
74

75
  LCD_RW(0);
76

77
  SysTickCntHold = SysTickCnt;  
78
  while((SysTickCnt - SysTickCntHold ) < 16 );   // wait ca. 15ms
79

80
  GPIO_SetBits (GPIOA, GPIO_Pin_4|GPIO_Pin_5);
81
  //Delay(1);
82

83
  LCD_E(1);
84
  Delay(1);  //SET_TO 8-Bit (1/3)
85
  LCD_E(0);
86

87
  SysTickCntHold = SysTickCnt;  
88
  while((SysTickCnt - SysTickCntHold ) < 5 );   // wait ca. 4.2ms
89

90
   LCD_E(1);
91
  Delay(1);  //SET_TO 8-Bit (2/3)
92
  LCD_E(0);
93

94
  SysTickCntHold = SysTickCnt;  
95
  while((SysTickCnt - SysTickCntHold ) < 2 );   // wait ca. 110us
96

97
   LCD_E(1);
98
  Delay(1);  //SET_TO 8-Bit (3/3)
99
  LCD_E(0);
100

101
  Delay(1);
102

103
   LCD_E(1);
104
  Delay(1);   //SET_TO 8-Bit (4/3)
105
  LCD_E(0);
106

107
   Delay(1);
108

109
   GPIO_ResetBits (GPIOA, GPIO_Pin_All);
110
   GPIO_SetBits (GPIOA, GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5);  //2-Line Display
111
     LCD_E(1);
112
  Delay(1);
113
  LCD_E(0);
114

115
   Delay(1);
116

117
   GPIO_ResetBits (GPIOA, GPIO_Pin_All);
118
   GPIO_SetBits (GPIOA, GPIO_Pin_3);  //Display off
119
     LCD_E(1);
120
  Delay(1);
121
  LCD_E(0);
122

123
   Delay(1);
124

125
   GPIO_ResetBits (GPIOA, GPIO_Pin_All);
126
   GPIO_SetBits (GPIOA, GPIO_Pin_0);  //Delete Display
127
     LCD_E(1);
128
  Delay(1);
129
  LCD_E(0);
130

131
   Delay(1);
132

133
   GPIO_ResetBits (GPIOA, GPIO_Pin_All);
134
   GPIO_SetBits (GPIOA, GPIO_Pin_1|GPIO_Pin_2);  //Cursor Right
135
     LCD_E(1);
136
  Delay(1);
137
  LCD_E(0);
138

139
   Delay(1);
140

141
   GPIO_ResetBits (GPIOA, GPIO_Pin_All);
142
   GPIO_SetBits (GPIOA, GPIO_Pin_2|GPIO_Pin_3);  //Display On
143
     LCD_E(1);
144
  Delay(1);
145
  LCD_E(0);
146

147
//beginn
148
   Delay(1);
149

150
   GPIO_ResetBits (GPIOA, GPIO_Pin_All);
151
   GPIO_SetBits (GPIOA, GPIO_Pin_0);  //Delete Display
152
     LCD_E(1);
153
  Delay(1);
154
  LCD_E(0);
155

156

157
   Delay(1);
158

159
   GPIO_ResetBits (GPIOA, GPIO_Pin_All);
160
   GPIO_SetBits (GPIOA, GPIO_Pin_0|GPIO_Pin_3);  //Blink Cursor
161
     LCD_E(1);
162
  Delay(1);
163
  LCD_E(0);
164

165

166
}

Delay(1) ist ein Delay von ca 10ms, nur zum Testen.

Display D0 = PortA0 - D7=PortA7


Leider macht das Display garnichts, außer dass der Hintergrund ist und 
die Rechtecke in einer Zeile angezeigt werden (Industriestandart).

Vielleicht habt ihr eine Idee.
Gast #2673825
Lesenswert?

Das Problem wurde nun etwas eingeschränkt, anscheinend funtkioniert der 
Systick Timer nicht richtig.
1
#include "stm32f10x.h"
2
#include <stdio.h>
3
#include "lcd.h"
4

5

6
volatile int32_t SysTickCnt=0;
7
int32_t SysTickCntHold;  
8

9
void SysTick_Handler(void)
10
{
11
  SysTickCnt++;
12
}
13

14
int main(void)
15
{
16
  RCC_ClocksTypeDef   Clocks;
17
  GPIO_InitTypeDef   GPIO_InitStruct;
18
  RCC_GetClocksFreq(&Clocks);
19
  SysTick_Config( Clocks.HCLK_Frequency/1000 - 1 );  // 1000 Hz ( T=1ms)
20

21

22
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE);
23

24

25

26
    GPIO_InitStruct.GPIO_Pin    =  GPIO_Pin_8|GPIO_Pin_9;      // Konfig. LED an PC8
27
  GPIO_InitStruct.GPIO_Speed  =  GPIO_Speed_10MHz;
28
  GPIO_InitStruct.GPIO_Mode    =  GPIO_Mode_Out_PP;
29
  GPIO_Init(GPIOC, &GPIO_InitStruct);
30

31

32
  GPIO_SetBits(GPIOC, GPIO_Pin_8);
33

34

35
  SysTickCntHold = SysTickCnt;  
36
  while((SysTickCnt - SysTickCntHold ) < 16 );   // wait ca. 15ms
37
   GPIO_ResetBits(GPIOC, GPIO_Pin_8);
38
  LCD_Init();
39

40
  while(1)
41
  {
42
  }
43
}

Hier im Main Funktioniert der Systick-Timer ohne Probleme.


In der Datei lcd.c (code oben)

extern int32_t SysTickCnt;



void LCD_Init(void)
{
  GPIO_InitTypeDef  GPIO_InitStruct;
  int32_t SysTickCntHold;

  GPIO_ResetBits(GPIOC, GPIO_Pin_8);
  SysTickCntHold = SysTickCnt;
  while((SysTickCnt - SysTickCntHold ) < 16 );   // wait ca. 15ms

   GPIO_SetBits(GPIOC, GPIO_Pin_9);
...


Hängt sich der Prozessor anscheiend bei der While Schleife auf.
Gast #2674958
Lesenswert?

Hier nun der aktuelle Code in der main.c
1
#include "stm32f10x.h"
2
#include <stdio.h>
3
//#include "lcd.h"
4

5
void Delay (unsigned long tick);
6
void LCD_Init(void);
7
void LCD_SetPrintPosition(unsigned int ln, unsigned int col);       // line 0...1  column 0...15
8
volatile int32_t SysTickCnt=0;
9
int32_t SysTickCntHold;  
10

11
void SysTick_Handler(void)
12
{
13
  SysTickCnt++;
14
}
15

16

17
int main(void)
18
{
19
  RCC_ClocksTypeDef   Clocks;
20
  GPIO_InitTypeDef   GPIO_InitStruct;
21
  RCC_GetClocksFreq(&Clocks);
22
  SysTick_Config( Clocks.HCLK_Frequency/1000 - 1 );  // 1000 Hz ( T=1ms)
23

24

25
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE);
26

27

28

29
    GPIO_InitStruct.GPIO_Pin    =  GPIO_Pin_8|GPIO_Pin_9;      // TESTLEDS
30
  GPIO_InitStruct.GPIO_Speed  =  GPIO_Speed_10MHz;
31
  GPIO_InitStruct.GPIO_Mode    =  GPIO_Mode_Out_PP;
32
  GPIO_Init(GPIOC, &GPIO_InitStruct);
33

34

35
  GPIO_SetBits(GPIOC, GPIO_Pin_8);
36

37

38
  Delay(10);
39
   GPIO_ResetBits(GPIOC, GPIO_Pin_8);
40
  LCD_Init();
41

42
  while(1)
43
  {
44
  }
45
}
46

47

48

49
void Delay (unsigned long tick)
50
{  
51
   // unsigned long timetick;
52

53
   // timetick = TimeTick;
54
   // while ((TimeTick - timetick) < tick);
55
  int32_t SysTickCntHold;
56
     SysTickCntHold = SysTickCnt;  
57
  while((SysTickCnt - SysTickCntHold ) < tick );   // wait ca. 110us
58
}
59

60
static void LCD_RS(uint8_t val)           // RS ... register select
61
{
62
  if(val)   GPIO_SetBits  (GPIOB, GPIO_Pin_0);
63
  else     GPIO_ResetBits(GPIOB, GPIO_Pin_0);
64
}
65

66

67
static void LCD_RW(uint8_t val)           // RW ... read/write
68
{
69
  if(val)   GPIO_SetBits  (GPIOC, GPIO_Pin_5);
70
  else     GPIO_ResetBits(GPIOC, GPIO_Pin_5);
71
}
72

73

74
static void LCD_E(uint8_t val)             // E ... enable
75
{
76
  if(val)   GPIO_SetBits  (GPIOC, GPIO_Pin_4);
77
  else     GPIO_ResetBits(GPIOC, GPIO_Pin_4);
78
}
79

80
static void LCD_Data(uint8_t val)             // E ... enable
81
{
82
     GPIOA->BSRR=0xFFFFFF;
83
  if(val)   GPIOA->BSRR=val;
84

85
}
86

87
void LCD_Init(void)
88
{
89
  GPIO_InitTypeDef  GPIO_InitStruct;
90
  int32_t SysTickCntHold;
91

92
  GPIO_SetBits(GPIOC, GPIO_Pin_9);
93
Delay(15);
94

95
   GPIO_ResetBits(GPIOC, GPIO_Pin_9);
96

97
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
98
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);
99
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE);
100

101
    GPIO_InitStruct.GPIO_Pin    =  GPIO_Pin_0;      // RS
102
  GPIO_InitStruct.GPIO_Speed  =  GPIO_Speed_10MHz;
103
  GPIO_InitStruct.GPIO_Mode    =  GPIO_Mode_Out_OD;
104
  GPIO_Init(GPIOB, &GPIO_InitStruct);
105

106
    GPIO_InitStruct.GPIO_Pin    =  GPIO_Pin_4|GPIO_Pin_5;    //En and R/W
107
  GPIO_InitStruct.GPIO_Speed  =  GPIO_Speed_10MHz;
108
  GPIO_InitStruct.GPIO_Mode    =  GPIO_Mode_Out_OD;
109
  GPIO_Init(GPIOC, &GPIO_InitStruct);
110

111
    GPIO_InitStruct.GPIO_Pin    = GPIO_Pin_All;      // Datenports Display
112
  GPIO_InitStruct.GPIO_Speed  =  GPIO_Speed_10MHz;
113
  GPIO_InitStruct.GPIO_Mode    =  GPIO_Mode_Out_OD;
114
  GPIO_Init(GPIOA, &GPIO_InitStruct);
115

116
  GPIO_ResetBits(GPIOB, GPIO_Pin_0);
117
  GPIO_ResetBits(GPIOC, GPIO_Pin_4 | GPIO_Pin_5);
118
  GPIO_ResetBits(GPIOA, GPIO_Pin_All);
119
     
120
   
121

122
  LCD_RW(0);
123
    GPIO_SetBits(GPIOC, GPIO_Pin_9);
124
  SysTickCntHold = SysTickCnt;  
125
  while((SysTickCnt - SysTickCntHold ) < 16 );   // wait ca. 15ms
126
GPIO_ResetBits(GPIOC, GPIO_Pin_8);
127

128
  GPIO_SetBits (GPIOA, GPIO_Pin_4|GPIO_Pin_5);
129
  //Delay(1);
130

131
  LCD_E(1);
132
  Delay(1);  //SET_TO 8-Bit (1/3)
133
  LCD_E(0);
134

135
  SysTickCntHold = SysTickCnt;  
136
  while((SysTickCnt - SysTickCntHold ) < 5 );   // wait ca. 4.2ms
137

138
   LCD_E(1);
139
  Delay(1);  //SET_TO 8-Bit (2/3)
140
  LCD_E(0);
141

142
  SysTickCntHold = SysTickCnt;  
143
  while((SysTickCnt - SysTickCntHold ) < 2 );   // wait ca. 110us
144

145
   LCD_E(1);
146
  Delay(1);  //SET_TO 8-Bit (3/3)
147
  LCD_E(0);
148

149
  Delay(1);
150

151
   LCD_E(1);
152
  Delay(1);   //SET_TO 8-Bit (4/3)
153
  LCD_E(0);
154

155
   Delay(1);
156

157
   GPIO_ResetBits (GPIOA, GPIO_Pin_All);
158
   GPIO_SetBits (GPIOA, GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5);  //2-Line Display
159
     LCD_E(1);
160
  Delay(1);
161
  LCD_E(0);
162

163
   Delay(1);
164

165
   GPIO_ResetBits (GPIOA, GPIO_Pin_All);
166
   GPIO_SetBits (GPIOA, GPIO_Pin_3);  //Display off
167
     LCD_E(1);
168
  Delay(1);
169
  LCD_E(0);
170

171
   Delay(1);
172

173
   GPIO_ResetBits (GPIOA, GPIO_Pin_All);
174
   GPIO_SetBits (GPIOA, GPIO_Pin_0);  //Delete Display
175
     LCD_E(1);
176
  Delay(1);
177
  LCD_E(0);
178

179
   Delay(1);
180

181
   GPIO_ResetBits (GPIOA, GPIO_Pin_All);
182
   GPIO_SetBits (GPIOA, GPIO_Pin_1|GPIO_Pin_2);  //Cursor Right
183
     LCD_E(1);
184
  Delay(1);
185
  LCD_E(0);
186

187
   Delay(1);
188

189
   GPIO_ResetBits (GPIOA, GPIO_Pin_All);
190
   GPIO_SetBits (GPIOA, GPIO_Pin_2|GPIO_Pin_3);  //Display On
191
     LCD_E(1);
192
  Delay(1);
193
  LCD_E(0);
194

195
//beginn
196
   Delay(1);
197

198
   GPIO_ResetBits (GPIOA, GPIO_Pin_All);
199
   GPIO_SetBits (GPIOA, GPIO_Pin_0);  //Delete Display
200
     LCD_E(1);
201
  Delay(1);
202
  LCD_E(0);
203

204

205
   Delay(1);
206

207
   GPIO_ResetBits (GPIOA, GPIO_Pin_All);
208
   GPIO_SetBits (GPIOA, GPIO_Pin_0|GPIO_Pin_3);  //Blink Cursor
209
     LCD_E(1);
210
  Delay(1);
211
  LCD_E(0);
212
      
213
    GPIO_ResetBits(GPIOC, GPIO_Pin_9);        
214
}

Und das Display macht wie gesagt gar nichts, außer der Hintergrund und 
die erste Zeile bei der alle Punkte leuchten.
Gast #2676110
Lesenswert?

Hab die Ausgänge jetzt auf Push-Pull gestellt, das Display initialisiert 
wohl nun erfolgreich, aber angezeigt bekomm ich noch nichts.
1
//beginn
2
   Delay(1); 
3
    GPIO_ResetBits (GPIOA, GPIO_Pin_All);
4
   GPIO_SetBits (GPIOA, GPIO_Pin_7);  //DD-Ram
5
     LCD_E(1);
6
  Delay(1);
7
  LCD_E(0);
8
   
9
   Delay(1);
10

11
   GPIO_ResetBits (GPIOA, GPIO_Pin_All);
12
   GPIO_SetBits (GPIOA, GPIO_Pin_0);  //Delete Display
13
     LCD_E(1);
14
  Delay(1);
15
  LCD_E(0);
16

17

18
   Delay(1);
19

20
   GPIO_ResetBits (GPIOA, GPIO_Pin_All);
21
   GPIO_SetBits (GPIOA, GPIO_Pin_0|GPIO_Pin_3);  //Blink Cursor
22
     LCD_E(1);
23
  Delay(1);
24
  LCD_E(0);
25

26
   Delay(1);
27
   GPIO_ResetBits (GPIOA, GPIO_Pin_All);
28
   GPIO_SetBits (GPIOA, GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_3);  //Blink Cursor
29
     LCD_E(1);
30
  Delay(1);
31
  LCD_E(0);
32

33
   Delay(1);        
34
      
35

36
   GPIO_ResetBits (GPIOA, GPIO_Pin_All);
37
   GPIO_SetBits (GPIOA, GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);  //W
38
   GPIO_SetBits (GPIOA, GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);   
39
   LCD_RS(1);
40
      LCD_E(1);
41
  Delay(1);
42
  LCD_E(0);

Will nur einen Buchstaben anzeigen lassen.
Gast #2676224
Lesenswert?

Falls es jemand interessiert, hier ist der Funktionierende Code:
1
#include "stm32f10x.h"
2
#include <stdio.h>
3
//#include "lcd.h"
4

5
void Delay (unsigned long tick);
6
void LCD_Init(void);
7
static void LCD_Data(uint8_t val);
8
static void lcd_string( const char *data );
9
void lcd_setcursor( uint8_t x, uint8_t y );
10
//void LCD_SetPrintPosition(unsigned int ln, unsigned int col);       // line 0...1  column 0...15
11
volatile int32_t SysTickCnt=0;
12
int32_t SysTickCntHold;  
13

14
void SysTick_Handler(void)
15
{
16
  SysTickCnt++;
17
}
18

19

20
int main(void)
21
{
22
  RCC_ClocksTypeDef   Clocks;
23
  GPIO_InitTypeDef   GPIO_InitStruct;
24
  RCC_GetClocksFreq(&Clocks);
25
  SysTick_Config( Clocks.HCLK_Frequency/1000 - 1 );  // 1000 Hz ( T=1ms)
26

27

28
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE);
29

30

31

32
    GPIO_InitStruct.GPIO_Pin    =  GPIO_Pin_8|GPIO_Pin_9;      // TESTLEDS
33
  GPIO_InitStruct.GPIO_Speed  =  GPIO_Speed_10MHz;
34
  GPIO_InitStruct.GPIO_Mode    =  GPIO_Mode_Out_PP;
35
  GPIO_Init(GPIOC, &GPIO_InitStruct);
36

37
  LCD_Init();
38

39
   LCD_Data('H');
40
  LCD_Data('A');
41
   LCD_Data('L');
42
  LCD_Data('L');
43
  LCD_Data('O');
44
  lcd_string(" POOL 38°C");  
45

46
  lcd_setcursor(5,2);
47
  lcd_string(" TEST");  
48

49
  while(1)
50
  {
51
  }
52
}
53

54
/*******************************************************************************
55
* Function Name  : EXTI9_5_IRQHandler
56
* Description    : This function handles External lines 9 to 5 interrupt request.
57
* Input          : None
58
* Output         : None
59
* Return         : None
60
*******************************************************************************/
61

62
void EXTI0_IRQHandler(void)
63
{
64
  if(EXTI_GetITStatus(EXTI_Line0) != RESET) //EXTI_Line 0 hat ausgeloest?
65
  {
66

67
    EXTI_ClearITPendingBit(EXTI_Line0);
68
  }
69
}
70

71
void TIM3_IRQHandler (void)
72
{  
73
  TIM_ClearFlag(TIM3, TIM_FLAG_Update);  
74
}
75

76

77
void Delay (unsigned long tick)
78
{  
79
  int32_t SysTickCntHold;
80
     SysTickCntHold = SysTickCnt;  
81
  while((SysTickCnt - SysTickCntHold ) <= tick );   // wait ca. 110us
82
}
83

84
static void LCD_RS(uint8_t val)           // RS ... register select
85
{
86
  if(val)   GPIO_SetBits  (GPIOB, GPIO_Pin_0);
87
  else     GPIO_ResetBits(GPIOB, GPIO_Pin_0);
88
}
89

90

91
static void LCD_RW(uint8_t val)           // RW ... read/write
92
{
93
  if(val)   GPIO_SetBits  (GPIOC, GPIO_Pin_5);
94
  else     GPIO_ResetBits(GPIOC, GPIO_Pin_5);
95
}
96

97

98
static void LCD_E(uint8_t val)             // E ... enable
99
{
100
  if(val){
101
    GPIO_SetBits  (GPIOC, GPIO_Pin_4);
102
    Delay(1);  //SET_TO 8-Bit (1/3)
103
      GPIO_ResetBits(GPIOC, GPIO_Pin_4);
104
  }
105
  else GPIO_ResetBits(GPIOC, GPIO_Pin_4);
106
}
107

108
static void LCD_Data(uint8_t val)             // E ... enable
109
{
110
   GPIO_ResetBits (GPIOA, GPIO_Pin_All);
111
  if(val)   GPIOA->BSRR=val;
112
     LCD_E(1);
113

114
}
115

116
// Schreibt einen String auf das LCD
117
 
118
static void lcd_string( const char *data )
119
{
120
    while( *data != '\0' )
121
        LCD_Data( *data++ );
122
}
123

124

125
// Setzt den Cursor in Spalte x (0..15) Zeile y (1..2) 
126
 
127
void lcd_setcursor( uint8_t x, uint8_t y )
128
{
129
    uint8_t data;
130
 
131
    switch (y)
132
    {
133
        case 1:    // 1. Zeile
134
            data = 0x80 + 0x00 + x;
135
            break;
136
 
137
        case 2:    // 2. Zeile
138
            data = 0x80 + 0x40 + x;
139
            break;
140
        default:
141
            return;                                   // für den Fall einer falschen Zeile
142
    }
143
    LCD_RS(0);
144
    LCD_Data( data );
145
  LCD_RS(1);
146
}
147

148
void LCD_Init(void)
149
{
150
  GPIO_InitTypeDef  GPIO_InitStruct;
151

152
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
153
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);
154
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE);
155

156
    GPIO_InitStruct.GPIO_Pin    =  GPIO_Pin_0;      // RS
157
  GPIO_InitStruct.GPIO_Speed  =  GPIO_Speed_10MHz;
158
  GPIO_InitStruct.GPIO_Mode    =  GPIO_Mode_Out_PP;
159
  GPIO_Init(GPIOB, &GPIO_InitStruct);
160

161
    GPIO_InitStruct.GPIO_Pin    =  GPIO_Pin_4|GPIO_Pin_5;    //En and R/W
162
  GPIO_InitStruct.GPIO_Speed  =  GPIO_Speed_10MHz;
163
  GPIO_InitStruct.GPIO_Mode    =  GPIO_Mode_Out_PP;
164
  GPIO_Init(GPIOC, &GPIO_InitStruct);
165

166
    GPIO_InitStruct.GPIO_Pin    = GPIO_Pin_All;      // Datenports Display
167
  GPIO_InitStruct.GPIO_Speed  =  GPIO_Speed_10MHz;
168
  GPIO_InitStruct.GPIO_Mode    =  GPIO_Mode_Out_PP;
169
  GPIO_Init(GPIOA, &GPIO_InitStruct);
170

171
  GPIO_ResetBits(GPIOB, GPIO_Pin_0);
172
  GPIO_ResetBits(GPIOC, GPIO_Pin_4 | GPIO_Pin_5);
173
  GPIO_ResetBits(GPIOA, GPIO_Pin_All);
174
     
175
  /* DISPLAY INITIALISATION */
176
  LCD_RW(0);
177

178
  Delay(15);  //wait ca 15ms
179
  LCD_Data(0x30);    //SET_TO 8-Bit (1/4)
180
  Delay(5);  //wait more than 4,2ms
181
  LCD_Data(0x30);    //SET_TO 8-Bit (2/4)
182
  Delay(1);  //wait more than 110us
183
  LCD_Data(0x30);    //SET_TO 8-Bit (3/4)
184
  LCD_Data(0x30);    //SET_TO 8-Bit (4/4)
185
   
186
  LCD_Data(0x38);    //2-Line Display
187
  LCD_Data(0x08);    //Display Off
188

189
  LCD_Data(0x01);    //Delete Display
190

191
  LCD_Data(0x03);    //Cursor Right
192

193
  LCD_Data(0x06);    //Display On
194

195
  lcd_setcursor(0,0);    //Cursor 0/0
196
   
197
   LCD_Data(0x0C);    //Display On
198

199
   LCD_RS(1);
200
     
201
}
#2698318
Lesenswert?

Hallo,
ich arbeite auch mit dem STM32 Board und dem 1602 LCD Modul.
Ich bekomm bei deinem Code allerdings den Fehler:

".\Debug\GPIOToggle.axf: Error: L6200E: Symbol SysTick_Handler multiply 
defined (by stm32f10x_it.o and main.o)."

Wenn ich die Funktion SysTick_Handler in der stm32f10x_it.c ausklammer 
(in der im Übrigen auch nichts gemacht wird), gibts kein Fehler, 
allerdings kommt beim Display nichts raus (nur der Standardbalken...)!?

Fehlt bei deinem geposteten Code noch was?
#2698368
Lesenswert?

Ich hab den Fehler gefunden:
wenn ich mein LCD Modul der Reihe nach anstecke ist DB0 PA7 zugeordnet. 
Das ist genau umgekehrt, wie bei dir...

ich hab alle "LCD_Data" Befehle beim Aufruf geswapt, dann gehts auch.

Kennt jmd einen Befehl bei stm32 mit dem man die nibbels eines bytes 
tauschen kann?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren