simplegui/Transplant/MiniDevCore/BSP/src/uc1604c_softspi.c
Polarix 0260cd7aa2 2020-01-31:
BSP代码中提供UC1604C的驱动程序。
订正了GB2312资源文件的编码错误。
删除一些混杂的备份文件。
2020-01-31 00:11:38 +08:00

238 lines
8.3 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "uc1604c_softspi.h"
#include <stm32f10x_gpio.h>
#include <stdint.h>
#include <stddef.h>
#define SPI_UC1604C_CTRL SPI2
#define SPI_UC1604C_APBxClock_FUN RCC_APB1PeriphClockCmd
#define SPI_UC1604C_CLK RCC_APB1Periph_SPI2
#define SPI_UC1604C_GPIO_APBxClock_FUN RCC_APB2PeriphClockCmd
#define SPI_UC1604C_GPIO_CLK RCC_APB2Periph_GPIOD
#define SPI_UC1604C_GPIO_PORT GPIOD
//RST
#define SPI_UC1604C_RST_PIN GPIO_Pin_1
#define SPI_UC1604C_RST_LOW() GPIO_ResetBits(SPI_UC1604C_GPIO_PORT, SPI_UC1604C_RST_PIN)
#define SPI_UC1604C_RST_HIGH() GPIO_SetBits(SPI_UC1604C_GPIO_PORT, SPI_UC1604C_RST_PIN)
//DC
#define SPI_UC1604C_DC_PIN GPIO_Pin_0
#define SPI_UC1604C_DC_LOW() GPIO_ResetBits(SPI_UC1604C_GPIO_PORT, SPI_UC1604C_DC_PIN)
#define SPI_UC1604C_DC_HIGH() GPIO_SetBits(SPI_UC1604C_GPIO_PORT, SPI_UC1604C_DC_PIN)
#define SPI_UC1604C_MODE_CMD() SPI_UC1604C_DC_LOW()
#define SPI_UC1604C_MODE_DAT() SPI_UC1604C_DC_HIGH()
//CS(NSS)
#define SPI_UC1604C_CS_PIN GPIO_Pin_2
#define SPI_UC1604C_CS_LOW() GPIO_ResetBits(SPI_UC1604C_GPIO_PORT, SPI_UC1604C_CS_PIN)
#define SPI_UC1604C_CS_HIGH() GPIO_SetBits(SPI_UC1604C_GPIO_PORT, SPI_UC1604C_CS_PIN)
#define SPI_UC1604C_CS_ENABLE() SPI_UC1604C_CS_LOW()
#define SPI_UC1604C_CS_DISABLE() SPI_UC1604C_CS_HIGH()
//SCLK
#define SPI_UC1604C_SCLK_PIN GPIO_Pin_4
#define SPI_UC1604C_SCLK_LOW() GPIO_ResetBits(SPI_UC1604C_GPIO_PORT, SPI_UC1604C_SCLK_PIN)
#define SPI_UC1604C_SCLK_HIGH() GPIO_SetBits(SPI_UC1604C_GPIO_PORT, SPI_UC1604C_SCLK_PIN)
//MOSI
#define SPI_UC1604C_MOSI_PIN GPIO_Pin_3
#define SPI_UC1604C_MOSI_LOW() GPIO_ResetBits(SPI_UC1604C_GPIO_PORT, SPI_UC1604C_MOSI_PIN)
#define SPI_UC1604C_MOSI_HIGH() GPIO_SetBits(SPI_UC1604C_GPIO_PORT, SPI_UC1604C_MOSI_PIN)
static void UC1604C_InitializeGPIO(void);
static void UC1604C_WriteByte(uint8_t uiData);
static void UC1604C_WriteCommand(uint8_t uiCommand);
void UC1604C_Delay(uint32_t uiDelay)
{
/*----------------------------------*/
/* Variable Declaration */
/*----------------------------------*/
uint32_t uiDelayTime;
/*----------------------------------*/
/* Process */
/*----------------------------------*/
while(uiDelay--)
{
uiDelayTime = 1000;
while(--uiDelayTime);
}
}
/*****************************************************************************/
/** Function Name: UC1604C_InitializeGPIO. **/
/** Purpose: Initialize GPIO for SPI Pin. **/
/** Params: None. **/
/** Return: None. **/
/*****************************************************************************/
void UC1604C_InitializeGPIO(void)
{
// Initialize data structure.
GPIO_InitTypeDef GPIO_InitStructure;
// Initialize GPIO.
SPI_UC1604C_GPIO_APBxClock_FUN(SPI_UC1604C_GPIO_CLK, ENABLE);
// Enable GPIO.
GPIO_InitStructure.GPIO_Pin = SPI_UC1604C_RST_PIN|SPI_UC1604C_DC_PIN|SPI_UC1604C_CS_PIN|SPI_UC1604C_SCLK_PIN|SPI_UC1604C_MOSI_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(SPI_UC1604C_GPIO_PORT, &GPIO_InitStructure);
GPIO_SetBits(SPI_UC1604C_GPIO_PORT, SPI_UC1604C_DC_PIN|SPI_UC1604C_CS_PIN|SPI_UC1604C_SCLK_PIN|SPI_UC1604C_MOSI_PIN);
GPIO_ResetBits(SPI_UC1604C_GPIO_PORT, SPI_UC1604C_RST_PIN);
}
/*****************************************************************************/
/** Function Name: UC1604C_WriteByte. **/
/** Purpose: Simulate SPI communication timing to write a byte to **/
/** LCD controller. **/
/** Params: **/
/** @ uiData: Byte will be write. **/
/** Return: None. **/
/*****************************************************************************/
void UC1604C_WriteByte(uint8_t uiByte)
{
/*----------------------------------*/
/* Variable Declaration */
/*----------------------------------*/
uint16_t i;
uint8_t uiSendByte;
/*----------------------------------*/
/* Process */
/*----------------------------------*/
uiSendByte = uiByte;
SPI_UC1604C_CS_LOW();
for(i=0;i<8;i++)
{
if(uiSendByte & 0x80)
{
SPI_UC1604C_MOSI_HIGH();
}
else
{
SPI_UC1604C_MOSI_LOW();
}
SPI_UC1604C_SCLK_LOW();
SPI_UC1604C_SCLK_HIGH();
uiSendByte <<= 1;
}
SPI_UC1604C_CS_HIGH();
}
/*****************************************************************************/
/** Function Name: UC1604C_WriteData. **/
/** Purpose: Write a data byte to OLED coltroler. **/
/** Resources: None. **/
/** Params: **/
/** @ uiData: One byte data will be write. **/
/** Return: None. **/
/*****************************************************************************/
void UC1604C_WriteData(uint8_t uiData)
{
/*----------------------------------*/
/* Process */
/*----------------------------------*/
SPI_UC1604C_MODE_DAT();
UC1604C_WriteByte(uiData);
}
/*****************************************************************************/
/** Function Name: UC1604C_WriteCommand. **/
/** Purpose: Write a command byte to OLED coltroler. **/
/** Resources: None. **/
/** Params: **/
/** @ uiData: One byte command will be write. **/
/** Return: None. **/
/*****************************************************************************/
void UC1604C_WriteCommand(uint8_t uiCommand)
{
/*----------------------------------*/
/* Process */
/*----------------------------------*/
SPI_UC1604C_MODE_CMD();
UC1604C_WriteByte(uiCommand);
}
/*****************************************************************************/
/** Function Name: UC1604C_SetPosition. **/
/** Purpose: Set current position of page and colomn. **/
/** Resources: None. **/
/** Params: **/
/** @ uiColumn: Position of column. **/
/** @ uiPage: Position of page. **/
/** Return: None. **/
/*****************************************************************************/
void UC1604C_SetPosition(uint8_t uiColumn, uint8_t uiPage)
{
/*----------------------------------*/
/* Process */
/*----------------------------------*/
UC1604C_WriteCommand(0xB0 | uiPage);
UC1604C_WriteCommand(((uiColumn & 0xF0)>>4)|0x10);
UC1604C_WriteCommand((uiColumn & 0x0F));
}
/*****************************************************************************/
/** Function Name: UC1604C_Fill. **/
/** Purpose: Fill screen. **/
/** Params: **/
/** @ uiByte: Filled data. **/
/** Return: None. **/
/*****************************************************************************/
void UC1604C_Fill(uint8_t uiByte)//全屏填充
{
/*----------------------------------*/
/* Variable Declaration */
/*----------------------------------*/
uint8_t uiPage, uiColumn;
/*----------------------------------*/
/* Process */
/*----------------------------------*/
for(uiPage=0; uiPage<PAGE_MAX; uiPage++)
{
UC1604C_WriteCommand(0xB0 | uiPage);
UC1604C_WriteCommand(0x01);
UC1604C_WriteCommand(0x10);
for(uiColumn=0; uiColumn<COLUMN_MAX; uiColumn++)
{
UC1604C_WriteData(uiByte);
}
}
}
/*****************************************************************************/
/** Function Name: UC1604C_Initialize **/
/** Purpose: Run the device initialize sequence. **/
/** Resources: None. **/
/** Params: None. **/
/** Return: None. **/
/** Notice: Initialize sequence must executed after power on 500ms. **/
/*****************************************************************************/
void UC1604C_Initialize(void)
{
/*----------------------------------*/
/* Process */
/*----------------------------------*/
UC1604C_InitializeGPIO();
// Reset
SPI_UC1604C_RST_LOW();
UC1604C_Delay(100);
SPI_UC1604C_RST_HIGH();
UC1604C_Delay(800);
SPI_UC1604C_CS_ENABLE();
// Soft reset.
UC1604C_WriteCommand(0xE2);
UC1604C_Delay(100);
// Enable internal boost.
UC1604C_WriteCommand(0x2F);
UC1604C_Delay(100);
UC1604C_WriteCommand(0x81); //微调对比度
UC1604C_WriteCommand(0x56); //微调对比度的值可设置范围0x000xFF
UC1604C_WriteCommand(0xEB); //1/9偏压比bias
UC1604C_WriteCommand(0xC2); //行列扫描顺序:从上到下 oxc2
UC1604C_WriteCommand(0xAF); //开显示
}