Advertisement
dargenn

Untitled

Mar 22nd, 2017
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.67 KB | None | 0 0
  1. //******************************************************************************
  2. // THE SOFTWARE INCLUDED IN THIS FILE IS FOR GUIDANCE ONLY.
  3. // AUTHOR SHALL NOT BE HELD LIABLE FOR ANY DIRECT, INDIRECT
  4. // OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
  5. // FROM USE OF THIS SOFTWARE.
  6. //
  7. // PROGRAM ZAWARTY W TYM PLIKU PRZEZNACZONY JEST WYLACZNIE
  8. // DO CELOW SZKOLENIOWYCH. AUTOR NIE PONOSI ODPOWIEDZIALNOSCI
  9. // ZA ZADNE EWENTUALNE, BEZPOSREDNIE I POSREDNIE SZKODY
  10. // WYNIKLE Z JEGO WYKORZYSTANIA.
  11. //******************************************************************************
  12.  
  13.  
  14. #include "stm32f10x.h"
  15. #include "lcd.h"
  16.  
  17. void GPIO_Config(void);
  18. void RCC_Config(void);
  19. void LCD_Initialize(void);
  20. void LCD_WriteData(unsigned char);
  21. GPIO_InitTypeDef GPIO_InitStructure;
  22. void LCD_WriteNibble(unsigned char);
  23.  
  24. int main(void)
  25. //konfiguracja systemu
  26. {
  27.  
  28. unsigned char tekst[18] = {"Monika Pietyszuk!"};
  29. int i = 0;
  30.  
  31. RCC_Config();
  32. GPIO_Config();
  33.  
  34. LCD_Initialize(); // Inicjalizuj LCD
  35. LCD_WriteCommand(LCD_CLEAR); // Wyczysc LCD
  36.  
  37. for (i=0; i<18; i++) // Wypisz tekst
  38. LCD_WriteData(tekst[i]);
  39.  
  40. while (1);
  41. return 0;
  42. }
  43.  
  44.  
  45. void RCC_Config(void)
  46. //konfigurowanie sygnalow taktujacych
  47. {
  48. ErrorStatus HSEStartUpStatus; //zmienna opisujaca rezultat uruchomienia HSE
  49.  
  50. RCC_DeInit(); //Reset ustawien RCC
  51. RCC_HSEConfig(RCC_HSE_ON); //Wlaczenie HSE
  52. HSEStartUpStatus = RCC_WaitForHSEStartUp(); //Odczekaj az HSE bedzie gotowy
  53. if(HSEStartUpStatus == SUCCESS)
  54. {
  55. FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//
  56. FLASH_SetLatency(FLASH_Latency_2); //ustaw zwloke dla pamieci Flash; zaleznie od taktowania rdzenia
  57. //0:<24MHz; 1:24~48MHz; 2:>48MHz
  58. RCC_HCLKConfig(RCC_SYSCLK_Div1); //ustaw HCLK=SYSCLK
  59. RCC_PCLK2Config(RCC_HCLK_Div1); //ustaw PCLK2=HCLK
  60. RCC_PCLK1Config(RCC_HCLK_Div2); //ustaw PCLK1=HCLK/2
  61. RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); //ustaw PLLCLK = HSE*9 czyli 8MHz * 9 = 72 MHz
  62. //inne przykladowe konfiguracje:
  63. //RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_9); //ustaw PLLCLK = HSI/2*9 czyli 8MHz / 2 * 9 = 36 MHz
  64. //RCC_PLLConfig(RCC_PLLSource_HSE_Div2, RCC_PLLMul_9); //ustaw PLLCLK = HSE/2*9 czyli 8MHz / 2 * 9 = 36 MHz
  65. RCC_PLLCmd(ENABLE); //wlacz PLL
  66. while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //odczekaj na poprawne uruchomienie PLL
  67. RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //ustaw PLL jako zrodlo sygnalu zegarowego
  68. while(RCC_GetSYSCLKSource() != 0x08); //odczekaj az PLL bedzie sygnalem zegarowym systemu
  69.  
  70. /*Tu nalezy umiescic kod zwiazany z konfiguracja sygnalow zegarowych potrzebnych w programie peryferiow*/
  71. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);//wlacz taktowanie portu GPIO B
  72.  
  73. } else {
  74. }
  75. }
  76.  
  77.  
  78.  
  79. void GPIO_Config(void)
  80. {
  81. //konfigurowanie portow GPIO
  82. GPIO_InitTypeDef GPIO_InitStructure;
  83.  
  84. // disable JTAG
  85. GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
  86.  
  87. /*Tu nalezy umiescic kod zwiazany z konfiguracja poszczegolnych portow GPIO potrzebnych w programie*/
  88. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 ;
  89. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  90. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  91. GPIO_Init(GPIOA, &GPIO_InitStructure);
  92. }
  93.  
  94. void LCD_Initialize(void) {
  95. unsigned int i = 0;
  96. GPIO_InitStructure.GPIO_Pin = LCD_D4|LCD_D5|LCD_D6|LCD_D7|LCD_RS|LCD_E;
  97. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  98. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  99. GPIO_Init(LCD_GPIO, &GPIO_InitStructure);
  100. for(; i < 150000; i++);
  101. LCD_WriteNibble(0x03);
  102. for(i = 0; i < 3000000; i++);
  103. LCD_WriteNibble(0x03);
  104. for(i = 0; i < 6000; i++);
  105. LCD_WriteNibble(0x03);
  106. for(i = 0; i < 6000; i++);
  107. LCD_WriteNibble(0x02);
  108. for(i = 0; i < 6000; i++);
  109. LCD_WriteCommand(LCD_FUNCTION_SET | LCD_FONT8 | LCD_TWO_LINE);
  110. for(i = 0; i < 6000; i++);
  111. LCD_WriteCommand(LCD_DISPLAY_ONOFF | LCD_DISPLAY_OFF);
  112. for(i = 0; i < 6000; i++);
  113. LCD_WriteCommand(LCD_CLEAR);
  114. for(i = 0; i < 600000; i++);
  115. LCD_WriteCommand(LCD_ENTRY_MODE
  116. | LCD_EM_INCREMENT | LCD_EM_SHIFT_CURSOR);
  117. for(i = 0; i < 6000; i++);
  118. LCD_WriteCommand(LCD_DISPLAY_ONOFF | LCD_DISPLAY_ON);
  119. }
  120.  
  121. void LCD_WriteData(unsigned char dataToWrite)
  122. {
  123. unsigned int delayCnt = 0;
  124. GPIO_WriteBit(LCD_GPIO, LCD_RS, 1);
  125. GPIO_WriteBit(LCD_GPIO, LCD_D4, dataToWrite & 0x10);
  126. GPIO_WriteBit(LCD_GPIO, LCD_D5, dataToWrite & 0x20);
  127. GPIO_WriteBit(LCD_GPIO, LCD_D6, dataToWrite & 0x40);
  128. GPIO_WriteBit(LCD_GPIO, LCD_D7, dataToWrite & 0x80);
  129. GPIO_WriteBit(LCD_GPIO, LCD_E, Bit_SET);
  130. // ustaw wysoki poziom E
  131. for(delayCnt = 0; delayCnt < 300; delayCnt++);
  132. // poczekaj troche?
  133. GPIO_WriteBit(LCD_GPIO, LCD_E, Bit_RESET);
  134. // ustaw niski poziom E
  135. GPIO_WriteBit(LCD_GPIO, LCD_D4, dataToWrite & 0x01);
  136. GPIO_WriteBit(LCD_GPIO, LCD_D5, dataToWrite & 0x02);
  137. GPIO_WriteBit(LCD_GPIO, LCD_D6, dataToWrite & 0x04);
  138. GPIO_WriteBit(LCD_GPIO, LCD_D7, dataToWrite & 0x08);
  139. GPIO_WriteBit(LCD_GPIO, LCD_E, Bit_SET);
  140. // ustaw wysoki poziom E
  141. for(delayCnt = 0; delayCnt < 300; delayCnt++);
  142. // poczekaj troche?
  143. GPIO_WriteBit(LCD_GPIO, LCD_E, Bit_RESET);
  144. // ustaw niski poziom E
  145. GPIO_WriteBit(LCD_GPIO, LCD_RS, 0);
  146. }
  147.  
  148. void LCD_WriteCommand(unsigned char commandToWrite)
  149. {
  150. volatile unsigned int delayCnt = 0;
  151. GPIO_WriteBit(LCD_GPIO, LCD_RS, Bit_RESET); // RS = 0 - komenda
  152. LCD_WriteNibble(commandToWrite >> 4); // wyslij starszy p?lbajt
  153. LCD_WriteNibble(commandToWrite & 0x0F); // wyslij mlodszy p?lbajt
  154. if (commandToWrite > 3)
  155. // w zaleznosci od komendy dobierz opóznienie
  156. for(delayCnt = 0; delayCnt < 3000; delayCnt++);
  157. else
  158. for(delayCnt = 0; delayCnt < 150000; delayCnt++);
  159. }
  160.  
  161. void LCD_WriteNibble(unsigned char nibble)
  162. {
  163. volatile unsigned int delayCnt = 0;
  164. GPIO_WriteBit(LCD_GPIO, LCD_D4, (nibble & 0x01)); // ustaw bity na liniach
  165. GPIO_WriteBit(LCD_GPIO, LCD_D5, (nibble & 0x02)); // D4 – D7
  166. GPIO_WriteBit(LCD_GPIO, LCD_D6, (nibble & 0x04));
  167. GPIO_WriteBit(LCD_GPIO, LCD_D7, (nibble & 0x08));
  168. GPIO_WriteBit(LCD_GPIO, LCD_E, Bit_SET); // ustaw wysoki poziom E
  169. for(delayCnt = 0; delayCnt < 16; delayCnt++); // poczekaj troche…
  170.  
  171. GPIO_WriteBit(LCD_GPIO, LCD_E, Bit_RESET); // ustaw niski poziom E
  172. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement