论坛元老
 
- 积分
- 7344
- 金钱
- 7344
- 注册时间
- 2016-2-6
- 在线时间
- 1863 小时
|

楼主 |
发表于 2016-6-12 00:22:05
|
显示全部楼层
顺便贴一段SSD1309驱动的OLED驱动程序,我在网上找了好长时间都没有找到可以使用的,希望对大家有帮助。
void SSD1309_IO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStruct.GPIO_Pin =GPIO_Pin_3 |GPIO_Pin_5;
GPIO_InitStruct.GPIO_Speed =GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode =GPIO_Mode_AF_PP;
GPIO_Init(GPIOB, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin =GPIO_Pin_15;
GPIO_InitStruct.GPIO_Mode =GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_SetBits(GPIOA, GPIO_Pin_15);
GPIO_InitStruct.GPIO_Pin =CMD_DATA_SEL_PIN;
GPIO_InitStruct.GPIO_Mode =GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStruct);
GPIO_SetBits(GPIOB, CMD_DATA_SEL_PIN);
}
void SSD1309_SPI_Configuration(void)
{
SPI_InitTypeDef SPI_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
SPI_I2S_DeInit(SPI1);
SPI_InitStruct.SPI_Direction =SPI_Direction_1Line_Tx;
SPI_InitStruct.SPI_Mode =SPI_Mode_Master;
SPI_InitStruct.SPI_DataSize =SPI_DataSize_8b;
SPI_InitStruct.SPI_CPOL =SPI_CPOL_High; //′®DDí¬2½ê±ÖóμÄ¿ÕÏD×′ì¬Îa¸ßμçÆ½
SPI_InitStruct.SPI_CPHA =SPI_CPHA_2Edge; //μú¶t¸öìø±äÑØêy¾Y±»2é¼ˉ
SPI_InitStruct.SPI_NSS =SPI_NSS_Soft;
SPI_InitStruct.SPI_BaudRatePrescaler =SPI_BaudRatePrescaler_32;
SPI_InitStruct.SPI_FirstBit =SPI_FirstBit_MSB;
SPI_InitStruct.SPI_CRCPolynomial =7;
SPI_Init(SPI1, &SPI_InitStruct);
SPI_Cmd(SPI1, ENABLE);
}
void SSD1309_ByteSend(uint8_t uCmdOrData, uint8_t uData)
{
if(uCmdOrData ==OLED_COMMAND)
SEND_OLED_CMD();
else
SEND_OLED_DATA();
GPIO_ResetBits(GPIOA, GPIO_Pin_15);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) ==RESET)
;
SPI_I2S_SendData(SPI1, uData);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) !=RESET)
;
GPIO_SetBits(GPIOA, GPIO_Pin_15);
}
void OLED_Address(uint8_t uPage, uint8_t uData)
{
SSD1309_ByteSend(OLED_COMMAND, uPage +0xb0);
SSD1309_ByteSend(OLED_COMMAND, ((uData >>4) &0x0f) +0x10);
SSD1309_ByteSend(OLED_COMMAND, uData &0x0f);
}
void OLED_FullDisp(uint16_t uData16)
{
uint8_t i, j;
for(i =0; i <8; i++)
{
OLED_Address(i, 0);
for(j =0; j <64; j++)
{
SSD1309_ByteSend(OLED_DATA, (uData16 >>8) &0x00ff);
SSD1309_ByteSend(OLED_DATA, uData16 &0x00ff);
}
}
}
void OLED_DisplayFullPicture(uint8_t *uPtr)
{
uint8_t i, j;
for(i =0; i <8; i++)
{
OLED_Address(i, 0);
for(j =0; j <128; j++, uPtr++)
SSD1309_ByteSend(OLED_DATA, *uPtr);
}
}
void OLED_16x16CharDisplay(uint8_t uPage, uint8_t uColumn, uint8_t *uPtr)
{
uint8_t i, j;
for(i =0; i <2; i++)
{
OLED_Address(uPage +i, uColumn);
for(j =0; j <16; j++, uPtr++)
SSD1309_ByteSend(OLED_DATA, *uPtr);
}
}
void OLED_12x12CharDisplay(uint8_t uPage, uint8_t uColumn, uint8_t *uPtr)
{
uint8_t i, j;
for(i =0; i <2; i++)
{
OLED_Address(uPage +i, uColumn);
for(j =0; j <12; j++, uPtr++)
SSD1309_ByteSend(OLED_DATA, *uPtr);
}
}
void StartMenu(void)
{
uint8_t i;
uint8_t *uPtr;
for(i =0, uPtr =ChineseChar[0]; i <8; i++, uPtr +=32)
OLED_16x16CharDisplay(2, i *16, uPtr);
for(i =0, uPtr =UnitChar[0]; i <8; i++, uPtr +=24)
OLED_12x12CharDisplay(5, i *12 +16, uPtr);
}
void OLED_Initial(void)
{
SSD1309_IO_Init();
SSD1309_SPI_Configuration();
SSD1309_ByteSend(OLED_COMMAND, OLED_DISPLAY_OFF);
SSD1309_ByteSend(OLED_COMMAND, 0xd5); //éèÖÃOLEDÄ£¿é¾§ÕñÆμÂê
SSD1309_ByteSend(OLED_COMMAND, 0x70);
SSD1309_ByteSend(OLED_COMMAND, 0x8d); //ÔêDíéyÑ1
SSD1309_ByteSend(OLED_COMMAND, 0x14);
SSD1309_ByteSend(OLED_COMMAND, 0x81); //¶Ô±è¶è΢μ÷£¬′Ëêy¾Y0x812»¸Ä±ä£¬½ö¸Ä±äÏÂÃæμÄêyÖμ
SSD1309_ByteSend(OLED_COMMAND, 0x80); //¶Ô±è¶è΢μ÷êyÖ죬0x00-0xff
SSD1309_ByteSend(OLED_COMMAND, 0xa6); //éèÖÃÎaÕy3£ÏÔê¾
SSD1309_ByteSend(OLED_COMMAND, 0xa4); //ÏÔê¾Îa3£1æÏÔê¾
SSD1309_ByteSend(OLED_COMMAND, 0xa8); //éèÖÃDuty
SSD1309_ByteSend(OLED_COMMAND, 0x3f); //Duty =1/64
SSD1309_ByteSend(OLED_COMMAND, 0xd3); //éèÖÃÆ«òÆ
SSD1309_ByteSend(OLED_COMMAND, 0x00);
SSD1309_ByteSend(OLED_COMMAND, 0x20); //ò3ѰַÄ£ê½
SSD1309_ByteSend(OLED_COMMAND, 0x02);
SSD1309_ByteSend(OLED_COMMAND, 0xc8); //DDé¨Ãè£o′óéÏÖáÏÂ
SSD1309_ByteSend(OLED_COMMAND, 0xa1); //áDé¨Ãè£o′ó×óÖáóò
SSD1309_ByteSend(OLED_COMMAND, 0xda); //Ë3DòéèÖÃ
SSD1309_ByteSend(OLED_COMMAND, 0x12);
SSD1309_ByteSend(OLED_COMMAND, 0xd9); //éèÖÃÔ¤3äμçÖüÆú
SSD1309_ByteSend(OLED_COMMAND, 0x22);
SSD1309_ByteSend(OLED_COMMAND, 0xdb); //éèÖÃVCOMHÖμ
SSD1309_ByteSend(OLED_COMMAND, 0x3c);
SSD1309_ByteSend(OLED_COMMAND, OLED_DISPLAY_ON);
SSD1309_ByteSend(OLED_COMMAND, 0x40); //éèÖÃÆeê¼DD
OLED_ScreenClear();
StartMenu();
}
|
|