Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //******************************************************************************
- // THE SOFTWARE INCLUDED IN THIS FILE IS FOR GUIDANCE ONLY.
- // AUTHOR SHALL NOT BE HELD LIABLE FOR ANY DIRECT, INDIRECT
- // OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
- // FROM USE OF THIS SOFTWARE.
- //
- // PROGRAM ZAWARTY W TYM PLIKU PRZEZNACZONY JEST WYLACZNIE
- // DO CELOW SZKOLENIOWYCH. AUTOR NIE PONOSI ODPOWIEDZIALNOSCI
- // ZA ZADNE EWENTUALNE, BEZPOSREDNIE I POSREDNIE SZKODY
- // WYNIKLE Z JEGO WYKORZYSTANIA.
- //******************************************************************************
- #include "stm32f10x.h"
- #include "lcd.h"
- #include "stm32f10x.h"
- #include "lcd.h"
- void GPIO_Config(void);
- void RCC_Config(void);
- void LCD_Initialize(void);
- void LCD_WriteData(unsigned char);
- GPIO_InitTypeDef GPIO_InitStructure;
- void LCD_WriteNibble(unsigned char);
- void LCD_WriteCommand(unsigned char);
- int main(void)
- //konfiguracja systemu
- {
- unsigned char tekst[18] = {"Monika Pietyszuk!"};
- int i = 0;
- RCC_Config();
- GPIO_Config();
- LCD_Initialize(); // Inicjalizuj LCD
- LCD_WriteCommand(LCD_CLEAR); // Wyczysc LCD
- for (i=0; i<6; i++) // Wypisz tekst
- LCD_WriteData(tekst[i]);
- for(i=0;i<32000;i++);
- //LCD_SECOND_LINE_ADDR 0xc0
- LCD_WriteCommand(LCD_DDRAM_SET | LCD_SECOND_LINE_ADDR);
- for(i=0;i<32000;i++);
- for (i=7; i<17; i++) // Wypisz tekst
- LCD_WriteData(tekst[i]);
- while (1);
- return 0;
- }
- void RCC_Config(void)
- //konfigurowanie sygnalow taktujacych
- {
- ErrorStatus HSEStartUpStatus; //zmienna opisujaca rezultat uruchomienia HSE
- RCC_DeInit(); //Reset ustawien RCC
- RCC_HSEConfig(RCC_HSE_ON); //Wlaczenie HSE
- HSEStartUpStatus = RCC_WaitForHSEStartUp(); //Odczekaj az HSE bedzie gotowy
- if(HSEStartUpStatus == SUCCESS)
- {
- FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//
- FLASH_SetLatency(FLASH_Latency_2); //ustaw zwloke dla pamieci Flash; zaleznie od taktowania rdzenia
- //0:<24MHz; 1:24~48MHz; 2:>48MHz
- RCC_HCLKConfig(RCC_SYSCLK_Div1); //ustaw HCLK=SYSCLK
- RCC_PCLK2Config(RCC_HCLK_Div1); //ustaw PCLK2=HCLK
- RCC_PCLK1Config(RCC_HCLK_Div2); //ustaw PCLK1=HCLK/2
- RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); //ustaw PLLCLK = HSE*9 czyli 8MHz * 9 = 72 MHz
- //inne przykladowe konfiguracje:
- //RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_9); //ustaw PLLCLK = HSI/2*9 czyli 8MHz / 2 * 9 = 36 MHz
- //RCC_PLLConfig(RCC_PLLSource_HSE_Div2, RCC_PLLMul_9); //ustaw PLLCLK = HSE/2*9 czyli 8MHz / 2 * 9 = 36 MHz
- RCC_PLLCmd(ENABLE); //wlacz PLL
- while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //odczekaj na poprawne uruchomienie PLL
- RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //ustaw PLL jako zrodlo sygnalu zegarowego
- while(RCC_GetSYSCLKSource() != 0x08); //odczekaj az PLL bedzie sygnalem zegarowym systemu
- /*Tu nalezy umiescic kod zwiazany z konfiguracja sygnalow zegarowych potrzebnych w programie peryferiow*/
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);//wlacz taktowanie portu GPIO B
- } else {
- }
- }
- void GPIO_Config(void)
- {
- //konfigurowanie portow GPIO
- GPIO_InitTypeDef GPIO_InitStructure;
- // disable JTAG
- GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
- /*Tu nalezy umiescic kod zwiazany z konfiguracja poszczegolnych portow GPIO potrzebnych w programie*/
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 ;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- }
- void LCD_Initialize(void) {
- unsigned int i = 0;
- GPIO_InitStructure.GPIO_Pin = LCD_D4|LCD_D5|LCD_D6|LCD_D7|LCD_RS|LCD_E;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_Init(LCD_GPIO, &GPIO_InitStructure);
- for(; i < 150000; i++);
- LCD_WriteNibble(0x03);
- for(i = 0; i < 3000000; i++);
- LCD_WriteNibble(0x03);
- for(i = 0; i < 6000; i++);
- LCD_WriteNibble(0x03);
- for(i = 0; i < 6000; i++);
- LCD_WriteNibble(0x02);
- for(i = 0; i < 6000; i++);
- LCD_WriteCommand(LCD_FUNCTION_SET | LCD_FONT8 | LCD_TWO_LINE);
- for(i = 0; i < 6000; i++);
- LCD_WriteCommand(LCD_DISPLAY_ONOFF | LCD_DISPLAY_OFF);
- for(i = 0; i < 6000; i++);
- LCD_WriteCommand(LCD_CLEAR);
- for(i = 0; i < 600000; i++);
- LCD_WriteCommand(LCD_ENTRY_MODE
- | LCD_EM_INCREMENT | LCD_EM_SHIFT_CURSOR);
- for(i = 0; i < 6000; i++);
- LCD_WriteCommand(LCD_DISPLAY_ONOFF | LCD_DISPLAY_ON);
- }
- void LCD_WriteData(unsigned char dataToWrite)
- {
- unsigned int delayCnt = 0;
- GPIO_WriteBit(LCD_GPIO, LCD_RS, 1);
- GPIO_WriteBit(LCD_GPIO, LCD_D4, dataToWrite & 0x10);
- GPIO_WriteBit(LCD_GPIO, LCD_D5, dataToWrite & 0x20);
- GPIO_WriteBit(LCD_GPIO, LCD_D6, dataToWrite & 0x40);
- GPIO_WriteBit(LCD_GPIO, LCD_D7, dataToWrite & 0x80);
- GPIO_WriteBit(LCD_GPIO, LCD_E, Bit_SET);
- // ustaw wysoki poziom E
- for(delayCnt = 0; delayCnt < 300; delayCnt++);
- // poczekaj troche?
- GPIO_WriteBit(LCD_GPIO, LCD_E, Bit_RESET);
- // ustaw niski poziom E
- GPIO_WriteBit(LCD_GPIO, LCD_D4, dataToWrite & 0x01);
- GPIO_WriteBit(LCD_GPIO, LCD_D5, dataToWrite & 0x02);
- GPIO_WriteBit(LCD_GPIO, LCD_D6, dataToWrite & 0x04);
- GPIO_WriteBit(LCD_GPIO, LCD_D7, dataToWrite & 0x08);
- GPIO_WriteBit(LCD_GPIO, LCD_E, Bit_SET);
- // ustaw wysoki poziom E
- for(delayCnt = 0; delayCnt < 300; delayCnt++);
- // poczekaj troche?
- GPIO_WriteBit(LCD_GPIO, LCD_E, Bit_RESET);
- // ustaw niski poziom E
- GPIO_WriteBit(LCD_GPIO, LCD_RS, 0);
- }
- void LCD_WriteCommand(unsigned char commandToWrite)
- {
- volatile unsigned int delayCnt = 0;
- GPIO_WriteBit(LCD_GPIO, LCD_RS, Bit_RESET); // RS = 0 - komenda
- LCD_WriteNibble(commandToWrite >> 4); // wyslij starszy p?lbajt
- LCD_WriteNibble(commandToWrite & 0x0F); // wyslij mlodszy p?lbajt
- if (commandToWrite > 3)
- // w zaleznosci od komendy dobierz opóznienie
- for(delayCnt = 0; delayCnt < 3000; delayCnt++);
- else
- for(delayCnt = 0; delayCnt < 150000; delayCnt++);
- }
- void LCD_WriteNibble(unsigned char nibble)
- {
- volatile unsigned int delayCnt = 0;
- GPIO_WriteBit(LCD_GPIO, LCD_D4, (nibble & 0x01)); // ustaw bity na liniach
- GPIO_WriteBit(LCD_GPIO, LCD_D5, (nibble & 0x02)); // D4 – D7
- GPIO_WriteBit(LCD_GPIO, LCD_D6, (nibble & 0x04));
- GPIO_WriteBit(LCD_GPIO, LCD_D7, (nibble & 0x08));
- GPIO_WriteBit(LCD_GPIO, LCD_E, Bit_SET); // ustaw wysoki poziom E
- for(delayCnt = 0; delayCnt < 16; delayCnt++); // poczekaj troche…
- GPIO_WriteBit(LCD_GPIO, LCD_E, Bit_RESET); // ustaw niski poziom E
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement