von
kremsy (Gast)
12.05.2012 19:32
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.
von
kremsy (Gast)
12.05.2012 21:20
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.
von
kremsy (Gast)
12.05.2012 22:04
Wenn ich die Funktionen alle in die Mainpacke, funktioniert das mit dem
Systik aufjedenfall, alles wird bis zum ende durchgelaufen, nur am
Display tut sich gar nichts.
von
kremsy (Gast)
13.05.2012 12:30
Hier die Beschaltung des Displays.
von
kremsy (Gast)
13.05.2012 19:17
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.
von
kremsy (Gast)
14.05.2012 17:33
von
kremsy (Gast)
14.05.2012 18:14
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.
von
kremsy (Gast)
14.05.2012 18:23
von
kremsy (Gast)
14.05.2012 19:59
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 }
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: L6200 E: 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?
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?
von
kremsy (Gast)
01.06.2012 15:19
Ivan, den code hier nicht nehmen, sondern den vom anderen Thread.
kremsy schrieb:
> Ivan, den code hier nicht nehmen, sondern den vom anderen Thread.
danke, für alle: Beitrag "Delay Funktion für STM32 Board?"
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.