Advertisement
dargenn

Untitled

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