<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=46&amp;t=8555&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-09-19T10:45:35+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=46&amp;t=8555&amp;mode</id>
<entry>
<author><name><![CDATA[bartiszosti]]></name></author>
<updated>2014-09-19T10:45:35+01:00</updated>
<published>2014-09-19T10:45:35+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8555&amp;p=96023#p96023</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8555&amp;p=96023#p96023"/>
<title type="html"><![CDATA[Re: STM32VL vs NOKIA 5110 LCD]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8555&amp;p=96023#p96023"><![CDATA[
juz sie zaopatrzylem w analizator stanow logicznych i kiedy mi tylko przyjdzie to wszystko posprawdzam. jednak wydaje mi sie, ze wszystko jest z nia w porzadku, poniewaz wyswietlacz moze byc taktowany do 4MHz, a u mnie wychodzi 750kHz. bawilem sie nim troche i problem jest taki kiedy w funkcji main wlaczam inicjalizacje to wogole nie reaguje, a kiedy inicjalizacje mam ustawiona na przycisk na przerwaniu to juz sie inicjalizuje, ustawia kontrast i wyswietla to co chce wiec spi dziala tylko wyswietla to byle gdzie znaczy wiem, ze nie ustawiam kursora jednak na pare sposobow nie chce on sie ustawic tam gdzie ma byc. macie na to jakis pomysl ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4976">bartiszosti</a> — 19 wrz 2014, o 10:45</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[azorp12]]></name></author>
<updated>2014-09-18T10:17:54+01:00</updated>
<published>2014-09-18T10:17:54+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8555&amp;p=95869#p95869</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8555&amp;p=95869#p95869"/>
<title type="html"><![CDATA[Re: STM32VL vs NOKIA 5110 LCD]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8555&amp;p=95869#p95869"><![CDATA[
Nie mam dużej możliwości sprawdzenia kodu bo nie korzystam z tej biblioteki, ale 90% przypadków problemów z SPI to złe odstępy czasowe, najlepiej sprawdzić analizatorem logicznym czy wszystko jest w porządku. Z tego co pamiętam to w przypadku niektórych ustawień timerów częstotliwość taktowania była dwa razy większa niż normalnie, w manualu spójrz na &quot;clock tree&quot;.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1743">azorp12</a> — 18 wrz 2014, o 10:17</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[xbary]]></name></author>
<updated>2014-09-18T09:34:51+01:00</updated>
<published>2014-09-18T09:34:51+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8555&amp;p=95865#p95865</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8555&amp;p=95865#p95865"/>
<title type="html"><![CDATA[Re: STM32VL vs NOKIA 5110 LCD]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8555&amp;p=95865#p95865"><![CDATA[
Sprawdź delay, bo DiscoF4 jest trochę <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> szybszy od VL . To może być jedną z przyczyn.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=447">xbary</a> — 18 wrz 2014, o 09:34</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[bartiszosti]]></name></author>
<updated>2014-09-17T23:51:06+01:00</updated>
<published>2014-09-17T23:51:06+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8555&amp;p=95854#p95854</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8555&amp;p=95854#p95854"/>
<title type="html"><![CDATA[STM32VL vs NOKIA 5110 LCD]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8555&amp;p=95854#p95854"><![CDATA[
Witam, mam drobny problem z wyżej wymienionym wyświetlaczem. Zacznę od przesłania bibliotek.<br /><br />spi.h<br />[syntax=c]typedef enum {<br />TM_SPI_Mode_0,//Clock polarity low, clock phase 1st edge<br />TM_SPI_Mode_1,//Clock polarity low, clock phase 2nd edge<br />TM_SPI_Mode_2,//Clock polarity high, clock phase 1st edge<br />TM_SPI_Mode_3//Clock polarity high, clock phase 2nd edge<br />} TM_SPI_Mode_t;<br /><br />//----- SPI1 options start -------<br />#ifndef TM_SPI1_PRESCALER<br />#define TM_SPI1_PRESCALERSPI_BaudRatePrescaler_32<br />#endif<br />//Specify datasize<br />#ifndef TM_SPI1_DATASIZE<br />#define TM_SPI1_DATASIZE SPI_DataSize_8b<br />#endif<br />//Specify which bit is first<br />#ifndef TM_SPI1_FIRSTBIT<br />#define TM_SPI1_FIRSTBIT SPI_FirstBit_MSB<br />#endif<br />//Mode, master or slave<br />#ifndef TM_SPI1_MASTERSLAVE<br />#define TM_SPI1_MASTERSLAVESPI_Mode_Master<br />#endif<br />//Specify mode of operation, clock polarity and clock phase<br />#ifndef TM_SPI1_MODE<br />#define TM_SPI1_MODETM_SPI_Mode_0<br />#endif<br />//----- SPI1 options end -------<br /><br />//----- SPI2 options start -------<br />#ifndef TM_SPI2_PRESCALER<br />#define TM_SPI2_PRESCALERSPI_BaudRatePrescaler_32<br />#endif<br />//Specify datasize<br />#ifndef TM_SPI2_DATASIZE<br />#define TM_SPI2_DATASIZE SPI_DataSize_8b<br />#endif<br />//Specify which bit is first<br />#ifndef TM_SPI2_FIRSTBIT<br />#define TM_SPI2_FIRSTBIT SPI_FirstBit_MSB<br />#endif<br />//Mode, master or slave<br />#ifndef TM_SPI2_MASTERSLAVE<br />#define TM_SPI2_MASTERSLAVE SPI_Mode_Master<br />#endif<br />//Specify mode of operation, clock polarity and clock phase<br />#ifndef TM_SPI2_MODE<br />#define TM_SPI2_MODETM_SPI_Mode_0<br />#endif<br /><br />extern void TM_SPI1_Init();<br /><br />/**<br /> * SPI1 uses pins:<br /> * - MOSI: PA7<br /> * - MISO: PA6<br /> * - SCK:  PA5<br /> */<br />extern void TM_SPI2_Init();<br /><br />/**<br /> * SPI2 uses pins:<br /> * - MOSI: PB15<br /> * - MISO: PB14<br /> * - SCK:  PB13<br /><br /> */<br />extern uint8_t TM_SPI_Send(SPI_TypeDef* SPIx, uint8_t data);<br /><br />/**<br /> * Send and receive multiple data bytes over SPI<br /> *<br /> * Parameters:<br /> * - SPI_TypeDef* SPIx: Select SPI which will operate with data<br /> * - uint8_t dataOut: pointer to data to be sent out<br /> *- uint8_t dataIn: pointer to received data<br /> *- uint8_t count: number of bytes to send<br /> *<br /> * No returns<br /> */<br />extern void TM_SPI_SendMulti(SPI_TypeDef* SPIx, uint8_t *dataOut, uint8_t *dataIn, uint16_t count);<br /><br />/**<br /> * Write multiple data via SPI<br /> *<br /> * Parameters:<br /> * - SPI_TypeDef* SPIx: Select SPI which will operate with data<br /> * - uint8_t dataOut: pointer to data to be sent out<br /> *- uint8_t count: number of bytes to send<br /> *<br /> * No returns<br /> */<br />extern void TM_SPI_WriteMulti(SPI_TypeDef* SPIx, uint8_t *dataOut, uint16_t count);<br /><br />/**<br /> * Send and receive multiple data bytes over SPI<br /> *<br /> * Parameters:<br /> * - SPI_TypeDef* SPIx: Select SPI which will operate with data<br /> *- uint8_t dataIn: pointer to received data<br /> *- uint8_t dummy: dummy byte to be sent to SPI<br /> *- uint8_t count: number of bytes to receive<br /> *<br /> * No returns<br /> */<br />extern void TM_SPI_ReadMulti(SPI_TypeDef* SPIx, uint8_t *dataIn, uint8_t dummy, uint16_t count);<br /><br />#endif[/syntax]<br /><br />spi.c<br />[syntax=c]void TM_SPI1_Init() {<br />GPIO_InitTypeDef GPIO_InitStruct;<br />SPI_InitTypeDef SPI_InitStruct;<br /><br />//Common settings for all pins<br />GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;<br />GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;<br /><br />//Enable clock for GPIOA<br />RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);<br />RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);<br /><br />//        SCK          MISO         MOSI<br />GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;<br />GPIO_Init(GPIOA, &amp;GPIO_InitStruct);<br /><br />RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);<br /><br />SPI_StructInit(&amp;SPI_InitStruct);<br />SPI_InitStruct.SPI_BaudRatePrescaler = TM_SPI1_PRESCALER;<br />SPI_InitStruct.SPI_DataSize = TM_SPI1_DATASIZE;<br />SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex;<br />SPI_InitStruct.SPI_FirstBit = TM_SPI1_FIRSTBIT;<br />SPI_InitStruct.SPI_Mode = TM_SPI1_MASTERSLAVE;<br />if (TM_SPI1_MODE == TM_SPI_Mode_0) {<br />SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low;<br />SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;<br />} else if (TM_SPI1_MODE == TM_SPI_Mode_1) {<br />SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low;<br />SPI_InitStruct.SPI_CPHA = SPI_CPHA_2Edge;<br />} else if (TM_SPI1_MODE == TM_SPI_Mode_2) {<br />SPI_InitStruct.SPI_CPOL = SPI_CPOL_High;<br />SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;<br />} else if (TM_SPI1_MODE == TM_SPI_Mode_3) {<br />SPI_InitStruct.SPI_CPOL = SPI_CPOL_High;<br />SPI_InitStruct.SPI_CPHA = SPI_CPHA_2Edge;<br />}<br />SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;<br />SPI_Init(SPI1, &amp;SPI_InitStruct);<br />SPI_Cmd(SPI1, ENABLE);<br />}<br /><br />void TM_SPI2_Init() {<br />GPIO_InitTypeDef GPIO_InitStruct;<br />SPI_InitTypeDef SPI_InitStruct;<br /><br />//Common settings for all pins<br />GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;<br />GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;<br /><br />//Enable clock<br />RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);<br />RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);<br />//       MISO         MOSISCK<br />GPIO_InitStruct.GPIO_Pin = GPIO_Pin_14 | GPIO_Pin_15 | GPIO_Pin_13;<br />GPIO_Init(GPIOB, &amp;GPIO_InitStruct);<br /><br />RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);<br /><br />SPI_StructInit(&amp;SPI_InitStruct);<br />SPI_InitStruct.SPI_BaudRatePrescaler = TM_SPI2_PRESCALER;<br />SPI_InitStruct.SPI_DataSize = TM_SPI2_DATASIZE;<br />SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex;<br />SPI_InitStruct.SPI_FirstBit = TM_SPI2_FIRSTBIT;<br />SPI_InitStruct.SPI_Mode = TM_SPI2_MASTERSLAVE;<br />if (TM_SPI2_MODE == TM_SPI_Mode_0) {<br />SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low;<br />SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;<br />} else if (TM_SPI2_MODE == TM_SPI_Mode_1) {<br />SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low;<br />SPI_InitStruct.SPI_CPHA = SPI_CPHA_2Edge;<br />} else if (TM_SPI2_MODE == TM_SPI_Mode_2) {<br />SPI_InitStruct.SPI_CPOL = SPI_CPOL_High;<br />SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;<br />} else if (TM_SPI2_MODE == TM_SPI_Mode_3) {<br />SPI_InitStruct.SPI_CPOL = SPI_CPOL_High;<br />SPI_InitStruct.SPI_CPHA = SPI_CPHA_2Edge;<br />}<br />SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;<br />SPI_Init(SPI2, &amp;SPI_InitStruct);<br />SPI_Cmd(SPI2, ENABLE);<br />}<br /><br />uint8_t TM_SPI_Send(SPI_TypeDef* SPIx, uint8_t data) {<br />//Fill output buffer with data<br />SPIx-&gt;DR = data;<br />//Wait for transmission to complete<br />while (!SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE));<br />//Wait for received data to complete<br />while (!SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE));<br />//Wait for SPI to be ready<br />while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_BSY));<br />//Return data from buffer<br />return SPIx-&gt;DR;<br />}<br /><br />void TM_SPI_SendMulti(SPI_TypeDef* SPIx, uint8_t *dataOut, uint8_t *dataIn, uint16_t count) {<br />uint8_t i;<br />for (i = 0; i &lt; count; i++) {<br />dataIn&#91;i&#93; = TM_SPI_Send(SPIx, dataOut&#91;i&#93;);<br />}<br />}<br /><br />void TM_SPI_WriteMulti(SPI_TypeDef* SPIx, uint8_t *dataOut, uint16_t count) {<br />uint16_t i;<br />for (i = 0; i &lt; count; i++) {<br />TM_SPI_Send(SPIx, dataOut&#91;i&#93;);<br />}<br />}<br /><br />void TM_SPI_ReadMulti(SPI_TypeDef* SPIx, uint8_t *dataIn, uint8_t dummy, uint16_t count) {<br />uint16_t i;<br />for (i = 0; i &lt; count; i++) {<br />dataIn&#91;i&#93; = TM_SPI_Send(SPIx, dummy);<br />}<br />}[/syntax]<br /><br />pcd8544.h<br />[syntax=c]//SPI used<br />#ifndef PCD8544_SPI<br />#define PCD8544_SPISPI1<br />#endif<br /><br />//Default pins used<br />//Default RST pin<br />#ifndef PCD8544_RST_PIN<br />#define PCD8544_RST_RCCRCC_APB2Periph_GPIOB<br />#define PCD8544_RST_PORTGPIOB<br />#define PCD8544_RST_PINGPIO_Pin_2<br />#endif<br />//Default DC pin<br />#ifndef PCD8544_DC_PIN<br />#define PCD8544_DC_RCCRCC_APB2Periph_GPIOB<br />#define PCD8544_DC_PORTGPIOB<br />#define PCD8544_DC_PINGPIO_Pin_1<br />#endif<br />//Default CE pin<br />#ifndef PCD8544_CE_PIN<br />#define PCD8544_CE_RCCRCC_APB2Periph_GPIOB<br />#define PCD8544_CE_PORTGPIOB<br />#define PCD8544_CE_PINGPIO_Pin_0<br />#endif<br /><br />#define PCD8544_CE_LOWGPIO_ResetBits(PCD8544_CE_PORT, PCD8544_CE_PIN)<br />#define PCD8544_CE_HIGHGPIO_SetBits(PCD8544_CE_PORT, PCD8544_CE_PIN)<br /><br />/**<br /> * Private enums<br /> */<br />typedef enum {<br />PCD8544_COMMAND = 0,<br />PCD8544_DATA = !PCD8544_COMMAND<br />} PCD8544_WriteType_t;<br /><br />typedef enum {<br />PCD8544_State_Low = 0,<br />PCD8544_State_High = !PCD8544_State_Low<br />} PCD8544_State_t;<br /><br />typedef enum {<br />PCD8544_Pin_DC = 1,<br />PCD8544_Pin_RST = 2<br />} PCD8544_Pin_t;<br /><br />/**<br /> * Public enums<br /> */<br />/**<br /> * Used for pixel &quot;color&quot;<br /> * LCD is 2 bit, so pixel can be just set or clear<br /> */<br />typedef enum {<br />PCD8544_Pixel_Clear = 0,<br />PCD8544_Pixel_Set = !PCD8544_Pixel_Clear<br />} PCD8544_Pixel_t;<br /><br />/**<br /> * Font size for text<br /> * There are 2 sizes included<br /> */<br />typedef enum {<br />PCD8544_FontSize_5x7 = 0,<br />PCD8544_FontSize_3x5 = !PCD8544_FontSize_5x7<br />} PCD8544_FontSize_t;<br /><br />/**<br /> * Used to invert pixels<br /> */<br />typedef enum {<br />PCD8544_Invert_Yes,<br />PCD8544_Invert_No<br />} PCD8544_Invert_t;<br /><br /><br />#define PCD8544_WIDTH84<br />#define PCD8544_HEIGHT48<br /><br />// PCD8544 Commandset<br />// ------------------<br />// General commands<br />#define PCD8544_POWERDOWN0x04<br />#define PCD8544_ENTRYMODE0x02<br />#define PCD8544_EXTENDEDINSTRUCTION0x01<br />#define PCD8544_DISPLAYBLANK0x00<br />#define PCD8544_DISPLAYNORMAL0x04<br />#define PCD8544_DISPLAYALLON0x01<br />#define PCD8544_DISPLAYINVERTED0x05<br />// Normal instruction set<br />#define PCD8544_FUNCTIONSET0x20<br />#define PCD8544_DISPLAYCONTROL0x08<br />#define PCD8544_SETYADDR0x40<br />#define PCD8544_SETXADDR0x80<br />// Extended instruction set<br />#define PCD8544_SETTEMP0x04<br />#define PCD8544_SETBIAS0x10<br />#define PCD8544_SETVOP0x80<br />// Display presets<br />#define PCD8544_LCD_BIAS0x03// Range: 0-7 (0x00-0x07)<br />#define PCD8544_LCD_TEMP0x02// Range: 0-3 (0x00-0x03)<br />#define PCD8544_LCD_CONTRAST0x46// Range: 0-127 (0x00-0x7F)<br /><br />#define PCD8544_CHAR5x7_WIDTH6 //5*8<br />#define PCD8544_CHAR5x7_HEIGHT8<br />#define PCD8544_CHAR3x5_WIDTH4 //3*5<br />#define PCD8544_CHAR3x5_HEIGHT6<br /><br />#define PCD8544_BUFFER_SIZE PCD8544_WIDTH * PCD8544_HEIGHT / 8<br /><br /><br />/**<br /> * Initialize all IO pins and peripheral<br /> *<br /> */<br />extern void PCD8544_InitIO(void);<br /><br />/**<br /> * Send data to LCD<br /> *<br /> */<br />extern void PCD8544_send(unsigned char data);<br /><br />/**<br /> * Set DC pin state<br /> *<br /> */<br />extern void PCD8544_Pin(PCD8544_Pin_t pin, PCD8544_State_t state);<br /><br />/**<br /> * Specify delay in microseconds<br /> *<br /> */<br />extern void PCD8544_Delay(unsigned long micros);<br /><br />/**<br /> * Write data/command to LCD<br /> *<br /> */<br />extern void PCD8544_Write(PCD8544_WriteType_t cd, unsigned char data);<br /><br />/**<br /> * Set area for refresh display<br /> *<br /> */<br />extern void PCD8544_UpdateArea(unsigned char xMin, unsigned char yMin, unsigned char xMax, unsigned char yMax);<br /><br />/**<br /> * Initialize LCD<br /> *<br /> * Parameters<br /> * - unsigned char contrast: Contrast can be software selectable, from 0x00 to 0x7F<br /> */<br />extern void PCD8544_Init(unsigned char contrast);<br /><br />/**<br /> * Set contrast for LCD<br /> *<br /> * Parameters<br /> * - unsigned char contrast: Contrast can be software selectable, from 0x00 to 0x7F<br /> */<br />extern void PCD8544_SetContrast(unsigned char contrast);<br /><br />/**<br /> * Invert LCD<br /> *<br /> * Parameters<br /> * - PCD8544_Invert_t invert<br /> * - PCD8544_Invert_Yes: Invert pixels on lcd<br /> * - PCD8544_Invert_No: Return pixels to orignal<br /> */<br />extern void PCD8544_Invert(PCD8544_Invert_t invert);<br /><br />/**<br /> * Clear lcd<br /> */<br />extern void PCD8544_Clear(void);<br /><br />/**<br /> * Set/clear pixel at specific location<br /> *<br /> * Parameters<br /> * - unsigned char x: x position of pixel<br /> * - unsigned char y: y position of pixel<br /> * - PCD8544_PCD8544_Pixel_t pixel: Set or clear pixel<br /> * - PCD8544_Pixel_Set<br /> * - PCD8544_Pixel_Clear<br /> */<br />extern void PCD8544_DrawPixel(unsigned char x, unsigned char y, PCD8544_Pixel_t pixel);<br /><br />/**<br /> * Set cursor on lcd at 0, 0 location<br /> *<br /> */<br />extern void PCD8544_Home(void);<br /><br />/**<br /> * Put data from internal buffer to lcd<br /> *<br /> */<br />extern void PCD8544_Refresh(void);<br /><br />/**<br /> * Set cursor to desired position<br /> *<br /> * Parameters:<br /> * - unsigned char x: x from 0 to 83<br /> * - unsigned char y: y from 0 to 47<br /> */<br />extern void PCD8544_GotoXY(unsigned char x, unsigned char y);<br /><br />/**<br /> * Put character on LCD<br /> *<br /> * Parameters:<br /> * - char c: char to display<br /> * - PCD8544_FontSize_t size: Font size<br /> * - PCD8544_FontSize_5x7<br /> * - PCD8544_FontSize_3x5<br /> * - PCD8544_PCD8544_Pixel_t color<br /> * - PCD8544_Pixel_Set<br /> * - PCD8544_Pixel_Clear<br /> */<br />extern void PCD8544_Putc(char c, PCD8544_Pixel_t color, PCD8544_FontSize_t size);<br /><br />/**<br /> * Put string on LCD<br /> *<br /> * Parameters:<br /> * - char *c: pointer to first character of string<br /> * - PCD8544_FontSize_t size: Font size<br /> * - PCD8544_FontSize_5x7<br /> * - PCD8544_FontSize_3x5<br /> * - PCD8544_PCD8544_Pixel_t color<br /> * - PCD8544_Pixel_Set<br /> * - PCD8544_Pixel_Clear<br /> */<br />extern void PCD8544_Puts(char *c, PCD8544_Pixel_t color, PCD8544_FontSize_t size);<br /><br />/**<br /> * Draw line on LCD<br /> *<br /> * Parameters:<br /> * - unsigned char x0: X coordinate of starting point<br /> * - unsigned char y0: Y coordinate of starting point<br /> * - unsigned char x1: X coordinate of ending point<br /> * - unsigned char y1: Y coordinate of ending point<br /> * - PCD8544_PCD8544_Pixel_t color<br /> * - PCD8544_Pixel_Set<br /> * - PCD8544_Pixel_Clear<br /> */<br />extern void PCD8544_DrawLine(unsigned char x0, unsigned char y0, unsigned char x1, unsigned char y1, PCD8544_Pixel_t color);<br /><br />/**<br /> * Draw rectangle on LCD<br /> *<br /> * Parameters:<br /> * - unsigned char x0: X coordinate of top left point<br /> * - unsigned char y0: Y coordinate of top left point<br /> * - unsigned char x1: X coordinate of bottom right point<br /> * - unsigned char y1: Y coordinate of bottom right point<br /> * - PCD8544_PCD8544_Pixel_t color<br /> * - PCD8544_Pixel_Set<br /> * - PCD8544_Pixel_Clear<br /> */<br />extern void PCD8544_DrawRectangle(unsigned char x0, unsigned char y0, unsigned char x1, unsigned char y1, PCD8544_Pixel_t color);<br /><br />/**<br /> * Draw filled rectangle on LCD<br /> *<br /> * Parameters:<br /> * - unsigned char x0: X coordinate of top left point<br /> * - unsigned char y0: Y coordinate of top left point<br /> * - unsigned char x1: X coordinate of bottom right point<br /> * - unsigned char y1: Y coordinate of bottom right point<br /> * - PCD8544_PCD8544_Pixel_t color<br /> * - PCD8544_Pixel_Set<br /> * - PCD8544_Pixel_Clear<br /> */<br />extern void PCD8544_DrawFilledRectangle(unsigned char x0, unsigned char y0, unsigned char x1, unsigned char y1, PCD8544_Pixel_t color);<br /><br />/**<br /> * Draw circle on LCD<br /> *<br /> * Parameters:<br /> * - char x0: X coordinate of center circle point<br /> * - char y0: Y coordinate of center circle point<br /> * - char r: circle radius<br /> * - PCD8544_PCD8544_Pixel_t color<br /> * - PCD8544_Pixel_Set<br /> * - PCD8544_Pixel_Clear<br /> */<br />extern void PCD8544_DrawCircle(char x0, char y0, char r, PCD8544_Pixel_t color);<br /><br />/**<br /> * Draw filled circle on LCD<br /> *<br /> * Parameters:<br /> * - char x0: X coordinate of center circle point<br /> * - char y0: Y coordinate of center circle point<br /> * - char r: circle radius<br /> * - PCD8544_PCD8544_Pixel_t color<br /> * - PCD8544_Pixel_Set<br /> * - PCD8544_Pixel_Clear<br /> */<br />extern void PCD8544_DrawFilledCircle(char x0, char y0, char r, PCD8544_Pixel_t color);<br /><br />#endif[/syntax]<br /><br />pcd8544.c<br />[syntax=c]unsigned char PCD8544_Buffer&#91;PCD8544_BUFFER_SIZE&#93;;<br />unsigned char PCD8544_UpdateXmin = 0, PCD8544_UpdateXmax = 0, PCD8544_UpdateYmin = 0, PCD8544_UpdateYmax = 0;<br />unsigned char PCD8544_x;<br />unsigned char PCD8544_y;<br /><br />//Fonts 5x7<br />const uint8_t PCD8544_Font5x7 &#91;97&#93;&#91;PCD8544_CHAR5x7_WIDTH&#93; = {<br />{ 0x00, 0x00, 0x00, 0x00, 0x00 },   // sp<br />{ 0x00, 0x00, 0x2f, 0x00, 0x00 },   // !<br />{ 0x00, 0x07, 0x00, 0x07, 0x00 },   // &quot;<br />{ 0x14, 0x7f, 0x14, 0x7f, 0x14 },   // #<br />{ 0x24, 0x2a, 0x7f, 0x2a, 0x12 },   // $<br />{ 0x32, 0x34, 0x08, 0x16, 0x26 },   // %<br />{ 0x36, 0x49, 0x55, 0x22, 0x50 },   // &amp;<br />{ 0x00, 0x05, 0x03, 0x00, 0x00 },   // '<br />{ 0x00, 0x1c, 0x22, 0x41, 0x00 },   // (<br />{ 0x00, 0x41, 0x22, 0x1c, 0x00 },   // )<br />{ 0x14, 0x08, 0x3E, 0x08, 0x14 },   // *<br />{ 0x08, 0x08, 0x3E, 0x08, 0x08 },   // +<br />{ 0x00, 0x00, 0x50, 0x30, 0x00 },   // ,<br />{ 0x10, 0x10, 0x10, 0x10, 0x10 },   // -<br />{ 0x00, 0x60, 0x60, 0x00, 0x00 },   // .<br />{ 0x20, 0x10, 0x08, 0x04, 0x02 },   // /<br />{ 0x3E, 0x51, 0x49, 0x45, 0x3E },   // 0<br />{ 0x00, 0x42, 0x7F, 0x40, 0x00 },   // 1<br />{ 0x42, 0x61, 0x51, 0x49, 0x46 },   // 2<br />{ 0x21, 0x41, 0x45, 0x4B, 0x31 },   // 3<br />{ 0x18, 0x14, 0x12, 0x7F, 0x10 },   // 4<br />{ 0x27, 0x45, 0x45, 0x45, 0x39 },   // 5<br />{ 0x3C, 0x4A, 0x49, 0x49, 0x30 },   // 6<br />{ 0x01, 0x71, 0x09, 0x05, 0x03 },   // 7<br />{ 0x36, 0x49, 0x49, 0x49, 0x36 },   // 8<br />{ 0x06, 0x49, 0x49, 0x29, 0x1E },   // 9<br />{ 0x00, 0x36, 0x36, 0x00, 0x00 },   // :<br />{ 0x00, 0x56, 0x36, 0x00, 0x00 },   // ;<br />{ 0x08, 0x14, 0x22, 0x41, 0x00 },   // &lt;<br />{ 0x14, 0x14, 0x14, 0x14, 0x14 },   // =<br />{ 0x00, 0x41, 0x22, 0x14, 0x08 },   // &gt;<br />{ 0x02, 0x01, 0x51, 0x09, 0x06 },   // ?<br />{ 0x32, 0x49, 0x59, 0x51, 0x3E },   // @<br />{ 0x7E, 0x11, 0x11, 0x11, 0x7E },   // A<br />{ 0x7F, 0x49, 0x49, 0x49, 0x36 },   // B<br />{ 0x3E, 0x41, 0x41, 0x41, 0x22 },   // C<br />{ 0x7F, 0x41, 0x41, 0x22, 0x1C },   // D<br />{ 0x7F, 0x49, 0x49, 0x49, 0x41 },   // E<br />{ 0x7F, 0x09, 0x09, 0x09, 0x01 },   // F<br />{ 0x3E, 0x41, 0x49, 0x49, 0x7A },   // G<br />{ 0x7F, 0x08, 0x08, 0x08, 0x7F },   // H<br />{ 0x00, 0x41, 0x7F, 0x41, 0x00 },   // I<br />{ 0x20, 0x40, 0x41, 0x3F, 0x01 },   // J<br />{ 0x7F, 0x08, 0x14, 0x22, 0x41 },   // K<br />{ 0x7F, 0x40, 0x40, 0x40, 0x40 },   // L<br />{ 0x7F, 0x02, 0x0C, 0x02, 0x7F },   // M<br />{ 0x7F, 0x04, 0x08, 0x10, 0x7F },   // N<br />{ 0x3E, 0x41, 0x41, 0x41, 0x3E },   // O<br />{ 0x7F, 0x09, 0x09, 0x09, 0x06 },   // P<br />{ 0x3E, 0x41, 0x51, 0x21, 0x5E },   // Q<br />{ 0x7F, 0x09, 0x19, 0x29, 0x46 },   // R<br />{ 0x46, 0x49, 0x49, 0x49, 0x31 },   // S<br />{ 0x01, 0x01, 0x7F, 0x01, 0x01 },   // T<br />{ 0x3F, 0x40, 0x40, 0x40, 0x3F },   // U<br />{ 0x1F, 0x20, 0x40, 0x20, 0x1F },   // V<br />{ 0x3F, 0x40, 0x38, 0x40, 0x3F },   // W<br />{ 0x63, 0x14, 0x08, 0x14, 0x63 },   // X<br />{ 0x07, 0x08, 0x70, 0x08, 0x07 },   // Y<br />{ 0x61, 0x51, 0x49, 0x45, 0x43 },   // Z<br />{ 0x00, 0x7F, 0x41, 0x41, 0x00 },   // &#91;<br />{ 0x55, 0x2A, 0x55, 0x2A, 0x55 },   // 55<br />{ 0x00, 0x41, 0x41, 0x7F, 0x00 },   // &#93;<br />{ 0x04, 0x02, 0x01, 0x02, 0x04 },   // ^<br />{ 0x40, 0x40, 0x40, 0x40, 0x40 },   // _<br />{ 0x00, 0x01, 0x02, 0x04, 0x00 },   // '<br />{ 0x20, 0x54, 0x54, 0x54, 0x78 },   // a<br />{ 0x7F, 0x48, 0x44, 0x44, 0x38 },   // b<br />{ 0x38, 0x44, 0x44, 0x44, 0x20 },   // c<br />{ 0x38, 0x44, 0x44, 0x48, 0x7F },   // d<br />{ 0x38, 0x54, 0x54, 0x54, 0x18 },   // e<br />{ 0x08, 0x7E, 0x09, 0x01, 0x02 },   // f<br />{ 0x0C, 0x52, 0x52, 0x52, 0x3E },   // g<br />{ 0x7F, 0x08, 0x04, 0x04, 0x78 },   // h<br />{ 0x00, 0x44, 0x7D, 0x40, 0x00 },   // i<br />{ 0x20, 0x40, 0x44, 0x3D, 0x00 },   // j<br />{ 0x7F, 0x10, 0x28, 0x44, 0x00 },   // k<br />{ 0x00, 0x41, 0x7F, 0x40, 0x00 },   // l<br />{ 0x7C, 0x04, 0x18, 0x04, 0x78 },   // m<br />{ 0x7C, 0x08, 0x04, 0x04, 0x78 },   // n<br />{ 0x38, 0x44, 0x44, 0x44, 0x38 },   // o<br />{ 0x7C, 0x14, 0x14, 0x14, 0x08 },   // p<br />{ 0x08, 0x14, 0x14, 0x18, 0x7C },   // q<br />{ 0x7C, 0x08, 0x04, 0x04, 0x08 },   // r<br />{ 0x48, 0x54, 0x54, 0x54, 0x20 },   // s<br />{ 0x04, 0x3F, 0x44, 0x40, 0x20 },   // t<br />{ 0x3C, 0x40, 0x40, 0x20, 0x7C },   // u<br />{ 0x1C, 0x20, 0x40, 0x20, 0x1C },   // v<br />{ 0x3C, 0x40, 0x30, 0x40, 0x3C },   // w<br />{ 0x44, 0x28, 0x10, 0x28, 0x44 },   // x<br />{ 0x0C, 0x50, 0x50, 0x50, 0x3C },   // y<br />{ 0x44, 0x64, 0x54, 0x4C, 0x44 },   // z<br />{ 0x00, 0x7F, 0x3E, 0x1C, 0x08 },   // &gt; Filled123<br />{ 0x08, 0x1C, 0x3E, 0x7F, 0x00 },  // &lt; Filled124<br />{ 0x08, 0x7C, 0x7E, 0x7C, 0x08 },   // Arrow up125<br />{ 0x10, 0x3E, 0x7E, 0x3E, 0x10 },   // Arrow down126<br />{ 0x3E, 0x3E, 0x3E, 0x3E, 0x3E },   // Stop127<br />{ 0x00, 0x7F, 0x3E, 0x1C, 0x08 }    // Play128<br />};<br /><br />const uint8_t PCD8544_Font3x5&#91;106&#93;&#91;3&#93; = {<br />{ 0x00, 0x00, 0x00 },   // sp - 32<br />{ 0x00, 0x17, 0x00 },   // ! - 33<br />{ 0x03, 0x00, 0x03 },   // &quot; - 34<br />{ 0x1F, 0x0A, 0x1F },   // # - 35<br />{ 0x0A, 0x1F, 0x05 },   // $<br />{ 0x09, 0x04, 0x12 },   // %<br />{ 0x0F, 0x17, 0x1C },   // &amp;<br />{ 0x00, 0x03, 0x00 },   // '<br />{ 0x00, 0x0E, 0x11 },   // ( - 40<br />{ 0x11, 0x0E, 0x00 },   // )<br />{ 0x05, 0x02, 0x05 },   // *<br />{ 0x04, 0x0E, 0x04 },   // +<br />{ 0x10, 0x08, 0x00 },   // ,<br />{ 0x04, 0x04, 0x04 },   // - - 45<br />{ 0x00, 0x10, 0x00 },   // .<br />{ 0x08, 0x04, 0x02 },   // /<br />{ 0x1F, 0x11, 0x1F },   // 0<br />{ 0x12, 0x1F, 0x10 },   // 1<br />{ 0x1D, 0x15, 0x17 },   // 2 - 50<br />{ 0x11, 0x15, 0x1F },   // 3<br />{ 0x07, 0x04, 0x1F },   // 4<br />{ 0x17, 0x15, 0x1D },   // 5<br />{ 0x1F, 0x15, 0x1D },   // 6<br />{ 0x01, 0x01, 0x1F },   // 7 - 55<br />{ 0x1F, 0x15, 0x1F },   // 8<br />{ 0x17, 0x15, 0x1F },   // 9 - 57<br />{ 0x00, 0x0A, 0x00 },   // :<br />{ 0x10, 0x0A, 0x00 },   // ;<br />{ 0x04, 0x0A, 0x11 },   // &lt; - 60<br />{ 0x0A, 0x0A, 0x0A },   // =<br />{ 0x11, 0x0A, 0x04 },   // &gt;<br />{ 0x01, 0x15, 0x03 },   // ?<br />{ 0x0E, 0x15, 0x16 },   // @<br />{ 0x1E, 0x05, 0x1E },   // A - 65<br />{ 0x1F, 0x15, 0x0A },   // B<br />{ 0x0E, 0x11, 0x11 },   // C<br />{ 0x1F, 0x11, 0x0E },   // D<br />{ 0x1F, 0x15, 0x15 },   // E<br />{ 0x1F, 0x05, 0x05 },   // F - 70<br />{ 0x0E, 0x15, 0x1D },   // G<br />{ 0x1F, 0x04, 0x1F },   // H<br />{ 0x11, 0x1F, 0x11 },   // I<br />{ 0x08, 0x10, 0x0F },   // J<br />{ 0x1F, 0x04, 0x1B },   // K - 75<br />{ 0x1F, 0x10, 0x10 },   // L<br />{ 0x1F, 0x06, 0x1F },   // M<br />{ 0x1F, 0x0E, 0x1F },   // N<br />{ 0x0E, 0x11, 0x0E },   // O<br />{ 0x1F, 0x05, 0x02 },   // P - 80<br />{ 0x0E, 0x11, 0x1E },   // Q<br />{ 0x1F, 0x0D, 0x16 },   // R<br />{ 0x12, 0x15, 0x09 },   // S<br />{ 0x01, 0x1F, 0x01 },   // T<br />{ 0x0F, 0x10, 0x0F },   // U - 85<br />{ 0x07, 0x18, 0x07 },   // V<br />{ 0x1F, 0x0C, 0x1F },   // W<br />{ 0x1B, 0x04, 0x1B },   // X<br />{ 0x03, 0x1C, 0x03 },   // Y<br />{ 0x19, 0x15, 0x13 },   // Z - 90<br />{ 0x1F, 0x11, 0x00 },   // &#91;<br />{ 0x02, 0x04, 0x08 },   // 55 - backspace - 92<br />{ 0x00, 0x11, 0x1F },   // &#93;<br />{ 0x02, 0x01, 0x02 },   // ^<br />{ 0x10, 0x10, 0x10 },   // _ - 95<br />{ 0x01, 0x02, 0x00 },   // `<br />{ 0x1A, 0x16, 0x1C },   // a<br />{ 0x1F, 0x12, 0x0C },   // b<br />{ 0x0C, 0x12, 0x12 },   // c<br />{ 0x0C, 0x12, 0x1F },   // d - 100<br />{ 0x0C, 0x1A, 0x16 },   // e<br />{ 0x04, 0x1E, 0x05 },   // f<br />{ 0x06, 0x15, 0x0F },   // g<br />{ 0x1F, 0x02, 0x1C },   // h<br />{ 0x00, 0x1D, 0x00 },   // i - 105<br />{ 0x10, 0x10, 0x0D },   // j<br />{ 0x1F, 0x0C, 0x12 },   // k<br />{ 0x11, 0x1F, 0x10 },   // l<br />{ 0x1E, 0x0E, 0x1E },   // m<br />{ 0x1E, 0x02, 0x1C },   // n - 110<br />{ 0x0C, 0x12, 0x0C },   // o<br />{ 0x1E, 0x0A, 0x04 },   // p<br />{ 0x04, 0x0A, 0x1E },   // q<br />{ 0x1C, 0x02, 0x02 },   // r<br />{ 0x14, 0x1E, 0x0A },   // s - 115<br />{ 0x02, 0x1F, 0x12 },   // t<br />{ 0x0E, 0x10, 0x1E },   // u<br />{ 0x0E, 0x10, 0x0E },   // v<br />{ 0x1E, 0x1C, 0x1E },   // w<br />{ 0x12, 0x0C, 0x12 },   // x - 120<br />{ 0x02, 0x14, 0x1E },   // y<br />{ 0x1A, 0x1E, 0x16 },   // z<br />{ 0x04, 0x1B, 0x11 },   // {<br />{ 0x00, 0x1F, 0x00 },   // |<br />{ 0x11, 0x1B, 0x04 },   // }<br />{ 0x04, 0x06, 0x02 },   // ~<br />{ 0x1F, 0x1F, 0x1F },   // delete<br />};<br /><br /><br />void PCD8544_InitIO(void) {<br />GPIO_InitTypeDef GPIO_InitStructure;<br />//Enable clock for all pins<br />RCC_APB2PeriphClockCmd(PCD8544_RST_RCC | PCD8544_CE_RCC | PCD8544_DC_RCC, ENABLE);<br /><br />//Common settings for all pins<br />GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;<br />GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;<br /><br />//RST pin<br />GPIO_InitStructure.GPIO_Pin = PCD8544_RST_PIN;<br />GPIO_Init(PCD8544_RST_PORT, &amp;GPIO_InitStructure);<br /><br />//DC pin<br />GPIO_InitStructure.GPIO_Pin = PCD8544_DC_PIN;<br />GPIO_Init(PCD8544_DC_PORT, &amp;GPIO_InitStructure);<br /><br />//CE pin<br />GPIO_InitStructure.GPIO_Pin = PCD8544_CE_PIN;<br />GPIO_Init(PCD8544_CE_PORT, &amp;GPIO_InitStructure);<br /><br />//Reset pin HIGH<br />GPIO_SetBits(PCD8544_RST_PORT, PCD8544_RST_PIN);<br /><br />//CE HIGH<br />PCD8544_CE_HIGH;<br /><br />//Initialize SPI<br />TM_SPI1_Init();<br />}<br /><br />void PCD8544_send(unsigned char data) {<br />PCD8544_CE_LOW;<br />TM_SPI_Send(PCD8544_SPI, data);<br />PCD8544_CE_HIGH;<br />}<br /><br />void PCD8544_Pin(PCD8544_Pin_t pin, PCD8544_State_t state) {<br />switch (pin) {<br />case PCD8544_Pin_DC:<br />if (state != PCD8544_State_Low) {<br />GPIO_SetBits(PCD8544_DC_PORT, PCD8544_DC_PIN);<br />} else {<br />GPIO_ResetBits(PCD8544_DC_PORT, PCD8544_DC_PIN);<br />}<br />break;<br />case PCD8544_Pin_RST:<br />if (state != PCD8544_State_Low) {<br />GPIO_SetBits(PCD8544_RST_PORT, PCD8544_RST_PIN);<br />} else {<br />GPIO_ResetBits(PCD8544_RST_PORT, PCD8544_RST_PIN);<br />}<br />break;<br />default: break;<br />}<br />}<br /><br /><br />void PCD8544_Delay(unsigned long micros) {<br />volatile unsigned long i;<br />for (i = 0; i &lt; micros; i++) {<br /><br />}<br />}<br /><br />void PCD8544_Init(unsigned char contrast) {<br />//Initialize IO's<br />PCD8544_InitIO();<br />//Reset<br />PCD8544_Pin(PCD8544_Pin_RST, PCD8544_State_Low);<br />PCD8544_Delay(10000);<br />PCD8544_Pin(PCD8544_Pin_RST, PCD8544_State_High);<br /><br />// Go in extended mode<br />PCD8544_Write(PCD8544_COMMAND, PCD8544_FUNCTIONSET | PCD8544_EXTENDEDINSTRUCTION);<br /><br />// LCD bias select<br />PCD8544_Write(PCD8544_COMMAND, PCD8544_SETBIAS | 0x4);<br /><br />// set VOP<br />if (contrast &gt; 0x7F) {<br />contrast = 0x7F;<br />}<br />PCD8544_Write(PCD8544_COMMAND, PCD8544_SETVOP | contrast);<br /><br />// normal mode<br />PCD8544_Write(PCD8544_COMMAND, PCD8544_FUNCTIONSET);<br /><br />// Set display to Normal<br />PCD8544_Write(PCD8544_COMMAND, PCD8544_DISPLAYCONTROL | PCD8544_DISPLAYNORMAL);<br /><br />//Set cursor to home position<br />PCD8544_Home();<br /><br />//Normal display<br />PCD8544_Write(PCD8544_COMMAND, PCD8544_DISPLAYCONTROL | PCD8544_DISPLAYNORMAL);<br /><br />//Clear display<br />PCD8544_Clear();<br />}<br /><br />void PCD8544_Write(PCD8544_WriteType_t cd, unsigned char data) {<br />switch (cd) {<br />//Send data to lcd's ram<br />case PCD8544_DATA:<br />//Set DC pin HIGH<br />PCD8544_Pin(PCD8544_Pin_DC, PCD8544_State_High);<br />break;<br />//Send command to lcd<br />case PCD8544_COMMAND:<br />//Set DC pin LOW<br />PCD8544_Pin(PCD8544_Pin_DC, PCD8544_State_Low);<br />break;<br />default: break;<br />}<br />//Send data<br />PCD8544_send(data);<br />}<br /><br />void PCD8544_SetContrast(unsigned char contrast) {<br />// Go in extended mode<br />PCD8544_Write(PCD8544_COMMAND, PCD8544_FUNCTIONSET | PCD8544_EXTENDEDINSTRUCTION);<br /><br />// set VOP<br />if (contrast &gt; 0x7F) {<br />contrast = 0x7F;<br />}<br />PCD8544_Write(PCD8544_COMMAND, PCD8544_SETVOP | contrast);<br /><br />// normal mode<br />PCD8544_Write(PCD8544_COMMAND, PCD8544_FUNCTIONSET);<br />}<br /><br />void PCD8544_DrawPixel(unsigned char x, unsigned char y, PCD8544_Pixel_t pixel) {<br />if (x &gt;= PCD8544_WIDTH) {<br />return;<br />}<br />if (y &gt;= PCD8544_HEIGHT) {<br />return;<br />}<br /><br />if (pixel != PCD8544_Pixel_Clear) {<br />PCD8544_Buffer&#91;x + (y / 8) * PCD8544_WIDTH&#93; |= 1 &lt;&lt; (y % 8);<br />} else {<br />PCD8544_Buffer&#91;x + (y / 8) * PCD8544_WIDTH&#93; &amp;= ~(1 &lt;&lt; (y % 8));<br />}<br />PCD8544_UpdateArea(x, y, x, y);<br />}<br /><br />void PCD8544_Invert(PCD8544_Invert_t invert) {<br />if (invert != PCD8544_Invert_No) {<br />PCD8544_Write(PCD8544_COMMAND, PCD8544_DISPLAYCONTROL | PCD8544_DISPLAYINVERTED);<br />} else {<br />PCD8544_Write(PCD8544_COMMAND, PCD8544_DISPLAYCONTROL | PCD8544_DISPLAYNORMAL);<br />}<br />}<br /><br />void PCD8544_Clear(void) {<br />unsigned int i;<br />PCD8544_Home();<br />for (i = 0; i &lt; PCD8544_BUFFER_SIZE; i++) {<br />PCD8544_Buffer&#91;i&#93; = 0x00;<br />//PCD8544_Write(PCD8544_DATA, 0x00);<br />}<br />PCD8544_GotoXY(0, 0);<br />PCD8544_UpdateArea(0, 0, PCD8544_WIDTH - 1, PCD8544_HEIGHT - 1);<br />PCD8544_Refresh();<br />}<br /><br />void PCD8544_Home(void) {<br />PCD8544_Write(PCD8544_COMMAND, PCD8544_SETXADDR | 0);<br />PCD8544_Write(PCD8544_COMMAND, PCD8544_SETYADDR | 0);<br />}<br /><br />void PCD8544_Refresh(void) {<br />unsigned char i, j;<br />for (i = 0; i &lt; 6; i++) {<br />//Not in range yet<br />if (PCD8544_UpdateYmin &gt; ((i + 1) * 8)) {<br />continue;<br />}<br />//Over range, stop<br />if ((i * 8) &gt; PCD8544_UpdateYmax) {<br />break;<br />}<br /><br />PCD8544_Write(PCD8544_COMMAND, PCD8544_SETYADDR | i);<br />PCD8544_Write(PCD8544_COMMAND, PCD8544_SETXADDR | PCD8544_UpdateXmin);<br /><br />for (j = PCD8544_UpdateXmin; j &lt;= PCD8544_UpdateXmax; j++) {<br />PCD8544_Write(PCD8544_DATA, PCD8544_Buffer&#91;(i * PCD8544_WIDTH) + j&#93;);<br />}<br />}<br /><br />PCD8544_UpdateXmin = PCD8544_WIDTH - 1;<br />PCD8544_UpdateXmax = 0;<br />PCD8544_UpdateYmin = PCD8544_HEIGHT - 1;<br />PCD8544_UpdateYmax = 0;<br />}<br /><br />void PCD8544_UpdateArea(unsigned char xMin, unsigned char yMin, unsigned char xMax, unsigned char yMax) {<br />if (xMin &lt; PCD8544_UpdateXmin) {<br />PCD8544_UpdateXmin = xMin;<br />}<br />if (xMax &gt; PCD8544_UpdateXmax) {<br />PCD8544_UpdateXmax = xMax;<br />}<br />if (yMin &lt; PCD8544_UpdateYmin) {<br />PCD8544_UpdateYmin = yMin;<br />}<br />if (yMax &gt; PCD8544_UpdateYmax) {<br />PCD8544_UpdateYmax = yMax;<br />}<br />}<br /><br />void PCD8544_GotoXY(unsigned char x, unsigned char y) {<br />PCD8544_x = x;<br />PCD8544_y = y;<br />}<br /><br />void PCD8544_Putc(char c, PCD8544_Pixel_t color, PCD8544_FontSize_t size) {<br />unsigned char c_height, c_width, i, b, j;<br />if (size == PCD8544_FontSize_3x5) {<br />c_width = PCD8544_CHAR3x5_WIDTH;<br />c_height = PCD8544_CHAR3x5_HEIGHT;<br />} else {<br />c_width = PCD8544_CHAR5x7_WIDTH;<br />c_height = PCD8544_CHAR5x7_HEIGHT;<br />}<br />if ((PCD8544_x + c_width) &gt; PCD8544_WIDTH) {<br />//If at the end of a line of display, go to new line and set x to 0 position<br />PCD8544_y += c_height;<br />PCD8544_x = 0;<br />}<br />for (i = 0; i &lt; c_width - 1; i++) {<br />if (c &lt; 32) {<br />//b = _custom_chars&#91;_font_size&#93;&#91;(uint8_t)chr&#93;&#91;i&#93;;<br />} else if (size == PCD8544_FontSize_3x5) {<br />b = PCD8544_Font3x5&#91;c - 32&#93;&#91;i&#93;;<br />} else {<br />b = PCD8544_Font5x7&#91;c - 32&#93;&#91;i&#93;;<br />}<br />if (b == 0x00 &amp;&amp; (c != 0 &amp;&amp; c != 32)) {<br />continue;<br />}<br />for (j = 0; j &lt; c_height; j++) {<br />if (color == PCD8544_Pixel_Set) {<br />PCD8544_DrawPixel(PCD8544_x, (PCD8544_y + j), ((b &gt;&gt; j) &amp; 1) ? PCD8544_Pixel_Set : PCD8544_Pixel_Clear);<br />} else {<br />PCD8544_DrawPixel(PCD8544_x, (PCD8544_y + j), ((b &gt;&gt; j) &amp; 1) ? PCD8544_Pixel_Clear : PCD8544_Pixel_Set);<br />}<br />}<br />PCD8544_x++;<br />}<br />PCD8544_x++;<br />}<br /><br />void PCD8544_Puts(char *c, PCD8544_Pixel_t color, PCD8544_FontSize_t size) {<br />while (*c) {<br />PCD8544_Putc(*c++, color, size);<br />}<br />}<br /><br />void PCD8544_DrawLine(unsigned char x0, unsigned char y0, unsigned char x1, unsigned char y1, PCD8544_Pixel_t color) {<br />short dx, dy;<br />short temp;<br /><br />if (x0 &gt; x1) {<br />temp = x1;<br />x1 = x0;<br />x0 = temp;<br />}<br />if (y0 &gt; y1) {<br />temp = y1;<br />y1 = y0;<br />y0 = temp;<br />}<br /><br />dx = x1 - x0;<br />dy = y1 - y0;<br /><br />if (dx == 0) {<br />do {<br />PCD8544_DrawPixel(x0, y0, color);<br />y0++;<br />} while (y1 &gt;= y0);<br />return;<br />}<br />if (dy == 0) {<br />do {<br />PCD8544_DrawPixel(x0, y0, color);<br />x0++;<br />} while (x1 &gt;= x0);<br />return;<br />}<br /><br />/* Based on Bresenham's line algorithm  */<br />if (dx &gt; dy) {<br />temp = 2 * dy - dx;<br />while (x0 != x1) {<br />PCD8544_DrawPixel(x0, y0, color);<br />x0++;<br />if (temp &gt; 0) {<br />y0++;<br />temp += 2 * dy - 2 * dx;<br />} else {<br />temp += 2 * dy;<br />}<br />}<br />PCD8544_DrawPixel(x0, y0, color);<br />} else {<br />temp = 2 * dx - dy;<br />while (y0 != y1) {<br />PCD8544_DrawPixel(x0, y0, color);<br />y0++;<br />if (temp &gt; 0) {<br />x0++;<br />temp += 2 * dy - 2 * dx;<br />} else {<br />temp += 2 * dy;<br />}<br />}<br />PCD8544_DrawPixel(x0, y0, color);<br />}<br />}<br /><br />void PCD8544_DrawRectangle(unsigned char x0, unsigned char y0, unsigned char x1, unsigned char y1, PCD8544_Pixel_t color) {<br />PCD8544_DrawLine(x0, y0, x1, y0, color); //Top<br />PCD8544_DrawLine(x0, y0, x0, y1, color);//Left<br />PCD8544_DrawLine(x1, y0, x1, y1, color);//Right<br />PCD8544_DrawLine(x0, y1, x1, y1, color);//Bottom<br />}<br /><br />void PCD8544_DrawFilledRectangle(unsigned char x0, unsigned char y0, unsigned char x1, unsigned char y1, PCD8544_Pixel_t color) {<br />for (; y0 &lt; y1; y0++) {<br />PCD8544_DrawLine(x0, y0, x1, y0, color);<br />}<br />}<br /><br />void PCD8544_DrawCircle(char x0, char y0, char r, PCD8544_Pixel_t color) {<br />int16_t f = 1 - r;<br />int16_t ddF_x = 1;<br />int16_t ddF_y = -2 * r;<br />int16_t x = 0;<br />int16_t y = r;<br /><br />    PCD8544_DrawPixel(x0, y0 + r, color);<br />    PCD8544_DrawPixel(x0, y0 - r, color);<br />    PCD8544_DrawPixel(x0 + r, y0, color);<br />    PCD8544_DrawPixel(x0 - r, y0, color);<br /><br />    while (x &lt; y) {<br />        if (f &gt;= 0) {<br />            y--;<br />            ddF_y += 2;<br />            f += ddF_y;<br />        }<br />        x++;<br />        ddF_x += 2;<br />        f += ddF_x;<br /><br />        PCD8544_DrawPixel(x0 + x, y0 + y, color);<br />        PCD8544_DrawPixel(x0 - x, y0 + y, color);<br />        PCD8544_DrawPixel(x0 + x, y0 - y, color);<br />        PCD8544_DrawPixel(x0 - x, y0 - y, color);<br /><br />        PCD8544_DrawPixel(x0 + y, y0 + x, color);<br />        PCD8544_DrawPixel(x0 - y, y0 + x, color);<br />        PCD8544_DrawPixel(x0 + y, y0 - x, color);<br />        PCD8544_DrawPixel(x0 - y, y0 - x, color);<br />    }<br />}<br /><br />void PCD8544_DrawFilledCircle(char x0, char y0, char r, PCD8544_Pixel_t color) {<br />int16_t f = 1 - r;<br />int16_t ddF_x = 1;<br />int16_t ddF_y = -2 * r;<br />int16_t x = 0;<br />int16_t y = r;<br /><br />    PCD8544_DrawPixel(x0, y0 + r, color);<br />    PCD8544_DrawPixel(x0, y0 - r, color);<br />    PCD8544_DrawPixel(x0 + r, y0, color);<br />    PCD8544_DrawPixel(x0 - r, y0, color);<br />    PCD8544_DrawLine(x0 - r, y0, x0 + r, y0, color);<br /><br />    while (x &lt; y) {<br />        if (f &gt;= 0) {<br />            y--;<br />            ddF_y += 2;<br />            f += ddF_y;<br />        }<br />        x++;<br />        ddF_x += 2;<br />        f += ddF_x;<br /><br />        PCD8544_DrawLine(x0 - x, y0 + y, x0 + x, y0 + y, color);<br />        PCD8544_DrawLine(x0 + x, y0 - y, x0 - x, y0 - y, color);<br /><br />        PCD8544_DrawLine(x0 + y, y0 + x, x0 - y, y0 + x, color);<br />        PCD8544_DrawLine(x0 + y, y0 - x, x0 - y, y0 - x, color);<br />    }<br />}[/syntax]<br /><br />Biblioteki znalazłem w internecie i troszkę zmodyfikowałem ponieważ były pod inny stm32f4 i teraz nie wiem czy mam dobrze skonfigurowaną magistralę SPI czy problem leży po stronie drugiej biblioteki choć niby tam nie było dużo zmieniane jedynie konfigruacja GPIO i zegarów czy może problem jest po stronie wyświetlacza. Objawy są takie, że od czasu do czasu wyświetlacz zalapie, że ma działać, ustawi sobie kontrast i zaświci kilka losowych pikseli, a starając się wyświetlić napis wyświetli go w dobrym miejscu, ale tak w 90%, ale częściej jednak wogóle nie zadziała. Mógłby mi ktoś pomóc rozgryźć ten problem <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" />?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4976">bartiszosti</a> — 17 wrz 2014, o 23:51</p><hr />
]]></content>
</entry>
</feed>