1. uart 완료
2. oled display 출력 완료
master
imbis 6 months ago
parent e562e43699
commit c470ec2102

@ -0,0 +1,10 @@
{
"files.associations": {
"board_config.h": "c",
"mxc_sys.h": "c",
"mxc_delay.h": "c",
"system_func.h": "c",
"ssd1306_i2c.h": "c",
"font.h": "c"
}
}

@ -0,0 +1,257 @@
#include "app_gpio_i2c.h"
#define APP_GPIO_I2C_SDA_PORT PORT_0
#define APP_GPIO_I2C_SDA_PIN PIN_9
#define APP_GPIO_I2C_SDA_OUTPUT App_Gpio_I2C_Port_Output(APP_GPIO_I2C_SDA_PORT, APP_GPIO_I2C_SDA_PIN)
#define APP_GPIO_I2C_SDA_INPUT App_Gpio_I2C_Port_Input(APP_GPIO_I2C_SDA_PORT, APP_GPIO_I2C_SDA_PIN)
#define APP_GPIO_I2C_SDA_H App_Gpio_I2C_Port_H(APP_GPIO_I2C_SDA_PORT, APP_GPIO_I2C_SDA_PIN)
#define APP_GPIO_I2C_SDA_L App_Gpio_I2C_Port_L(APP_GPIO_I2C_SDA_PORT, APP_GPIO_I2C_SDA_PIN)
#define APP_GPIO_I2C_READ App_Gpio_I2C_Port_Read(APP_GPIO_I2C_SDA_PORT, APP_GPIO_I2C_SDA_PIN)
#define APP_GPIO_I2C_SCL_PORT PORT_0
#define APP_GPIO_I2C_SCL_PIN PIN_8
#define APP_GPIO_I2C_SCL_H App_Gpio_I2C_Port_H(APP_GPIO_I2C_SCL_PORT, APP_GPIO_I2C_SCL_PIN)
#define APP_GPIO_I2C_SCL_L App_Gpio_I2C_Port_L(APP_GPIO_I2C_SCL_PORT, APP_GPIO_I2C_SCL_PIN)
static void App_Gpio_I2C_Port_Output(uint32_t Port, uint32_t Pin);
static void App_Gpio_I2C_Port_Input(uint32_t Port, uint32_t Pin);
static bool App_Gpio_I2C_Port_Read(uint32_t Port, uint32_t Pin);
static void App_Gpio_I2C_Port_H(uint32_t Port, uint32_t Pin);
static void App_Gpio_I2C_Port_L(uint32_t Port, uint32_t Pin);
static void App_Gpio_I2C_Delay(void);
static uint32_t DelayCount;
void App_Gpio_I2C_Initialization(uint32_t Frequency)
{
SYS_ClockEnable(SYS_PERIPH_CLOCK_GPIO0);
App_Gpio_I2C_Port_Output(APP_GPIO_I2C_SDA_PORT, APP_GPIO_I2C_SDA_PIN);
App_Gpio_I2C_Port_Output(APP_GPIO_I2C_SCL_PORT, APP_GPIO_I2C_SCL_PIN);
APP_GPIO_I2C_SDA_H;
APP_GPIO_I2C_SCL_H;
DelayCount = (1000000 / Frequency) + 1;
App_Gpio_I2C_Stop();
}
void App_Gpio_I2C_Start(void)
{
App_Gpio_I2C_Delay();
APP_GPIO_I2C_SDA_H;
APP_GPIO_I2C_SCL_H;
App_Gpio_I2C_Delay();
APP_GPIO_I2C_SDA_L;
App_Gpio_I2C_Delay();
APP_GPIO_I2C_SCL_L;
App_Gpio_I2C_Delay();
}
bool App_Gpio_I2C_WriteData(uint8_t TxData)
{
uint8_t i;
bool bRet;
APP_GPIO_I2C_SDA_OUTPUT;
for(i = 0 ; i < 8 ; i++)
{
if((TxData & 0x80)==0x80)
{
APP_GPIO_I2C_SDA_H;
}
else
{
APP_GPIO_I2C_SDA_L;
}
TxData<<=1;
App_Gpio_I2C_Delay();
APP_GPIO_I2C_SCL_H;
App_Gpio_I2C_Delay();
APP_GPIO_I2C_SCL_L;
App_Gpio_I2C_Delay();
}
APP_GPIO_I2C_SDA_INPUT;
APP_GPIO_I2C_SCL_H;
App_Gpio_I2C_Delay();
bRet = APP_GPIO_I2C_READ;
App_Gpio_I2C_Delay();
APP_GPIO_I2C_SCL_L;
return bRet;
}
bool App_Gpio_I2C_ReadData(uint8_t* pRxData, bool isAck)
{
bool bRet;
uint8_t i;
uint8_t Ret = 0x00;
APP_GPIO_I2C_SDA_INPUT;
for(i = 0 ; i < 8 ; i++)
{
APP_GPIO_I2C_SCL_H;
App_Gpio_I2C_Delay();
Ret <<= 1;
if(APP_GPIO_I2C_READ != 0)
{
Ret |= 0x01;
}
APP_GPIO_I2C_SCL_L;
App_Gpio_I2C_Delay();
}
APP_GPIO_I2C_SDA_OUTPUT;
if(isAck == true)
{
APP_GPIO_I2C_SDA_L;
}
else
{
APP_GPIO_I2C_SDA_H;
}
APP_GPIO_I2C_SCL_H;
App_Gpio_I2C_Delay();
APP_GPIO_I2C_SCL_L;
App_Gpio_I2C_Delay();
return bRet;
}
void App_Gpio_I2C_Stop(void)
{
APP_GPIO_I2C_SDA_L;
APP_GPIO_I2C_SDA_OUTPUT;
APP_GPIO_I2C_SDA_L;
App_Gpio_I2C_Delay();
APP_GPIO_I2C_SCL_H;
App_Gpio_I2C_Delay();
APP_GPIO_I2C_SDA_H;
}
bool App_Gpio_I2C_Write(uint8_t Address, uint8_t* pWriteData, uint32_t TxSize)
{
bool bRet;
uint16_t i;
App_Gpio_I2C_Start();
bRet = App_Gpio_I2C_WriteData(Address << 1);
if(bRet == false)
{
App_Gpio_I2C_Stop();
return false;
}
for(i = 0 ; i < TxSize ; i++)
{
bRet = App_Gpio_I2C_WriteData(pWriteData[i]);
if(bRet == false)
{
App_Gpio_I2C_Stop();
return false;
}
}
App_Gpio_I2C_Stop();
return bRet;
}
bool App_Gpio_I2C_Read(uint8_t Address, uint8_t* pReadData, uint32_t RxSize)
{
bool bRet;
uint16_t i;
App_Gpio_I2C_Start();
bRet = App_Gpio_I2C_WriteData((Address << 1) | 1);
if(bRet == false)
{
App_Gpio_I2C_Stop();
return false;
}
for(i = 0 ; i < RxSize-1 ; i++)
{
bRet = App_Gpio_I2C_ReadData(&pReadData[i], true);
if(bRet == false)
{
App_Gpio_I2C_Stop();
return false;
}
}
bRet = App_Gpio_I2C_ReadData(&pReadData[i], false);
App_Gpio_I2C_Stop();
return bRet;
}
static void App_Gpio_I2C_Port_Output(uint32_t Port, uint32_t Pin)
{
gpio_cfg_t gpio_out;
gpio_out.port = Port;
gpio_out.mask = Pin;
gpio_out.pad = GPIO_PAD_NONE;
gpio_out.func = GPIO_FUNC_OUT;
GPIO_Config(&gpio_out);
}
static void App_Gpio_I2C_Port_Input(uint32_t Port, uint32_t Pin)
{
gpio_cfg_t gpio_out;
gpio_out.port = Port;
gpio_out.mask = Pin;
gpio_out.pad = GPIO_PAD_NONE;
gpio_out.func = GPIO_FUNC_IN;
GPIO_Config(&gpio_out);
}
static void App_Gpio_I2C_Port_H(uint32_t Port, uint32_t Pin)
{
mxc_gpio_regs_t *gpio = MXC_GPIO_GET_GPIO(Port);
gpio->out_set = Pin;
}
static void App_Gpio_I2C_Port_L(uint32_t Port, uint32_t Pin)
{
mxc_gpio_regs_t *gpio = MXC_GPIO_GET_GPIO(Port);
gpio->out_clr = Pin;
}
static bool App_Gpio_I2C_Port_Read(uint32_t Port, uint32_t Pin)
{
mxc_gpio_regs_t *gpio = MXC_GPIO_GET_GPIO(Port);
return (gpio->in & Pin) ? false : true;
}
static void App_Gpio_I2C_Delay(void)
{
uint32_t i;
for(i = 0 ; i < DelayCount ; i++)
asm("NOP");
}

@ -0,0 +1,15 @@
/** \file app_gpio_i2c.h */
#if !defined(APP_GPIO_I2C_H__735764A1_7403_4365_8691_3F84C6129F50__INCLUDED_)
#define APP_GPIO_I2C_H__735764A1_7403_4365_8691_3F84C6129F50__INCLUDED_
#include "board_config.h"
void App_Gpio_I2C_Initialization(uint32_t Frequency);
void App_Gpio_I2C_Start(void);
bool App_Gpio_I2C_WriteData(uint8_t TxData);
bool App_Gpio_I2C_ReadData(uint8_t* pRxData, bool isAck);
void App_Gpio_I2C_Stop(void);
bool App_Gpio_I2C_Write(uint8_t Address, uint8_t* pWriteData, uint32_t TxSize);
bool App_Gpio_I2C_Read(uint8_t Address, uint8_t* pReadData, uint32_t RxSize);
#endif

@ -0,0 +1,126 @@
#include "app_gpio_led.h"
#include "sw_timer.h"
static void App_Led_Output_Process(void);
static void App_Led_Off(APP_LED_LIST app_led_index);
static void App_Led_On(APP_LED_LIST app_led_index);
typedef void (*APP_LED_ON_OFF_FUNC)(APP_LED_LIST gpio_led_index);
typedef struct
{
uint8_t Port;
uint32_t Pin;
gpio_pad_t Pull_updown;
APP_LED_MODE Mode;
bool isLedOn;
uint32_t nCheckTime;
uint32_t nOnTime;
uint32_t nOffTime;
APP_LED_ON_OFF_FUNC LedOnFunction;
APP_LED_ON_OFF_FUNC LedOffunction;
}APP_STATE_LED_INFO;
static APP_STATE_LED_INFO App_Led_Ctrl_Info[APP_LED_MAX] =
{
{PORT_0, PIN_13, GPIO_PAD_NONE, APP_LED_MODE_OFF, false, 0, 0, 0, App_Led_On, App_Led_Off},
};
static void App_Led_On(APP_LED_LIST app_led_index);
static void App_Led_Off(APP_LED_LIST app_led_index);
void App_Led_Initialization(void)
{
uint8_t i;
gpio_cfg_t gpio_out;
SYS_ClockEnable(SYS_PERIPH_CLOCK_GPIO0);
for(i = 0 ; i < APP_LED_MAX ; i++)
{
gpio_out.port = App_Led_Ctrl_Info[i].Port;
gpio_out.mask = App_Led_Ctrl_Info[i].Pin;
gpio_out.pad = App_Led_Ctrl_Info[i].Pull_updown;
gpio_out.func = GPIO_FUNC_OUT;
GPIO_Config(&gpio_out);
App_Led_Off((APP_LED_LIST)i);
}
SW_Timer_Callback_Register(SW_TIMER_RUN_CONTINUE, 1, App_Led_Output_Process);
}
void App_Led_OutputSet(APP_LED_LIST app_led_index, APP_LED_MODE app_led_mode, uint32_t OnTime, uint32_t OffTime)
{
App_Led_Ctrl_Info[app_led_index].Mode = app_led_mode;
App_Led_Ctrl_Info[app_led_index].isLedOn = true;
App_Led_Ctrl_Info[app_led_index].nCheckTime = millis();
App_Led_Ctrl_Info[app_led_index].nOnTime = OnTime;
App_Led_Ctrl_Info[app_led_index].nOffTime = OffTime;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
static void App_Led_Output_Process(void)
{
uint8_t i;
APP_STATE_LED_INFO* pControlInfo;
for(i = 0 ; i < APP_LED_MAX ; i++)
{
pControlInfo = &App_Led_Ctrl_Info[i];
switch (pControlInfo->Mode)
{
case APP_LED_MODE_OFF:
pControlInfo->LedOffunction((APP_LED_LIST)i);
break;
case APP_LED_MODE_ON:
pControlInfo->LedOnFunction((APP_LED_LIST)i);
break;
case APP_LED_MODE_TOGGLE:
if(pControlInfo->isLedOn == true)
{
if((millis() - pControlInfo->nCheckTime) > pControlInfo->nOnTime )
{
pControlInfo->nCheckTime = millis();
pControlInfo->isLedOn = false;
}
pControlInfo->LedOnFunction((APP_LED_LIST)i);
}
else
{
if((millis() - pControlInfo->nCheckTime) > pControlInfo->nOffTime )
{
pControlInfo->nCheckTime = millis();
pControlInfo->isLedOn = true;
}
pControlInfo->LedOffunction((APP_LED_LIST)i);
}
break;
}
}
}
static void App_Led_On(APP_LED_LIST app_led_index)
{
mxc_gpio_regs_t *gpio = MXC_GPIO_GET_GPIO(App_Led_Ctrl_Info[app_led_index].Port);
gpio->out_set = App_Led_Ctrl_Info[app_led_index].Pin;
}
static void App_Led_Off(APP_LED_LIST app_led_index)
{
mxc_gpio_regs_t *gpio = MXC_GPIO_GET_GPIO(App_Led_Ctrl_Info[app_led_index].Port);
gpio->out_clr = App_Led_Ctrl_Info[app_led_index].Pin;
}

@ -0,0 +1,27 @@
/** \file app_gpio_led.h */
#if !defined(APP_GPIO_LED_H__2317E4D0_AD00_4A5E_A3DE_D2D8A0546351__INCLUDED_)
#define APP_GPIO_LED_H__2317E4D0_AD00_4A5E_A3DE_D2D8A0546351__INCLUDED_
#include "board_config.h"
typedef enum
{
APP_LED_1,
APP_LED_MAX,
}APP_LED_LIST;
typedef enum
{
APP_LED_MODE_OFF,
APP_LED_MODE_ON,
APP_LED_MODE_TOGGLE,
}APP_LED_MODE;
void App_Led_Initialization(void);
void App_Led_OutputSet(APP_LED_LIST app_led_index, APP_LED_MODE app_led_mode, uint32_t OnTime, uint32_t OffTime);
#endif

@ -0,0 +1,114 @@
#include "app_ring_buffer.h"
// 큐 초기화
bool RingBuffer_Initialization(RING_BUFFER* pRingbuffer, bool isOverWrite, uint32_t buffer_size, uint8_t* pBuffer)
{
if(buffer_size == 0 || pRingbuffer == NULL || pBuffer == NULL)
return false;
pRingbuffer->pBuffer = pBuffer;
pRingbuffer->BufferSize = buffer_size;
pRingbuffer->isOverWrite = isOverWrite;
pRingbuffer->front = -1;
pRingbuffer->rear = -1;
return true;
}
bool RingBuffer_Clear(RING_BUFFER* pRingbuffer)
{
if(pRingbuffer == NULL || pRingbuffer->BufferSize == 0 || pRingbuffer->pBuffer == NULL)
return false;
pRingbuffer->front = -1;
pRingbuffer->rear = -1;
return true;
}
bool RingBuffer_isEmpty(RING_BUFFER* pRingbuffer)
{
return (pRingbuffer->front == -1);
}
bool RingBuffer_isFull(RING_BUFFER* pRingbuffer)
{
return ((pRingbuffer->front == 0 && pRingbuffer->rear == (pRingbuffer->BufferSize - 1)) || (pRingbuffer->front == (pRingbuffer->rear + 1)));
}
// 큐에 요소를 추가 (enqueue)
bool RingBuffer_Enqueue(RING_BUFFER* pRingbuffer, uint8_t value)
{
uint8_t temp;
if (RingBuffer_isFull(pRingbuffer))
{
if(pRingbuffer->isOverWrite == false)
return false;
else
RingBuffer_Dequeue(pRingbuffer, &temp);
}
if (pRingbuffer->front == -1)
{
pRingbuffer->front = 0;
}
pRingbuffer->rear = (pRingbuffer->rear + 1) % pRingbuffer->BufferSize;
pRingbuffer->pBuffer[pRingbuffer->rear] = value;
return true;
}
// 큐에서 요소를 제거하고 반환 (dequeue)
bool RingBuffer_Dequeue(RING_BUFFER* pRingbuffer, uint8_t* pRetValue)
{
if (RingBuffer_isEmpty(pRingbuffer))
{
return false;
}
else
{
*pRetValue = pRingbuffer->pBuffer[pRingbuffer->front];
if (pRingbuffer->front == pRingbuffer->rear)
{
pRingbuffer->front = -1;
pRingbuffer->rear = -1;
}
else
{
pRingbuffer->front = (pRingbuffer->front + 1) % pRingbuffer->BufferSize;
}
return true;
}
}
bool RingBuffer_GetData(RING_BUFFER* pRingbuffer, uint8_t* pRetValue)
{
*pRetValue = pRingbuffer->pBuffer[pRingbuffer->front];
return true;
}
bool RingBuffer_PopData(RING_BUFFER* pRingbuffer)
{
if (pRingbuffer->front == pRingbuffer->rear)
{
pRingbuffer->front = -1;
pRingbuffer->rear = -1;
}
else
{
pRingbuffer->front = (pRingbuffer->front + 1) % pRingbuffer->BufferSize;
}
return true;
}
uint32_t RingBuffer_Get_DataSize(RING_BUFFER* pRingbuffer)
{
if (RingBuffer_isEmpty(pRingbuffer))
{
return 0;
}
else if (pRingbuffer->front <= pRingbuffer->rear)
{
return (pRingbuffer->rear - pRingbuffer->front + 1);
}
else
{
return (pRingbuffer->BufferSize - pRingbuffer->front + pRingbuffer->rear + 1);
}
}

@ -0,0 +1,28 @@
/** \file ring_buffer.h */
#if !defined(APP_RING_BUFFER_H__002F3B3E_9C40_4947_A8EE_139D5ADFF045__INCLUDED_)
#define APP_RING_BUFFER_H__002F3B3E_9C40_4947_A8EE_139D5ADFF045__INCLUDED_
#include "define.h"
#include "board_config.h"
typedef struct ring_buffer
{
uint8_t* pBuffer;
uint32_t BufferSize;
bool isOverWrite;
int32_t front, rear;
}RING_BUFFER;
bool RingBuffer_Initialization(RING_BUFFER* pRingbuffer, bool isOverWrite, uint32_t buffer_size, uint8_t* pBuffer);
bool RingBuffer_Clear(RING_BUFFER* pRingbuffer);
bool RingBuffer_isEmpty(RING_BUFFER* pRingbuffer);
bool RingBuffer_isFull(RING_BUFFER* pRingbuffer);
bool RingBuffer_Enqueue(RING_BUFFER* pRingbuffer, uint8_t value) ;
bool RingBuffer_Dequeue(RING_BUFFER* pRingbuffer, uint8_t* pRetValue);
bool RingBuffer_GetData(RING_BUFFER* pRingbuffer, uint8_t* pRetValue);
bool RingBuffer_PopData(RING_BUFFER* pRingbuffer);
uint32_t RingBuffer_Get_DataSize(RING_BUFFER* pRingbuffer);
#endif

@ -0,0 +1,159 @@
#include "app_uart.h"
#include "app_ring_buffer.h"
#include "sw_timer.h"
static uart_req_t App_Uart_Read_Req;;
static uint8_t TxBuffer[APP_UART_TX_BUFFER_SIZE];
static uint8_t RxBuffer[APP_UART_RX_BUFFER_SIZE];
static uint8_t RxData;
static RING_BUFFER Tx_RingBuffer;
static RING_BUFFER Rx_RingBuffer;
static int32_t UartError = E_NO_ERROR;
static void App_Uart_Interrupt_Handler(void);
static void App_Uart_Data_Transmit_Check(void);
static void App_Uart_Read_Callback_Initialization(void);
static void App_Uart_Read_Callback(uart_req_t* req, int error);
int fputc( int ch, FILE* f )
{
RingBuffer_Enqueue(&Tx_RingBuffer, ch);
//UART_WriteByte(UART_App_INSTANCE, ch);
return( ch );
}
int32_t App_Uart_Initialization(void)
{
mxc_uart_regs_t* uart = APP_UART_INSTANCE;
const sys_cfg_uart_t sys_uart_cfg =
{
APP_UART_ALTERNATE,
UART_FLOW_DISABLE,
};
/* Initialize the UART */
uart_cfg_t cfg;
cfg.parity = UART_PARITY_DISABLE;
cfg.size = UART_DATA_SIZE_8_BITS;
cfg.stop = UART_STOP_1;
cfg.flow = UART_FLOW_CTRL_DIS;
cfg.pol = UART_FLOW_POL_DIS;
cfg.baud = APP_UART_BUADRATE;
while (!(uart->status & MXC_F_UART_STATUS_TX_EMPTY))
{
;
}
// Initialize the UART
if ((UartError = UART_Init(uart, &cfg, &sys_uart_cfg)) != E_NO_ERROR)
{
return UartError;
}
if(uart == MXC_UART0)
{
NVIC_ClearPendingIRQ(UART0_IRQn);
NVIC_DisableIRQ(UART0_IRQn);
NVIC_SetVector(UART0_IRQn, App_Uart_Interrupt_Handler);
NVIC_EnableIRQ(UART0_IRQn);
}
else if(uart == MXC_UART1)
{
NVIC_ClearPendingIRQ(UART1_IRQn);
NVIC_DisableIRQ(UART1_IRQn);
NVIC_SetVector(UART1_IRQn, App_Uart_Interrupt_Handler);
NVIC_EnableIRQ(UART1_IRQn);
}
UART_ClearFlags (uart, 0xFFFFFFFF);
//MXC_UART_EnableInt (uart, MXC_F_UART_REVA_INT_EN_RX_FIFO_THRESH|MXC_F_UART_REVA_INT_EN_TX_FIFO_ALMOST_EMPTY);
RingBuffer_Initialization(&Tx_RingBuffer, true, APP_UART_TX_BUFFER_SIZE, TxBuffer);
RingBuffer_Initialization(&Rx_RingBuffer, true, APP_UART_RX_BUFFER_SIZE, RxBuffer);
App_Uart_Read_Callback_Initialization();
SW_Timer_Callback_Register(SW_TIMER_RUN_CONTINUE, 0, App_Uart_Data_Transmit_Check);
return E_SUCCESS;
}
static void App_Uart_Read_Callback_Initialization(void)
{
App_Uart_Read_Req.data = &RxData;
App_Uart_Read_Req.len = 1;
App_Uart_Read_Req.callback = App_Uart_Read_Callback;
UART_ReadAsync(APP_UART_INSTANCE, &App_Uart_Read_Req);
}
void App_Uart_Interrupt_Handler(void)
{
UART_Handler(APP_UART_INSTANCE);
}
static void App_Uart_Read_Callback(uart_req_t* req, int error)
{
RingBuffer_Enqueue(&Rx_RingBuffer, RxData);
RingBuffer_Enqueue(&Tx_RingBuffer, RxData);
App_Uart_Read_Callback_Initialization();
}
static void App_Uart_Data_Transmit_Check(void)
{
if(RingBuffer_Get_DataSize(&Tx_RingBuffer) != 0 && UART_Busy(APP_UART_INSTANCE) == E_NO_ERROR)
{
uint8_t TxData;
RingBuffer_GetData(&Tx_RingBuffer, &TxData);
UART_WriteByte(APP_UART_INSTANCE, TxData);
RingBuffer_PopData(&Tx_RingBuffer);
}
}
int32_t App_Uart_Transmit(uint8_t TxData)
{
RingBuffer_Enqueue(&Tx_RingBuffer, TxData);
return true;
}
int32_t App_Uart_Get_Last_Error(void)
{
return UartError;
}
bool App_Uart_Get_Recv_Data(uint8_t* pRxData)
{
if(RingBuffer_Get_DataSize(&Rx_RingBuffer) == 0)
return false;
return RingBuffer_Dequeue(&Rx_RingBuffer, pRxData);
}
int printf_none(const char *fmt, ...)
{
return 0;
}

@ -0,0 +1,17 @@
/** \file debug.h */
#if !defined(APP_UART_H__815DE511_1438_4F94_A151_A4D6CC5F96F8__INCLUDED_)
#define APP_UART_H__815DE511_1438_4F94_A151_A4D6CC5F96F8__INCLUDED_
#include "board_config.h"
int32_t App_Uart_Initialization(void);
int32_t App_Uart_Transmit(uint8_t TxData);
int32_t App_Uart_Transmit_Len(uint8_t* pTxBuffer, uint16_t TxLen);
int32_t App_Uart_Get_Last_Error(void);
bool App_Uart_Get_Recv_Data(uint8_t* pRxData);
int printf_none(const char *fmt, ...);
#endif

@ -17,6 +17,7 @@
#include "mxc_errors.h" #include "mxc_errors.h"
#include "mxc_sys.h" #include "mxc_sys.h"
#include "mxc_delay.h" #include "mxc_delay.h"
#include "nvic_table.h"
#include "i2c.h" #include "i2c.h"
#include "gpio.h" #include "gpio.h"
#include "tmr.h" #include "tmr.h"
@ -29,10 +30,24 @@
#include "define.h" #include "define.h"
#include "system_func.h"
#define millis() SystemTimer_Get_TickCount()
#define SYSTEM_TIMER_INSTANCE MXC_TMR1
//////////////////////////////////////////
// printf use
//
#define APP_UART_INSTANCE MXC_UART1
#define APP_UART_ALTERNATE MAP_A
#define APP_UART_BUADRATE 115200
#define APP_UART_TX_BUFFER_SIZE 512
#define APP_UART_RX_BUFFER_SIZE 128
#endif #endif

@ -1,24 +1,92 @@
#include "main.h" #include "main.h"
#include "system_func.h" #include "system_func.h"
#include "struct.h" #include "struct.h"
#include "sw_timer.h"
#include "app_gpio_led.h"
#include "app_gpio_i2c.h"
#include "app_uart.h"
#include "ssd1306.h"
void Test_Process(void)
{
static uint32_t count = 0;
uint8_t temp[100];
SSD1306_SetPosition (7, 1); // set position
sprintf(temp, "count = %d", count++);
SSD1306_DrawString (temp); // draw string
SSD1306_UpdateScreen (SSD1306_ADDR); // update
//printf("12345678\r\n");
}
int main(void) int main(void)
{ {
SystemCoreClockSet(HIRC_24MHZ); uint8_t i;
ICC_Enable(); ICC_Enable();
SystemCoreClockSet(HIRC_96MHZ);
App_Uart_Initialization();
App_Gpio_I2C_Initialization(200000);
App_Led_Initialization();
__enable_irq(); __enable_irq();
App_Led_OutputSet(APP_LED_1, APP_LED_MODE_TOGGLE, 100, 100);
SW_Timer_Callback_Register(SW_TIMER_RUN_CONTINUE, 100,Test_Process );
while(1)
if(SSD1306_Init(SSD1306_ADDR) != SSD1306_SUCCESS)
{ {
printf("ssd1306 init fail\r\n");
}
else
{
SSD1306_NormalScreen (SSD1306_ADDR);
SSD1306_ClearScreen (); // clear screen
SSD1306_DrawLine (0, MAX_X, 4, 4); // draw line
SSD1306_SetPosition (7, 1); // set position
SSD1306_DrawString ("SSD1306 OLED DRIVER"); // draw string
SSD1306_DrawLine (0, MAX_X, 18, 18); // draw line
SSD1306_SetPosition (40, 3); // set position
SSD1306_DrawString ("MATIASUS"); // draw string
//SSD1306_SetPosition (53, 5); // set position
//SSD1306_DrawString ("2021"); // draw string
SSD1306_UpdateScreen (SSD1306_ADDR); // update
Delay_ms (1000);
SSD1306_InverseScreen (SSD1306_ADDR);
Delay_ms (1000);
SSD1306_NormalScreen (SSD1306_ADDR);
#if 0
Delay_ms (1000);
SSD1306_InverseScreen (SSD1306_ADDR);
Delay_ms (1000);
SSD1306_NormalScreen (SSD1306_ADDR);
Delay_ms (1000);
SSD1306_InverseScreen (SSD1306_ADDR);
Delay_ms (1000);
SSD1306_NormalScreen (SSD1306_ADDR);
#endif
}
while(1)
{
SW_Timer_Callback_Process();
} }
return 0; return 0;

@ -0,0 +1,134 @@
/**
* -------------------------------------------------------------------------------------+
* @desc LCD FONT 5x8
* -------------------------------------------------------------------------------------+
* @source
* Copyright (C) 2020 Marian Hrinko.
* Written by Marian Hrinko (mato.hrinko@gmail.com)
*
* @author Marian Hrinko
* @date 08.12.2020
* @update 08.12.2022
* @file font.h
* @version 1.0
* @tested AVR Atmega328p
*
* @depend
* -------------------------------------------------------------------------------------+
* @descr LCD pixel fonts
* -------------------------------------------------------------------------------------+
* @usage Display characters
*/
#ifndef __FONT_H__
#define __FONT_H__
// includes
// Characters definition
// -----------------------------------
// number of columns for chars
#define CHARS_COLS_LENGTH 5
// @const Characters
const uint8_t FONTS[][CHARS_COLS_LENGTH] = {
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, // 20 space
{ 0x81, 0x81, 0x18, 0x81, 0x81 }, // 21 !
{ 0x00, 0x07, 0x00, 0x07, 0x00 }, // 22 "
{ 0x14, 0x7f, 0x14, 0x7f, 0x14 }, // 23 #
{ 0x24, 0x2a, 0x7f, 0x2a, 0x12 }, // 24 $
{ 0x23, 0x13, 0x08, 0x64, 0x62 }, // 25 %
{ 0x36, 0x49, 0x55, 0x22, 0x50 }, // 26 &
{ 0x00, 0x05, 0x03, 0x00, 0x00 }, // 27 '
{ 0x00, 0x1c, 0x22, 0x41, 0x00 }, // 28 (
{ 0x00, 0x41, 0x22, 0x1c, 0x00 }, // 29 )
{ 0x14, 0x08, 0x3e, 0x08, 0x14 }, // 2a *
{ 0x08, 0x08, 0x3e, 0x08, 0x08 }, // 2b +
{ 0x00, 0x50, 0x30, 0x00, 0x00 }, // 2c ,
{ 0x08, 0x08, 0x08, 0x08, 0x08 }, // 2d -
{ 0x00, 0x60, 0x60, 0x00, 0x00 }, // 2e .
{ 0x20, 0x10, 0x08, 0x04, 0x02 }, // 2f /
{ 0x3e, 0x51, 0x49, 0x45, 0x3e }, // 30 0
{ 0x00, 0x42, 0x7f, 0x40, 0x00 }, // 31 1
{ 0x42, 0x61, 0x51, 0x49, 0x46 }, // 32 2
{ 0x21, 0x41, 0x45, 0x4b, 0x31 }, // 33 3
{ 0x18, 0x14, 0x12, 0x7f, 0x10 }, // 34 4
{ 0x27, 0x45, 0x45, 0x45, 0x39 }, // 35 5
{ 0x3c, 0x4a, 0x49, 0x49, 0x30 }, // 36 6
{ 0x01, 0x71, 0x09, 0x05, 0x03 }, // 37 7
{ 0x36, 0x49, 0x49, 0x49, 0x36 }, // 38 8
{ 0x06, 0x49, 0x49, 0x29, 0x1e }, // 39 9
{ 0x00, 0x36, 0x36, 0x00, 0x00 }, // 3a :
{ 0x00, 0x56, 0x36, 0x00, 0x00 }, // 3b ;
{ 0x08, 0x14, 0x22, 0x41, 0x00 }, // 3c <
{ 0x14, 0x14, 0x14, 0x14, 0x14 }, // 3d =
{ 0x00, 0x41, 0x22, 0x14, 0x08 }, // 3e >
{ 0x02, 0x01, 0x51, 0x09, 0x06 }, // 3f ?
{ 0x32, 0x49, 0x79, 0x41, 0x3e }, // 40 @
{ 0x7e, 0x11, 0x11, 0x11, 0x7e }, // 41 A
{ 0x7f, 0x49, 0x49, 0x49, 0x36 }, // 42 B
{ 0x3e, 0x41, 0x41, 0x41, 0x22 }, // 43 C
{ 0x7f, 0x41, 0x41, 0x22, 0x1c }, // 44 D
{ 0x7f, 0x49, 0x49, 0x49, 0x41 }, // 45 E
{ 0x7f, 0x09, 0x09, 0x09, 0x01 }, // 46 F
{ 0x3e, 0x41, 0x49, 0x49, 0x7a }, // 47 G
{ 0x7f, 0x08, 0x08, 0x08, 0x7f }, // 48 H
{ 0x00, 0x41, 0x7f, 0x41, 0x00 }, // 49 I
{ 0x20, 0x40, 0x41, 0x3f, 0x01 }, // 4a J
{ 0x7f, 0x08, 0x14, 0x22, 0x41 }, // 4b K
{ 0x7f, 0x40, 0x40, 0x40, 0x40 }, // 4c L
{ 0x7f, 0x02, 0x0c, 0x02, 0x7f }, // 4d M
{ 0x7f, 0x04, 0x08, 0x10, 0x7f }, // 4e N
{ 0x3e, 0x41, 0x41, 0x41, 0x3e }, // 4f O
{ 0x7f, 0x09, 0x09, 0x09, 0x06 }, // 50 P
{ 0x3e, 0x41, 0x51, 0x21, 0x5e }, // 51 Q
{ 0x7f, 0x09, 0x19, 0x29, 0x46 }, // 52 R
{ 0x46, 0x49, 0x49, 0x49, 0x31 }, // 53 S
{ 0x01, 0x01, 0x7f, 0x01, 0x01 }, // 54 T
{ 0x3f, 0x40, 0x40, 0x40, 0x3f }, // 55 U
{ 0x1f, 0x20, 0x40, 0x20, 0x1f }, // 56 V
{ 0x3f, 0x40, 0x38, 0x40, 0x3f }, // 57 W
{ 0x63, 0x14, 0x08, 0x14, 0x63 }, // 58 X
{ 0x07, 0x08, 0x70, 0x08, 0x07 }, // 59 Y
{ 0x61, 0x51, 0x49, 0x45, 0x43 }, // 5a Z
{ 0x00, 0x7f, 0x41, 0x41, 0x00 }, // 5b [
{ 0x02, 0x04, 0x08, 0x10, 0x20 }, // 5c backslash
{ 0x00, 0x41, 0x41, 0x7f, 0x00 }, // 5d ]
{ 0x04, 0x02, 0x01, 0x02, 0x04 }, // 5e ^
{ 0x40, 0x40, 0x40, 0x40, 0x40 }, // 5f _
{ 0x00, 0x01, 0x02, 0x04, 0x00 }, // 60 `
{ 0x20, 0x54, 0x54, 0x54, 0x78 }, // 61 a
{ 0x7f, 0x48, 0x44, 0x44, 0x38 }, // 62 b
{ 0x38, 0x44, 0x44, 0x44, 0x20 }, // 63 c
{ 0x38, 0x44, 0x44, 0x48, 0x7f }, // 64 d
{ 0x38, 0x54, 0x54, 0x54, 0x18 }, // 65 e
{ 0x08, 0x7e, 0x09, 0x01, 0x02 }, // 66 f
{ 0x0c, 0x52, 0x52, 0x52, 0x3e }, // 67 g
{ 0x7f, 0x08, 0x04, 0x04, 0x78 }, // 68 h
{ 0x00, 0x44, 0x7d, 0x40, 0x00 }, // 69 i
{ 0x20, 0x40, 0x44, 0x3d, 0x00 }, // 6a j
{ 0x7f, 0x10, 0x28, 0x44, 0x00 }, // 6b k
{ 0x00, 0x41, 0x7f, 0x40, 0x00 }, // 6c l
{ 0x7c, 0x04, 0x18, 0x04, 0x78 }, // 6d m
{ 0x7c, 0x08, 0x04, 0x04, 0x78 }, // 6e n
{ 0x38, 0x44, 0x44, 0x44, 0x38 }, // 6f o
{ 0x7c, 0x14, 0x14, 0x14, 0x08 }, // 70 p
{ 0x08, 0x14, 0x14, 0x14, 0x7c }, // 71 q
{ 0x7c, 0x08, 0x04, 0x04, 0x08 }, // 72 r
{ 0x48, 0x54, 0x54, 0x54, 0x20 }, // 73 s
{ 0x04, 0x3f, 0x44, 0x40, 0x20 }, // 74 t
{ 0x3c, 0x40, 0x40, 0x20, 0x7c }, // 75 u
{ 0x1c, 0x20, 0x40, 0x20, 0x1c }, // 76 v
{ 0x3c, 0x40, 0x30, 0x40, 0x3c }, // 77 w
{ 0x44, 0x28, 0x10, 0x28, 0x44 }, // 78 x
{ 0x0c, 0x50, 0x50, 0x50, 0x3c }, // 79 y
{ 0x44, 0x64, 0x54, 0x4c, 0x44 }, // 7a z
{ 0x00, 0x08, 0x36, 0x41, 0x00 }, // 7b {
{ 0x00, 0x00, 0x7f, 0x00, 0x00 }, // 7c |
{ 0x00, 0x41, 0x36, 0x08, 0x00 }, // 7d }
{ 0x10, 0x08, 0x08, 0x10, 0x08 }, // 7e ~
{ 0x00, 0x00, 0x00, 0x00, 0x00 } // 7f
};
#endif

@ -0,0 +1,135 @@
/**
* -------------------------------------------------------------------------------------+
* @desc LCD FONT 5x8
* -------------------------------------------------------------------------------------+
* @source https://github.com/basti79/LCD-fonts/blob/master/5x8_vertikal_LSB_1.h
* Copyright (C) 2020 Marian Hrinko.
* Written by Marian Hrinko (mato.hrinko@gmail.com)
*
* @author Marian Hrinko
* @date 08.12.2020
* @update 08.12.2022
* @file font5x8.h
* @version 1.0
* @tested AVR Atmega328p
*
* @depend
* -------------------------------------------------------------------------------------+
* @descr LCD pixel fonts
* -------------------------------------------------------------------------------------+
* @usage Display characters
*/
#ifndef __FONT5x8_H__
#define __FONT5x8_H__
// includes
#include <avr/pgmspace.h>
// Characters definition
// -----------------------------------
// number of columns for chars
#define CHARS_COLS_LENGTH 5
// @author basti79
// @source https://github.com/basti79/LCD-fonts/blob/master/5x8_vertikal_LSB_1.h
static const uint8_t FONTS[][CHARS_COLS_LENGTH] PROGMEM = {
{0x00,0x00,0x00,0x00,0x00}, // 0x20
{0x00,0x00,0x2F,0x00,0x00}, // 0x21
{0x00,0x03,0x00,0x03,0x00}, // 0x22
{0x34,0x1C,0x36,0x1C,0x16}, // 0x23
{0x00,0x26,0x7F,0x32,0x00}, // 0x24
{0x32,0x0D,0x1E,0x2C,0x13}, // 0x25
{0x18,0x26,0x2D,0x12,0x28}, // 0x26
{0x00,0x00,0x03,0x00,0x00}, // 0x27
{0x00,0x1C,0x22,0x41,0x41}, // 0x28
{0x41,0x41,0x22,0x1C,0x00}, // 0x29
{0x00,0x0A,0x05,0x0A,0x00}, // 0x2A
{0x00,0x10,0x38,0x10,0x00}, // 0x2B
{0x00,0x80,0x60,0x00,0x00}, // 0x2C
{0x00,0x08,0x08,0x08,0x00}, // 0x2D
{0x00,0x00,0x20,0x00,0x00}, // 0x2E
{0x00,0x60,0x18,0x06,0x01}, // 0x2F
{0x00,0x1E,0x21,0x21,0x1E}, // 0x30
{0x00,0x22,0x3F,0x20,0x00}, // 0x31
{0x00,0x31,0x29,0x26,0x00}, // 0x32
{0x00,0x25,0x25,0x1A,0x00}, // 0x33
{0x00,0x0C,0x0A,0x3F,0x08}, // 0x34
{0x00,0x27,0x25,0x19,0x00}, // 0x35
{0x00,0x1E,0x25,0x25,0x18}, // 0x36
{0x00,0x01,0x39,0x05,0x03}, // 0x37
{0x00,0x1A,0x25,0x25,0x1A}, // 0x38
{0x00,0x06,0x29,0x29,0x1E}, // 0x39
{0x00,0x00,0x24,0x00,0x00}, // 0x3A
{0x00,0x80,0x64,0x00,0x00}, // 0x3B
{0x00,0x08,0x08,0x14,0x22}, // 0x3C
{0x00,0x14,0x14,0x14,0x14}, // 0x3D
{0x00,0x22,0x14,0x08,0x08}, // 0x3E
{0x00,0x01,0x29,0x05,0x02}, // 0x3F
{0x3C,0x42,0x59,0x55,0x5E}, // 0x40
{0x30,0x1C,0x12,0x1C,0x30}, // 0x41
{0x00,0x3E,0x2A,0x36,0x00}, // 0x42
{0x00,0x1C,0x22,0x22,0x22}, // 0x43
{0x00,0x3E,0x22,0x22,0x1C}, // 0x44
{0x00,0x3E,0x2A,0x2A,0x00}, // 0x45
{0x00,0x3E,0x0A,0x0A,0x00}, // 0x46
{0x00,0x1C,0x22,0x2A,0x3A}, // 0x47
{0x00,0x3E,0x08,0x08,0x3E}, // 0x48
{0x00,0x22,0x3E,0x22,0x00}, // 0x49
{0x00,0x22,0x22,0x1E,0x00}, // 0x4A
{0x00,0x3E,0x08,0x14,0x22}, // 0x4B
{0x00,0x3E,0x20,0x20,0x20}, // 0x4C
{0x3E,0x04,0x18,0x04,0x3E}, // 0x4D
{0x00,0x3E,0x04,0x08,0x3E}, // 0x4E
{0x1C,0x22,0x22,0x22,0x1C}, // 0x4F
{0x00,0x3E,0x0A,0x0A,0x04}, // 0x50
{0x1C,0x22,0x22,0x62,0x9C}, // 0x51
{0x00,0x3E,0x0A,0x14,0x20}, // 0x52
{0x00,0x24,0x2A,0x12,0x00}, // 0x53
{0x02,0x02,0x3E,0x02,0x02}, // 0x54
{0x00,0x1E,0x20,0x20,0x1E}, // 0x55
{0x00,0x0E,0x30,0x30,0x0E}, // 0x56
{0x0E,0x30,0x0C,0x30,0x0E}, // 0x57
{0x22,0x14,0x08,0x14,0x22}, // 0x58
{0x02,0x04,0x38,0x04,0x02}, // 0x59
{0x00,0x32,0x2A,0x2A,0x26}, // 0x5A
{0x00,0x00,0x7F,0x41,0x00}, // 0x5B
{0x01,0x06,0x18,0x60,0x00}, // 0x5C
{0x00,0x41,0x7F,0x00,0x00}, // 0x5D
{0x18,0x06,0x01,0x06,0x18}, // 0x5E
{0x40,0x40,0x40,0x40,0x40}, // 0x5F
{0x00,0x01,0x02,0x00,0x00}, // 0x60
{0x00,0x34,0x34,0x38,0x20}, // 0x61
{0x00,0x3F,0x24,0x24,0x18}, // 0x62
{0x00,0x18,0x24,0x24,0x00}, // 0x63
{0x18,0x24,0x24,0x3F,0x00}, // 0x64
{0x00,0x18,0x2C,0x28,0x00}, // 0x65
{0x00,0x04,0x3E,0x05,0x05}, // 0x66
{0x00,0x58,0x54,0x54,0x3C}, // 0x67
{0x00,0x3F,0x08,0x04,0x38}, // 0x68
{0x00,0x04,0x3D,0x00,0x00}, // 0x69
{0x00,0x44,0x44,0x3D,0x00}, // 0x6A
{0x00,0x3F,0x08,0x14,0x20}, // 0x6B
{0x00,0x01,0x3F,0x00,0x00}, // 0x6C
{0x3C,0x08,0x3C,0x08,0x3C}, // 0x6D
{0x00,0x3C,0x08,0x04,0x38}, // 0x6E
{0x00,0x18,0x24,0x24,0x18}, // 0x6F
{0x00,0x7C,0x24,0x24,0x18}, // 0x70
{0x18,0x24,0x24,0x7C,0x00}, // 0x71
{0x00,0x3C,0x08,0x04,0x00}, // 0x72
{0x00,0x28,0x2C,0x14,0x00}, // 0x73
{0x00,0x04,0x1E,0x24,0x04}, // 0x74
{0x00,0x1C,0x20,0x10,0x3C}, // 0x75
{0x00,0x0C,0x30,0x30,0x0C}, // 0x76
{0x0C,0x30,0x1C,0x30,0x0C}, // 0x77
{0x00,0x24,0x18,0x18,0x24}, // 0x78
{0x40,0x4C,0x70,0x30,0x0C}, // 0x79
{0x00,0x34,0x2C,0x2C,0x00}, // 0x7A
{0x00,0x08,0x36,0x41,0x00}, // 0x7B
{0x00,0x00,0x7F,0x00,0x00}, // 0x7C
{0x00,0x41,0x36,0x08,0x00}, // 0x7D
{0x10,0x08,0x08,0x10,0x08}, // 0x7E
{0x00,0x3C,0x22,0x3C,0x00}, // 0x7F
};
#endif

@ -0,0 +1,135 @@
/**
* -------------------------------------------------------------------------------------+
* @desc LCD FONT 6x8
* -------------------------------------------------------------------------------------+
* @source https://github.com/basti79/LCD-fonts/blob/master/6x8_vertikal_LSB_1.h
* Copyright (C) 2020 Marian Hrinko.
* Written by Marian Hrinko (mato.hrinko@gmail.com)
*
* @author Marian Hrinko
* @date 08.12.2020
* @update 08.12.2022
* @file font6x8.h
* @version 1.0
* @tested AVR Atmega328p
*
* @depend
* -------------------------------------------------------------------------------------+
* @descr LCD pixel fonts
* -------------------------------------------------------------------------------------+
* @usage Display characters
*/
#ifndef __FONT6x8_H__
#define __FONT6x8_H__
// includes
#include <avr/pgmspace.h>
// Characters definition
// -----------------------------------
// number of columns for chars
#define CHARS_COLS_LENGTH 6
// @author basti79
// @source https://github.com/basti79/LCD-fonts/blob/master/6x8_vertikal_LSB_1.h
static const uint8_t FONTS[][CHARS_COLS_LENGTH] PROGMEM = {
{0x00,0x00,0x00,0x00,0x00,0x00}, // 0x20
{0x00,0x00,0x06,0x5F,0x06,0x00}, // 0x21
{0x00,0x07,0x03,0x00,0x07,0x03}, // 0x22
{0x00,0x24,0x7E,0x24,0x7E,0x24}, // 0x23
{0x00,0x24,0x2B,0x6A,0x12,0x00}, // 0x24
{0x00,0x63,0x13,0x08,0x64,0x63}, // 0x25
{0x00,0x36,0x49,0x56,0x20,0x50}, // 0x26
{0x00,0x00,0x07,0x03,0x00,0x00}, // 0x27
{0x00,0x00,0x3E,0x41,0x00,0x00}, // 0x28
{0x00,0x00,0x41,0x3E,0x00,0x00}, // 0x29
{0x00,0x08,0x3E,0x1C,0x3E,0x08}, // 0x2A
{0x00,0x08,0x08,0x3E,0x08,0x08}, // 0x2B
{0x00,0x00,0xE0,0x60,0x00,0x00}, // 0x2C
{0x00,0x08,0x08,0x08,0x08,0x08}, // 0x2D
{0x00,0x00,0x60,0x60,0x00,0x00}, // 0x2E
{0x00,0x20,0x10,0x08,0x04,0x02}, // 0x2F
{0x00,0x3E,0x51,0x49,0x45,0x3E}, // 0x30
{0x00,0x00,0x42,0x7F,0x40,0x00}, // 0x31
{0x00,0x62,0x51,0x49,0x49,0x46}, // 0x32
{0x00,0x22,0x49,0x49,0x49,0x36}, // 0x33
{0x00,0x18,0x14,0x12,0x7F,0x10}, // 0x34
{0x00,0x2F,0x49,0x49,0x49,0x31}, // 0x35
{0x00,0x3C,0x4A,0x49,0x49,0x30}, // 0x36
{0x00,0x01,0x71,0x09,0x05,0x03}, // 0x37
{0x00,0x36,0x49,0x49,0x49,0x36}, // 0x38
{0x00,0x06,0x49,0x49,0x29,0x1E}, // 0x39
{0x00,0x00,0x6C,0x6C,0x00,0x00}, // 0x3A
{0x00,0x00,0xEC,0x6C,0x00,0x00}, // 0x3B
{0x00,0x08,0x14,0x22,0x41,0x00}, // 0x3C
{0x00,0x24,0x24,0x24,0x24,0x24}, // 0x3D
{0x00,0x00,0x41,0x22,0x14,0x08}, // 0x3E
{0x00,0x02,0x01,0x59,0x09,0x06}, // 0x3F
{0x00,0x3E,0x41,0x5D,0x55,0x1E}, // 0x40
{0x00,0x7E,0x11,0x11,0x11,0x7E}, // 0x41
{0x00,0x7F,0x49,0x49,0x49,0x36}, // 0x42
{0x00,0x3E,0x41,0x41,0x41,0x22}, // 0x43
{0x00,0x7F,0x41,0x41,0x41,0x3E}, // 0x44
{0x00,0x7F,0x49,0x49,0x49,0x41}, // 0x45
{0x00,0x7F,0x09,0x09,0x09,0x01}, // 0x46
{0x00,0x3E,0x41,0x49,0x49,0x7A}, // 0x47
{0x00,0x7F,0x08,0x08,0x08,0x7F}, // 0x48
{0x00,0x00,0x41,0x7F,0x41,0x00}, // 0x49
{0x00,0x30,0x40,0x40,0x40,0x3F}, // 0x4A
{0x00,0x7F,0x08,0x14,0x22,0x41}, // 0x4B
{0x00,0x7F,0x40,0x40,0x40,0x40}, // 0x4C
{0x00,0x7F,0x02,0x04,0x02,0x7F}, // 0x4D
{0x00,0x7F,0x02,0x04,0x08,0x7F}, // 0x4E
{0x00,0x3E,0x41,0x41,0x41,0x3E}, // 0x4F
{0x00,0x7F,0x09,0x09,0x09,0x06}, // 0x50
{0x00,0x3E,0x41,0x51,0x21,0x5E}, // 0x51
{0x00,0x7F,0x09,0x09,0x19,0x66}, // 0x52
{0x00,0x26,0x49,0x49,0x49,0x32}, // 0x53
{0x00,0x01,0x01,0x7F,0x01,0x01}, // 0x54
{0x00,0x3F,0x40,0x40,0x40,0x3F}, // 0x55
{0x00,0x1F,0x20,0x40,0x20,0x1F}, // 0x56
{0x00,0x3F,0x40,0x3C,0x40,0x3F}, // 0x57
{0x00,0x63,0x14,0x08,0x14,0x63}, // 0x58
{0x00,0x07,0x08,0x70,0x08,0x07}, // 0x59
{0x00,0x71,0x49,0x45,0x43,0x00}, // 0x5A
{0x00,0x00,0x7F,0x41,0x41,0x00}, // 0x5B
{0x00,0x02,0x04,0x08,0x10,0x20}, // 0x5C
{0x00,0x00,0x41,0x41,0x7F,0x00}, // 0x5D
{0x00,0x04,0x02,0x01,0x02,0x04}, // 0x5E
{0x80,0x80,0x80,0x80,0x80,0x80}, // 0x5F
{0x00,0x00,0x03,0x07,0x00,0x00}, // 0x60
{0x00,0x20,0x54,0x54,0x54,0x78}, // 0x61
{0x00,0x7F,0x44,0x44,0x44,0x38}, // 0x62
{0x00,0x38,0x44,0x44,0x44,0x28}, // 0x63
{0x00,0x38,0x44,0x44,0x44,0x7F}, // 0x64
{0x00,0x38,0x54,0x54,0x54,0x08}, // 0x65
{0x00,0x08,0x7E,0x09,0x09,0x00}, // 0x66
{0x00,0x18,0xA4,0xA4,0xA4,0x7C}, // 0x67
{0x00,0x7F,0x04,0x04,0x78,0x00}, // 0x68
{0x00,0x00,0x00,0x7D,0x40,0x00}, // 0x69
{0x00,0x40,0x80,0x84,0x7D,0x00}, // 0x6A
{0x00,0x7F,0x10,0x28,0x44,0x00}, // 0x6B
{0x00,0x00,0x00,0x7F,0x40,0x00}, // 0x6C
{0x00,0x7C,0x04,0x18,0x04,0x78}, // 0x6D
{0x00,0x7C,0x04,0x04,0x78,0x00}, // 0x6E
{0x00,0x38,0x44,0x44,0x44,0x38}, // 0x6F
{0x00,0xFC,0x44,0x44,0x44,0x38}, // 0x70
{0x00,0x38,0x44,0x44,0x44,0xFC}, // 0x71
{0x00,0x44,0x78,0x44,0x04,0x08}, // 0x72
{0x00,0x08,0x54,0x54,0x54,0x20}, // 0x73
{0x00,0x04,0x3E,0x44,0x24,0x00}, // 0x74
{0x00,0x3C,0x40,0x20,0x7C,0x00}, // 0x75
{0x00,0x1C,0x20,0x40,0x20,0x1C}, // 0x76
{0x00,0x3C,0x60,0x30,0x60,0x3C}, // 0x77
{0x00,0x6C,0x10,0x10,0x6C,0x00}, // 0x78
{0x00,0x9C,0xA0,0x60,0x3C,0x00}, // 0x79
{0x00,0x64,0x54,0x54,0x4C,0x00}, // 0x7A
{0x00,0x08,0x3E,0x41,0x41,0x00}, // 0x7B
{0x00,0x00,0x00,0x77,0x00,0x00}, // 0x7C
{0x00,0x00,0x41,0x41,0x3E,0x08}, // 0x7D
{0x00,0x02,0x01,0x02,0x01,0x00}, // 0x7E
{0x00,0x3C,0x26,0x23,0x26,0x3C}, // 0x7F
};
#endif

@ -0,0 +1,133 @@
/**
* -------------------------------------------------------------------------------------+
* @desc LCD FONT 6x8
* -------------------------------------------------------------------------------------+
* @source https://github.com/basti79/LCD-fonts/blob/master/8x8_vertikal_LSB_1.h
* Copyright (C) 2020 Marian Hrinko.
* Written by Marian Hrinko (mato.hrinko@gmail.com)
*
* @author Marian Hrinko
* @date 08.12.2020
* @update 08.12.2022
* @file font6x8.h
* @version 1.0
* @tested AVR Atmega328p
*
* @depend
* -------------------------------------------------------------------------------------+
* @descr LCD pixel fonts
* -------------------------------------------------------------------------------------+
* @usage Display characters
*/
#ifndef __FONT8x8_H__
#define __FONT8x8_H__
// Characters definition
// -----------------------------------
// number of columns for chars
#define CHARS_COLS_LENGTH 8
// @author basti79
// @source https://github.com/basti79/LCD-fonts/blob/master/8x8_vertikal_LSB_1.h
static const uint8_t FONTS[][CHARS_COLS_LENGTH] = {
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // 0x20
{0x00,0x06,0x5F,0x5F,0x06,0x00,0x00,0x00}, // 0x21
{0x00,0x07,0x07,0x00,0x07,0x07,0x00,0x00}, // 0x22
{0x14,0x7F,0x7F,0x14,0x7F,0x7F,0x14,0x00}, // 0x23
{0x24,0x2E,0x6B,0x6B,0x3A,0x12,0x00,0x00}, // 0x24
{0x46,0x66,0x30,0x18,0x0C,0x66,0x62,0x00}, // 0x25
{0x30,0x7A,0x4F,0x5D,0x37,0x7A,0x48,0x00}, // 0x26
{0x04,0x07,0x03,0x00,0x00,0x00,0x00,0x00}, // 0x27
{0x00,0x1C,0x3E,0x63,0x41,0x00,0x00,0x00}, // 0x28
{0x00,0x41,0x63,0x3E,0x1C,0x00,0x00,0x00}, // 0x29
{0x08,0x2A,0x3E,0x1C,0x1C,0x3E,0x2A,0x08}, // 0x2A
{0x08,0x08,0x3E,0x3E,0x08,0x08,0x00,0x00}, // 0x2B
{0x00,0xA0,0xE0,0x60,0x00,0x00,0x00,0x00}, // 0x2C
{0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00}, // 0x2D
{0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x00}, // 0x2E
{0x60,0x30,0x18,0x0C,0x06,0x03,0x01,0x00}, // 0x2F
{0x3E,0x7F,0x59,0x4D,0x7F,0x3E,0x00,0x00}, // 0x30
{0x42,0x42,0x7F,0x7F,0x40,0x40,0x00,0x00}, // 0x31
{0x62,0x73,0x59,0x49,0x6F,0x66,0x00,0x00}, // 0x32
{0x22,0x63,0x49,0x49,0x7F,0x36,0x00,0x00}, // 0x33
{0x18,0x1C,0x16,0x13,0x7F,0x7F,0x10,0x00}, // 0x34
{0x27,0x67,0x45,0x45,0x7D,0x39,0x00,0x00}, // 0x35
{0x3C,0x7E,0x4B,0x49,0x79,0x30,0x00,0x00}, // 0x36
{0x03,0x63,0x71,0x19,0x0F,0x07,0x00,0x00}, // 0x37
{0x36,0x7F,0x49,0x49,0x7F,0x36,0x00,0x00}, // 0x38
{0x06,0x4F,0x49,0x69,0x3F,0x1E,0x00,0x00}, // 0x39
{0x00,0x00,0x6C,0x6C,0x00,0x00,0x00,0x00}, // 0x3A
{0x00,0xA0,0xEC,0x6C,0x00,0x00,0x00,0x00}, // 0x3B
{0x08,0x1C,0x36,0x63,0x41,0x00,0x00,0x00}, // 0x3C
{0x14,0x14,0x14,0x14,0x14,0x14,0x00,0x00}, // 0x3D
{0x00,0x41,0x63,0x36,0x1C,0x08,0x00,0x00}, // 0x3E
{0x02,0x03,0x51,0x59,0x0F,0x06,0x00,0x00}, // 0x3F
{0x3E,0x7F,0x41,0x5D,0x5D,0x1F,0x1E,0x00}, // 0x40
{0x7C,0x7E,0x13,0x13,0x7E,0x7C,0x00,0x00}, // 0x41
{0x41,0x7F,0x7F,0x49,0x49,0x7F,0x36,0x00}, // 0x42
{0x1C,0x3E,0x63,0x41,0x41,0x63,0x22,0x00}, // 0x43
{0x41,0x7F,0x7F,0x41,0x63,0x7F,0x1C,0x00}, // 0x44
{0x41,0x7F,0x7F,0x49,0x5D,0x41,0x63,0x00}, // 0x45
{0x41,0x7F,0x7F,0x49,0x1D,0x01,0x03,0x00}, // 0x46
{0x1C,0x3E,0x63,0x41,0x51,0x73,0x72,0x00}, // 0x47
{0x7F,0x7F,0x08,0x08,0x7F,0x7F,0x00,0x00}, // 0x48
{0x00,0x41,0x7F,0x7F,0x41,0x00,0x00,0x00}, // 0x49
{0x30,0x70,0x40,0x41,0x7F,0x3F,0x01,0x00}, // 0x4A
{0x41,0x7F,0x7F,0x08,0x1C,0x77,0x63,0x00}, // 0x4B
{0x41,0x7F,0x7F,0x41,0x40,0x60,0x70,0x00}, // 0x4C
{0x7F,0x7F,0x06,0x0C,0x06,0x7F,0x7F,0x00}, // 0x4D
{0x7F,0x7F,0x06,0x0C,0x18,0x7F,0x7F,0x00}, // 0x4E
{0x1C,0x3E,0x63,0x41,0x63,0x3E,0x1C,0x00}, // 0x4F
{0x41,0x7F,0x7F,0x49,0x09,0x0F,0x06,0x00}, // 0x50
{0x1E,0x3F,0x21,0x71,0x7F,0x5E,0x00,0x00}, // 0x51
{0x41,0x7F,0x7F,0x19,0x39,0x6F,0x46,0x00}, // 0x52
{0x26,0x67,0x4D,0x59,0x7B,0x32,0x00,0x00}, // 0x53
{0x03,0x41,0x7F,0x7F,0x41,0x03,0x00,0x00}, // 0x54
{0x7F,0x7F,0x40,0x40,0x7F,0x7F,0x00,0x00}, // 0x55
{0x1F,0x3F,0x60,0x60,0x3F,0x1F,0x00,0x00}, // 0x56
{0x7F,0x7F,0x30,0x18,0x30,0x7F,0x7F,0x00}, // 0x57
{0x63,0x77,0x1C,0x08,0x1C,0x77,0x63,0x00}, // 0x58
{0x07,0x4F,0x78,0x78,0x4F,0x07,0x00,0x00}, // 0x59
{0x67,0x73,0x59,0x4D,0x47,0x63,0x71,0x00}, // 0x5A
{0x00,0x7F,0x7F,0x41,0x41,0x00,0x00,0x00}, // 0x5B
{0x01,0x03,0x06,0x0C,0x18,0x30,0x60,0x00}, // 0x5C
{0x00,0x41,0x41,0x7F,0x7F,0x00,0x00,0x00}, // 0x5D
{0x08,0x0C,0x06,0x03,0x06,0x0C,0x08,0x00}, // 0x5E
{0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80}, // 0x5F
{0x00,0x00,0x03,0x07,0x04,0x00,0x00,0x00}, // 0x60
{0x20,0x74,0x54,0x54,0x3C,0x78,0x40,0x00}, // 0x61
{0x41,0x3F,0x7F,0x44,0x44,0x7C,0x38,0x00}, // 0x62
{0x38,0x7C,0x44,0x44,0x6C,0x28,0x00,0x00}, // 0x63
{0x30,0x78,0x48,0x49,0x3F,0x7F,0x40,0x00}, // 0x64
{0x38,0x7C,0x54,0x54,0x5C,0x18,0x00,0x00}, // 0x65
{0x48,0x7E,0x7F,0x49,0x03,0x02,0x00,0x00}, // 0x66
{0x98,0xBC,0xA4,0xA4,0xF8,0x7C,0x04,0x00}, // 0x67
{0x41,0x7F,0x7F,0x08,0x04,0x7C,0x78,0x00}, // 0x68
{0x00,0x44,0x7D,0x7D,0x40,0x00,0x00,0x00}, // 0x69
{0x40,0xC4,0x84,0xFD,0x7D,0x00,0x00,0x00}, // 0x6A
{0x41,0x7F,0x7F,0x10,0x38,0x6C,0x44,0x00}, // 0x6B
{0x00,0x41,0x7F,0x7F,0x40,0x00,0x00,0x00}, // 0x6C
{0x7C,0x7C,0x0C,0x18,0x0C,0x7C,0x78,0x00}, // 0x6D
{0x7C,0x7C,0x04,0x04,0x7C,0x78,0x00,0x00}, // 0x6E
{0x38,0x7C,0x44,0x44,0x7C,0x38,0x00,0x00}, // 0x6F
{0x84,0xFC,0xF8,0xA4,0x24,0x3C,0x18,0x00}, // 0x70
{0x18,0x3C,0x24,0xA4,0xF8,0xFC,0x84,0x00}, // 0x71
{0x44,0x7C,0x78,0x44,0x1C,0x18,0x00,0x00}, // 0x72
{0x48,0x5C,0x54,0x54,0x74,0x24,0x00,0x00}, // 0x73
{0x00,0x04,0x3E,0x7F,0x44,0x24,0x00,0x00}, // 0x74
{0x3C,0x7C,0x40,0x40,0x3C,0x7C,0x40,0x00}, // 0x75
{0x1C,0x3C,0x60,0x60,0x3C,0x1C,0x00,0x00}, // 0x76
{0x3C,0x7C,0x60,0x30,0x60,0x7C,0x3C,0x00}, // 0x77
{0x44,0x6C,0x38,0x10,0x38,0x6C,0x44,0x00}, // 0x78
{0x9C,0xBC,0xA0,0xA0,0xFC,0x7C,0x00,0x00}, // 0x79
{0x4C,0x64,0x74,0x5C,0x4C,0x64,0x00,0x00}, // 0x7A
{0x08,0x08,0x3E,0x77,0x41,0x41,0x00,0x00}, // 0x7B
{0x00,0x00,0x00,0x77,0x77,0x00,0x00,0x00}, // 0x7C
{0x41,0x41,0x77,0x3E,0x08,0x08,0x00,0x00}, // 0x7D
{0x02,0x03,0x01,0x03,0x02,0x03,0x01,0x00}, // 0x7E
{0x78,0x7C,0x46,0x43,0x46,0x7C,0x78,0x00}, // 0x7F
};
#endif

File diff suppressed because it is too large Load Diff

@ -0,0 +1,373 @@
/** \file ssd1306.h */
#if !defined(SSD1306_H__C33398CC_133C_46F3_B9C5_5D678D1943A7__INCLUDED_)
#define SSD1306_H__C33398CC_133C_46F3_B9C5_5D678D1943A7__INCLUDED_
#include "board_config.h"
// Success / Error
// ------------------------------------------------------------------------------------
#define SSD1306_SUCCESS 0
#define SSD1306_ERROR 1
// Address definition
// ------------------------------------------------------------------------------------
#define SSD1306_ADDR 0x3C
// Command definition
// ------------------------------------------------------------------------------------
#define SSD1306_COMMAND 0x80 // Continuation bit=1, D/C=0; 1000 0000
#define SSD1306_COMMAND_STREAM 0x00 // Continuation bit=0, D/C=0; 0000 0000
#define SSD1306_DATA 0xC0 // Continuation bit=1, D/C=1; 1100 0000
#define SSD1306_DATA_STREAM 0x40 // Continuation bit=0, D/C=1; 0100 0000
#define SSD1306_SET_MUX_RATIO 0xA8 // Set MUX ratio to N+1 MUX, N=A[5:0] : from 16MUX to 64MUX
#define SSD1306_DISPLAY_OFFSET 0xD3 // Set Display Offset
#define SSD1306_DISPLAY_ON 0xAF // Display ON in normal mode
#define SSD1306_DISPLAY_OFF 0xAE // Display OFF (sleep mode)
#define SSD1306_DIS_ENT_DISP_ON 0xA4 // Entire Display ON, Output ignores RAM content
#define SSD1306_DIS_IGNORE_RAM 0xA5 // Resume to RAM content display, Output follows RAM content
#define SSD1306_DIS_NORMAL 0xA6 // Normal display, 0 in RAM: OFF in display panel, 1 in RAM: ON in display panel
#define SSD1306_DIS_INVERSE 0xA7 // Inverse display, 0 in RAM: ON in display panel, 1 in RAM: OFF in display panel
#define SSD1306_DEACT_SCROLL 0x2E // Stop scrolling that is configured by command 26h/27h/29h/2Ah
#define SSD1306_ACTIVE_SCROLL 0x2F // Start scrolling that is configured by the scrolling setup commands:26h/27h/29h/2Ah
#define SSD1306_SET_START_LINE 0x40 // Set Display Start Line
#define SSD1306_MEMORY_ADDR_MODE 0x20 // Set Memory, Addressing Mode
#define SSD1306_SET_COLUMN_ADDR 0x21 // Set Column Address
#define SSD1306_SET_PAGE_ADDR 0x22 // Set Page Address
#define SSD1306_SEG_REMAP 0xA0 // Set Segment Re-map, X[0]=0b column address 0 is mapped to SEG0
#define SSD1306_SEG_REMAP_OP 0xA1 // Set Segment Re-map, X[0]=1b: column address 127 is mapped to SEG0
#define SSD1306_COM_SCAN_DIR 0xC0 // Set COM Output, X[3]=0b: normal mode (RESET) Scan from COM0 to COM[N 1], e N is the Multiplex ratio
#define SSD1306_COM_SCAN_DIR_OP 0xC8 // Set COM Output, X[3]=1b: remapped mode. Scan from COM[N-1] to COM0, e N is the Multiplex ratio
#define SSD1306_COM_PIN_CONF 0xDA // Set COM Pins Hardware Configuration,
// A[4]=0b, Sequential COM pin configuration, A[4]=1b(RESET), Alternative COM pin configuration
// A[5]=0b(RESET), Disable COM Left/Right remap, A[5]=1b, Enable COM Left/Right remap
#define SSD1306_SET_CONTRAST 0x81 // Set Contrast Control, Double byte command to select 1 to 256 contrast steps, increases as the value increases
#define SSD1306_SET_OSC_FREQ 0xD5 // Set Display Clock Divide Ratio/Oscillator Frequency
// A[3:0] : Define the divide ratio (D) of the display clocks (DCLK): Divide ratio= A[3:0] + 1, RESET is 0000b (divide ratio = 1)
// A[7:4] : Set the Oscillator Frequency, FOSC. Oscillator Frequency increases with the value of A[7:4] and vice versa. RESET is 1000b
#define SSD1306_SET_CHAR_REG 0x8D // Charge Pump Setting, A[2] = 0b, Disable charge pump(RESET), A[2] = 1b, Enable charge pump during display on
// The Charge Pump must be enabled by the following command:
// 8Dh ; Charge Pump Setting
// 14h ; Enable Charge Pump
// AFh; Display ON
#define SSD1306_SET_PRECHARGE 0xD9 // Set Pre-charge Period
#define SSD1306_VCOM_DESELECT 0xDB // Set VCOMH Deselect Leve
#define SSD1306_NOP 0xE3 // No operation
#define SSD1306_RESET 0xE4 // Maybe SW RESET, @source https://github.com/SmingHub/Sming/issues/501
// Clear Color
// ------------------------------------------------------------------------------------
#define CLEAR_COLOR 0x00
// Init Status
// ------------------------------------------------------------------------------------
#define INIT_STATUS 0xFF
// AREA definition
// ------------------------------------------------------------------------------------
#define START_PAGE_ADDR 0
#define END_PAGE_ADDR 3 // 7 for 128x64, 3 for 128x32 version
#define START_COLUMN_ADDR 0
#define END_COLUMN_ADDR 127
#define RAM_X_END END_COLUMN_ADDR + 1
#define RAM_Y_END END_PAGE_ADDR + 1
#define CACHE_SIZE_MEM (1 + END_PAGE_ADDR) * (1 + END_COLUMN_ADDR)
#define MAX_X END_COLUMN_ADDR
#define MAX_Y (END_PAGE_ADDR + 1) * 8
// @var set area
extern unsigned int _counter;
/**
* --------------------------------------------------------------------------------------------+
* PRIVATE FUNCTIONS
* --------------------------------------------------------------------------------------------+
*/
/**
* @brief SSD1306 Init
*
* @param uint8_t
*
* @return uint8_t
*/
uint8_t SSD1306_Init (uint8_t);
/**
* @brief SSD1306 Send Start and SLAW request
*
* @param uint8_t
*
* @return uint8_t
*/
uint8_t SSD1306_Send_StartAndSLAW (uint8_t);
/**
* @brief SSD1306 Send command
*
* @param uint8_t
*
* @return uint8_t
*/
uint8_t SSD1306_Send_Command (uint8_t);
/**
* +------------------------------------------------------------------------------------+
* |== PUBLIC FUNCTIONS ================================================================|
* +------------------------------------------------------------------------------------+
*/
/**
* @brief SSD1306 Clear screen
*
* @param void
*
* @return void
*/
void SSD1306_ClearScreen (void);
/**
* @brief SSD1306 Normal colors
*
* @param uint8_t
*
* @return uint8_t
*/
uint8_t SSD1306_NormalScreen (uint8_t);
/**
* @brief SSD1306 Inverse colors
*
* @param uint8_t
*
* @return uint8_t
*/
uint8_t SSD1306_InverseScreen (uint8_t);
/**
* @brief SSD1306 Update screen
*
* @param uint8_t
*
* @return uint8_t
*/
uint8_t SSD1306_UpdateScreen (uint8_t);
/**
* @brief SSD1306 Update text position
*
* @param void
*
* @return uint8_t
*/
uint8_t SSD1306_UpdatePosition (void);
/**
* @brief SSD1306 Set position
*
* @param uint8_t
* @param uint8_t
*
* @return void
*/
void SSD1306_SetPosition (uint8_t, uint8_t);
/**
* @brief SSD1306 Draw character
*
* @param char
*
* @return uint8_t
*/
uint8_t SSD1306_DrawChar (char);
/**
* @brief SSD1306 Draw string
*
* @param char *
*
* @return void
*/
void SSD1306_DrawString (char *);
/**
* @brief Draw pixel
*
* @param uint8_t
* @param uint8_t
*
* @return uint8_t
*/
uint8_t SSD1306_DrawPixel (uint8_t, uint8_t);
/**
* @brief Draw line
*
* @param uint8_t
* @param uint8_t
* @param uint8_t
* @param uint8_t
*
* @return uint8_t
*/
uint8_t SSD1306_DrawLine (uint8_t, uint8_t, uint8_t, uint8_t);
#if 0
#define OzOLED_Max_X 128 //128 Pixels
#define OzOLED_Max_Y 64 //64 Pixels
#define OLED_ADDRESS_W 0x3C
#define OLED_ADDRESS_R 0x3D
#define I2C_400KHZ 1 // 0 to use default 100Khz, 1 for 400Khz
// registers
#define OzOLED_COMMAND_MODE 0x80
#define OzOLED_DATA_MODE 0x40
// commands
#define OzOLED_CMD_DISPLAY_OFF 0xAE
#define OzOLED_CMD_DISPLAY_ON 0xAF
#define OzOLED_CMD_NORMAL_DISPLAY 0xA6
#define OzOLED_CMD_INVERSE_DISPLAY 0xA7
#define OzOLED_CMD_SET_BRIGHTNESS 0x81
#define OzOLED_RIGHT_SCROLL 0x26
#define OzOLED_LEFT_SCROLL 0x27
#define OzOLED_SET_VERTICAL_SCROLL_AREA 0xA3
#define OzOLED_VERTICAL_RIGHT_SCROLL 0x29
#define OzOLED_VERTICAL_LEFT_SCROLL 0x2A
#define OzOLED_CMD_ACTIVATE_SCROLL 0x2F
#define OzOLED_CMD_DEACTIVATE_SCROLL 0x2E
#define HORIZONTAL_ADDRESSING 0x00
#define PAGE_ADDRESSING 0x02
#define Scroll_Left 0x00
#define Scroll_Right 0x01
#define Scroll_Up 0x02
#define Scroll_Down 0x03
#define Scroll_2Frames 0x07
#define Scroll_3Frames 0x04
#define Scroll_4Frames 0x05
#define Scroll_5Frames 0x00
#define Scroll_25Frames 0x06
#define Scroll_64Frames 0x01
#define Scroll_128Frames 0x02
#define Scroll_256Frames 0x03
// =================== High Level ===========================
#define OLED_I2C_ADDRESS 0x3C
// The SSD1306 datasheet (pg.20) says that a control byte has to be sent before sending a command
#define OLED_CONTROL_BYTE_CMD_SINGLE 0x80
#define OLED_CONTROL_BYTE_CMD_STREAM 0x00
#define OLED_CONTROL_BYTE_DATA_STREAM 0x40
// Fundamental commands (pg.28)
#define OLED_CMD_SET_CONTRAST 0x81 // follow with 0x7F
#define OLED_CMD_DISPLAY_RAM 0xA4
#define OLED_CMD_DISPLAY_ALLON 0xA5
#define OLED_CMD_DISPLAY_NORMAL 0xA6
#define OLED_CMD_DISPLAY_INVERTED 0xA7
#define OLED_CMD_DISPLAY_OFF 0xAE
#define OLED_CMD_DISPLAY_ON 0xAF
// Addressing Command Table (pg.30)
#define OLED_CMD_SET_MEMORY_ADDR_MODE 0x20 // follow with 0x00 = HORZ mode = Behave like a KS108 graphic LCD
#define OLED_CMD_SET_COLUMN_RANGE 0x21 // can be used only in HORZ/VERT mode - follow with 0x00 + 0x7F = COL127
#define OLED_CMD_SET_PAGE_RANGE 0x22 // can be used only in HORZ/VERT mode - follow with 0x00 + 0x07 = PAGE7
// Hardware Config (pg.31)
#define OLED_CMD_SET_DISPLAY_START_LINE 0x40
#define OLED_CMD_SET_SEGMENT_REMAP 0xA1
#define OLED_CMD_SET_MUX_RATIO 0xA8 // follow with 0x3F = 64 MUX
#define OLED_CMD_SET_COM_SCAN_MODE 0xC8
#define OLED_CMD_SET_DISPLAY_OFFSET 0xD3 // follow with 0x00
#define OLED_CMD_SET_COM_PIN_MAP 0xDA // follow with 0x12
// Timing and Driving Scheme (pg.32)
#define OLED_CMD_SET_DISPLAY_CLK_DIV 0xD5 // follow with 0x80
#define OLED_CMD_SET_PRECHARGE 0xD9 // follow with 0x22
#define OLED_CMD_SET_VCOMH_DESELCT 0xDB // follow with 0x30
// Charge Pump (pg.62)
#define OLED_CMD_SET_CHARGE_PUMP 0x8D // follow with 0x14
// NOP
#define OLED_CMD_NOP 0xE3
void Oled_SendCommand(unsigned char command);
void Oled_SendData(unsigned char data);
void Oled_PrintCharXY(char C, unsigned char X, unsigned char Y);
void Oled_PrintChar(char C);
void Oled_PrintString(const char *String, unsigned char X, unsigned char Y, unsigned char numChar);
void Oled_SetCursorXY(unsigned char X, unsigned char Y);
unsigned char Oled_PrintNumberXY(long long_num, unsigned char X, unsigned char Y);
unsigned char Oled_PrintNumber(long long_num);
unsigned char Oled_PrintFloatXY(float float_num, unsigned char prec, unsigned char X, unsigned char Y);
void Oled_SetPowerOff(void);
void Oled_SetPowerOn(void);
void Oled_SetNormalDisplay(void);
void Oled_SetPageMode(void);
void Oled_ClearDisplay(void);
void Oled_Initialization(void);
void begin_oled_i2c_ssd1306_12864();
void oled_command(unsigned char data);
void oled_data(unsigned char data);
void oled_black_white();
void dispaly_bmp_image(unsigned char __flash *img_buf);
#endif
#endif

@ -0,0 +1,40 @@
#include "ssd1306_i2c.h"
#include "app_gpio_i2c.h"
int8_t TWI_MT_Start (void)
{
App_Gpio_I2C_Start();
return SUCCESS;
}
int8_t TWI_MT_Send_SLAW (uint8_t address)
{
bool bRet;
bRet = App_Gpio_I2C_WriteData(address << 1);
if(bRet == false)
return FAIL;
return SUCCESS;
}
int8_t TWI_MT_Send_Data (uint8_t data)
{
bool bRet;
bRet = App_Gpio_I2C_WriteData(data);
if(bRet == false)
return FAIL;
return SUCCESS;
}
int8_t TWI_MR_Send_SLAR (uint8_t address)
{
bool bRet;
bRet = App_Gpio_I2C_WriteData(((address << 1) | 0x01));
if(bRet == false)
return FAIL;
return SUCCESS;
}
void TWI_Stop (void)
{
App_Gpio_I2C_Stop();
}

@ -0,0 +1,14 @@
/** \file ssd1306_i2c.h */
#if !defined(SSD1306_I2C_H__AF936065_D874_4AA4_A7D4_296DA996C6F3__INCLUDED_)
#define SSD1306_I2C_H__AF936065_D874_4AA4_A7D4_296DA996C6F3__INCLUDED_
#include "board_config.h"
int8_t TWI_MT_Start (void);
int8_t TWI_MT_Send_SLAW (uint8_t address);
int8_t TWI_MT_Send_Data (uint8_t data);
int8_t TWI_MR_Send_SLAR (uint8_t address);
void TWI_Stop (void);
#endif

@ -0,0 +1,85 @@
#include "sw_timer.h"
typedef struct _timer_callback_info
{
SW_TIMER_CALLBACK_TYPE SW_Callback_Type;
uint32_t SW_Timer_StartTick;
uint32_t SW_Timer_PeriodCount;
SW_TIMER_CALLBACK_FN SW_Timer_CallbackFunction;
}SW_TIMER_INFO;
static SW_TIMER_INFO SW_Timer_Info[MAX_SW_TIMER_REGISTER_COUNT];
bool SW_Timer_Callback_Register(SW_TIMER_CALLBACK_TYPE type, uint32_t PeriodTime, SW_TIMER_CALLBACK_FN pTimerCallback)
{
uint8_t i;
bool ret = false;
for(i = 0 ; i < MAX_SW_TIMER_REGISTER_COUNT ; i++)
{
if(SW_Timer_Info[i].SW_Timer_CallbackFunction == NULL)
{
SW_Timer_Info[i].SW_Callback_Type = type;
SW_Timer_Info[i].SW_Timer_StartTick = millis();
SW_Timer_Info[i].SW_Timer_PeriodCount = PeriodTime;
SW_Timer_Info[i].SW_Timer_CallbackFunction = pTimerCallback;
ret = true;
break;
}
}
return ret;
}
bool SW_Timer_Callback_UnRegister(SW_TIMER_CALLBACK_FN pSwTimerCallbackFunc)
{
uint8_t i;
bool ret = false;
for(i = 0 ; i < MAX_SW_TIMER_REGISTER_COUNT ; i++)
{
if(SW_Timer_Info[i].SW_Timer_CallbackFunction == pSwTimerCallbackFunc)
{
SW_Timer_Info[i].SW_Callback_Type = SW_TIMER_RUN_NONE;
SW_Timer_Info[i].SW_Timer_CallbackFunction = NULL;
ret = true;
}
}
return ret;
}
void SW_Timer_Callback_Process(void)
{
uint8_t i;
uint32_t nowTickCount = millis();
for(i = 0 ; i < MAX_SW_TIMER_REGISTER_COUNT ; i++)
{
if(SW_Timer_Info[i].SW_Timer_CallbackFunction != NULL &&
SW_Timer_Info[i].SW_Callback_Type != SW_TIMER_RUN_NONE)
{
if((nowTickCount - SW_Timer_Info[i].SW_Timer_StartTick) >= SW_Timer_Info[i].SW_Timer_PeriodCount)
{
if(SW_Timer_Info[i].SW_Callback_Type == SW_TIMER_RUN_ONNY_ONCE)
{
SW_Timer_Info[i].SW_Timer_StartTick = 0xFFFFFFFF;
SW_Timer_Info[i].SW_Callback_Type = SW_TIMER_RUN_NONE;
SW_Timer_Info[i].SW_Timer_CallbackFunction();
SW_Timer_Info[i].SW_Timer_CallbackFunction = NULL;
}
else
{
SW_Timer_Info[i].SW_Timer_CallbackFunction();
SW_Timer_Info[i].SW_Timer_StartTick = nowTickCount;
}
}
}
}
}

@ -0,0 +1,25 @@
/** \file sw_timer.h */
#if !defined(SW_TIMER_H__8AF06FDD_AC0A_4693_88C3_8ACCF1AB4372__INCLUDED_)
#define SW_TIMER_H__8AF06FDD_AC0A_4693_88C3_8ACCF1AB4372__INCLUDED_
#include "define.h"
#include "board_config.h"
#define MAX_SW_TIMER_REGISTER_COUNT 10
typedef enum
{
SW_TIMER_RUN_NONE,
SW_TIMER_RUN_ONNY_ONCE,
SW_TIMER_RUN_CONTINUE,
}SW_TIMER_CALLBACK_TYPE;
typedef void (*SW_TIMER_CALLBACK_FN) (void);
bool SW_Timer_Callback_Register(SW_TIMER_CALLBACK_TYPE type, uint32_t PeriodTime, SW_TIMER_CALLBACK_FN pTimerCallback);
bool SW_Timer_Callback_UnRegister(SW_TIMER_CALLBACK_FN pSwTimerCallbackFunc);
void SW_Timer_Callback_Process(void);
#endif

@ -4,6 +4,11 @@
static volatile uint8_t usTickCountDiv; static volatile uint8_t usTickCountDiv;
static volatile uint32_t msTickCount;
static void SystemTimerInitialization(void);
static void SystemTimer_Interrput_Handler(void);
static uint32_t SystemTimer_GetPeriodCount(uint32_t prescalar, uint32_t frequency);
void SystemCoreClockSet(SYSTEM_CORE_CLOCK_LIST clock) void SystemCoreClockSet(SYSTEM_CORE_CLOCK_LIST clock)
{ {
@ -26,5 +31,75 @@ void SystemCoreClockSet(SYSTEM_CORE_CLOCK_LIST clock)
LP_SetOperatingVoltage(LP_OVR_1_1); LP_SetOperatingVoltage(LP_OVR_1_1);
break;; break;;
} }
SystemTimerInitialization();
}
uint32_t SystemTimer_Get_TickCount(void)
{
return msTickCount;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////
static void SystemTimerInitialization(void)
{
// Declare variables
tmr_cfg_t tmr;
int tmr_id = MXC_TMR_GET_IDX(SYSTEM_TIMER_INSTANCE);
uint32_t periodTicks = SystemTimer_GetPeriodCount(1, 1000);
/*
Steps for configuring a timer for PWM mode:
1. Disable the timer
2. Set the prescale value
3 Configure the timer for continuous mode
4. Set polarity, timer parameters
5. Enable Timer
*/
TMR_Disable(SYSTEM_TIMER_INSTANCE);
TMR_Init(SYSTEM_TIMER_INSTANCE, TMR_PRES_1, 0);
tmr.mode = TMR_MODE_CONTINUOUS;
tmr.cmp_cnt = (periodTicks - 1);
tmr.pol = 0;
TMR_Config(SYSTEM_TIMER_INSTANCE, &tmr);
if(tmr_id == 0){
NVIC_SetVector(TMR0_IRQn, SystemTimer_Interrput_Handler);
NVIC_EnableIRQ(TMR0_IRQn);
}
else if(tmr_id == 1)
{
NVIC_SetVector(TMR1_IRQn, SystemTimer_Interrput_Handler);
NVIC_EnableIRQ(TMR1_IRQn);
}
else if(tmr_id == 2)
{
NVIC_SetVector(TMR2_IRQn, SystemTimer_Interrput_Handler);
NVIC_EnableIRQ(TMR2_IRQn);
}
msTickCount = 0;
TMR_Enable(SYSTEM_TIMER_INSTANCE);
} }
static void SystemTimer_Interrput_Handler(void)
{
TMR_IntClear(SYSTEM_TIMER_INSTANCE);
msTickCount++;
}
static uint32_t SystemTimer_GetPeriodCount(uint32_t prescalar, uint32_t frequency)
{
uint32_t retVal, clkFreq;
clkFreq = PeripheralClock;
retVal = clkFreq / (prescalar * frequency);
return retVal;
}

@ -11,6 +11,12 @@ typedef enum
HIRC_24MHZ, HIRC_24MHZ,
}SYSTEM_CORE_CLOCK_LIST; }SYSTEM_CORE_CLOCK_LIST;
#define Delay_ms(delay) mxc_delay(MXC_DELAY_MSEC(delay))
#define Delay_us(delay) mxc_delay(MXC_DELAY_USEC(delay))
void SystemCoreClockSet(SYSTEM_CORE_CLOCK_LIST clock); void SystemCoreClockSet(SYSTEM_CORE_CLOCK_LIST clock);
uint32_t SystemTimer_Get_TickCount(void);
#endif #endif

File diff suppressed because one or more lines are too long

@ -117,10 +117,30 @@
<pMon>BIN\CMSIS_AGDI.dll</pMon> <pMon>BIN\CMSIS_AGDI.dll</pMon>
</DebugOpt> </DebugOpt>
<TargetDriverDllRegistry> <TargetDriverDllRegistry>
<SetRegEntry>
<Number>0</Number>
<Key>ARMRTXEVENTFLAGS</Key>
<Name>-L70 -Z18 -C0 -M0 -T1</Name>
</SetRegEntry>
<SetRegEntry>
<Number>0</Number>
<Key>DLGTARM</Key>
<Name>(1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)</Name>
</SetRegEntry>
<SetRegEntry>
<Number>0</Number>
<Key>ARMDBGFLAGS</Key>
<Name></Name>
</SetRegEntry>
<SetRegEntry>
<Number>0</Number>
<Key>DLGUARM</Key>
<Name></Name>
</SetRegEntry>
<SetRegEntry> <SetRegEntry>
<Number>0</Number> <Number>0</Number>
<Key>CMSIS_AGDI</Key> <Key>CMSIS_AGDI</Key>
<Name>-X"" -O206 -S0 -C0 -P00000000 -N00("") -D00(00000000) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP20 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0MAX32660.FLM -FS00 -FL040000 -FP0($$Device:MAX32660$Flash\MAX32660.FLM)</Name> <Name>-X"" -O206 -S0 -C0 -P00000000 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP20 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0MAX32660.FLM -FS00 -FL040000 -FP0($$Device:MAX32660$Flash\MAX32660.FLM)</Name>
</SetRegEntry> </SetRegEntry>
<SetRegEntry> <SetRegEntry>
<Number>0</Number> <Number>0</Number>
@ -135,12 +155,12 @@
<DebugFlag> <DebugFlag>
<trace>0</trace> <trace>0</trace>
<periodic>1</periodic> <periodic>1</periodic>
<aLwin>0</aLwin> <aLwin>1</aLwin>
<aCover>0</aCover> <aCover>0</aCover>
<aSer1>0</aSer1> <aSer1>0</aSer1>
<aSer2>0</aSer2> <aSer2>0</aSer2>
<aPa>0</aPa> <aPa>0</aPa>
<viewmode>0</viewmode> <viewmode>1</viewmode>
<vrSel>0</vrSel> <vrSel>0</vrSel>
<aSym>0</aSym> <aSym>0</aSym>
<aTbox>0</aTbox> <aTbox>0</aTbox>
@ -235,17 +255,77 @@
<RteFlg>0</RteFlg> <RteFlg>0</RteFlg>
<bShared>0</bShared> <bShared>0</bShared>
</File> </File>
<File>
<GroupNumber>1</GroupNumber>
<FileNumber>5</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\Application\sw_timer.c</PathWithFileName>
<FilenameWithoutPath>sw_timer.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>1</GroupNumber>
<FileNumber>6</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\Application\app_gpio_led.c</PathWithFileName>
<FilenameWithoutPath>app_gpio_led.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>1</GroupNumber>
<FileNumber>7</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\Application\app_gpio_i2c.c</PathWithFileName>
<FilenameWithoutPath>app_gpio_i2c.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>1</GroupNumber>
<FileNumber>8</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\Application\app_ring_buffer.c</PathWithFileName>
<FilenameWithoutPath>app_ring_buffer.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>1</GroupNumber>
<FileNumber>9</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\Application\app_uart.c</PathWithFileName>
<FilenameWithoutPath>app_uart.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group> </Group>
<Group> <Group>
<GroupName>Device</GroupName> <GroupName>Device</GroupName>
<tvExp>1</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel> <cbSel>0</cbSel>
<RteFlg>0</RteFlg> <RteFlg>0</RteFlg>
<File> <File>
<GroupNumber>2</GroupNumber> <GroupNumber>2</GroupNumber>
<FileNumber>5</FileNumber> <FileNumber>10</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -265,7 +345,7 @@
<RteFlg>0</RteFlg> <RteFlg>0</RteFlg>
<File> <File>
<GroupNumber>3</GroupNumber> <GroupNumber>3</GroupNumber>
<FileNumber>6</FileNumber> <FileNumber>11</FileNumber>
<FileType>2</FileType> <FileType>2</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -285,7 +365,7 @@
<RteFlg>0</RteFlg> <RteFlg>0</RteFlg>
<File> <File>
<GroupNumber>4</GroupNumber> <GroupNumber>4</GroupNumber>
<FileNumber>7</FileNumber> <FileNumber>12</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -297,7 +377,7 @@
</File> </File>
<File> <File>
<GroupNumber>4</GroupNumber> <GroupNumber>4</GroupNumber>
<FileNumber>8</FileNumber> <FileNumber>13</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -309,7 +389,7 @@
</File> </File>
<File> <File>
<GroupNumber>4</GroupNumber> <GroupNumber>4</GroupNumber>
<FileNumber>9</FileNumber> <FileNumber>14</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -321,7 +401,7 @@
</File> </File>
<File> <File>
<GroupNumber>4</GroupNumber> <GroupNumber>4</GroupNumber>
<FileNumber>10</FileNumber> <FileNumber>15</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -333,7 +413,7 @@
</File> </File>
<File> <File>
<GroupNumber>4</GroupNumber> <GroupNumber>4</GroupNumber>
<FileNumber>11</FileNumber> <FileNumber>16</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -345,7 +425,7 @@
</File> </File>
<File> <File>
<GroupNumber>4</GroupNumber> <GroupNumber>4</GroupNumber>
<FileNumber>12</FileNumber> <FileNumber>17</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -357,7 +437,7 @@
</File> </File>
<File> <File>
<GroupNumber>4</GroupNumber> <GroupNumber>4</GroupNumber>
<FileNumber>13</FileNumber> <FileNumber>18</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -369,7 +449,7 @@
</File> </File>
<File> <File>
<GroupNumber>4</GroupNumber> <GroupNumber>4</GroupNumber>
<FileNumber>14</FileNumber> <FileNumber>19</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -381,7 +461,7 @@
</File> </File>
<File> <File>
<GroupNumber>4</GroupNumber> <GroupNumber>4</GroupNumber>
<FileNumber>15</FileNumber> <FileNumber>20</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -393,7 +473,7 @@
</File> </File>
<File> <File>
<GroupNumber>4</GroupNumber> <GroupNumber>4</GroupNumber>
<FileNumber>16</FileNumber> <FileNumber>21</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -405,7 +485,7 @@
</File> </File>
<File> <File>
<GroupNumber>4</GroupNumber> <GroupNumber>4</GroupNumber>
<FileNumber>17</FileNumber> <FileNumber>22</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -417,7 +497,7 @@
</File> </File>
<File> <File>
<GroupNumber>4</GroupNumber> <GroupNumber>4</GroupNumber>
<FileNumber>18</FileNumber> <FileNumber>23</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -429,7 +509,7 @@
</File> </File>
<File> <File>
<GroupNumber>4</GroupNumber> <GroupNumber>4</GroupNumber>
<FileNumber>19</FileNumber> <FileNumber>24</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -441,7 +521,7 @@
</File> </File>
<File> <File>
<GroupNumber>4</GroupNumber> <GroupNumber>4</GroupNumber>
<FileNumber>20</FileNumber> <FileNumber>25</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -453,7 +533,7 @@
</File> </File>
<File> <File>
<GroupNumber>4</GroupNumber> <GroupNumber>4</GroupNumber>
<FileNumber>21</FileNumber> <FileNumber>26</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -465,7 +545,7 @@
</File> </File>
<File> <File>
<GroupNumber>4</GroupNumber> <GroupNumber>4</GroupNumber>
<FileNumber>22</FileNumber> <FileNumber>27</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -477,7 +557,7 @@
</File> </File>
<File> <File>
<GroupNumber>4</GroupNumber> <GroupNumber>4</GroupNumber>
<FileNumber>23</FileNumber> <FileNumber>28</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -489,7 +569,7 @@
</File> </File>
<File> <File>
<GroupNumber>4</GroupNumber> <GroupNumber>4</GroupNumber>
<FileNumber>24</FileNumber> <FileNumber>29</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -501,7 +581,7 @@
</File> </File>
<File> <File>
<GroupNumber>4</GroupNumber> <GroupNumber>4</GroupNumber>
<FileNumber>25</FileNumber> <FileNumber>30</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -513,7 +593,7 @@
</File> </File>
<File> <File>
<GroupNumber>4</GroupNumber> <GroupNumber>4</GroupNumber>
<FileNumber>26</FileNumber> <FileNumber>31</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -525,7 +605,7 @@
</File> </File>
<File> <File>
<GroupNumber>4</GroupNumber> <GroupNumber>4</GroupNumber>
<FileNumber>27</FileNumber> <FileNumber>32</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -537,4 +617,36 @@
</File> </File>
</Group> </Group>
<Group>
<GroupName>SSD1306</GroupName>
<tvExp>1</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>33</FileNumber>
<FileType>1</FileType>
<tvExp>1</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\Application\oled_ssd1306\ssd1306.c</PathWithFileName>
<FilenameWithoutPath>ssd1306.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>34</FileNumber>
<FileType>1</FileType>
<tvExp>1</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\Application\oled_ssd1306\ssd1306_i2c.c</PathWithFileName>
<FilenameWithoutPath>ssd1306_i2c.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group>
</ProjectOpt> </ProjectOpt>

@ -339,7 +339,7 @@
<MiscControls></MiscControls> <MiscControls></MiscControls>
<Define>TARGET=32660,TARGET_REV=0x4131</Define> <Define>TARGET=32660,TARGET_REV=0x4131</Define>
<Undefine></Undefine> <Undefine></Undefine>
<IncludePath>..\SDK\Device;..\SDK\Device\Include;..\SDK\Driver\Include;..\SDK\Driver\Source;..\SDK\FlashLoader;..\SDK\Startup;..\Application;..\Application\common;..\Application\left;..\Application\right;..\Lib\Beflex;..\Lib\H3System;..\Application\sensor\accelometer\bma400;..\Application\sensor\bodytemp;..\Application\sensor\ppg;..\Application\eeprom;..\Application\sensor\proximity;..\Application\sensor\sar</IncludePath> <IncludePath>..\SDK\Device;..\SDK\Device\Include;..\SDK\Driver\Include;..\SDK\Driver\Source;..\SDK\FlashLoader;..\SDK\Startup;..\Application;..\Application\oled_ssd1306</IncludePath>
</VariousControls> </VariousControls>
</Cads> </Cads>
<Aads> <Aads>
@ -403,6 +403,31 @@
<FileType>1</FileType> <FileType>1</FileType>
<FilePath>..\Application\system_func.c</FilePath> <FilePath>..\Application\system_func.c</FilePath>
</File> </File>
<File>
<FileName>sw_timer.c</FileName>
<FileType>1</FileType>
<FilePath>..\Application\sw_timer.c</FilePath>
</File>
<File>
<FileName>app_gpio_led.c</FileName>
<FileType>1</FileType>
<FilePath>..\Application\app_gpio_led.c</FilePath>
</File>
<File>
<FileName>app_gpio_i2c.c</FileName>
<FileType>1</FileType>
<FilePath>..\Application\app_gpio_i2c.c</FilePath>
</File>
<File>
<FileName>app_ring_buffer.c</FileName>
<FileType>1</FileType>
<FilePath>..\Application\app_ring_buffer.c</FilePath>
</File>
<File>
<FileName>app_uart.c</FileName>
<FileType>1</FileType>
<FilePath>..\Application\app_uart.c</FilePath>
</File>
</Files> </Files>
</Group> </Group>
<Group> <Group>
@ -535,6 +560,21 @@
</File> </File>
</Files> </Files>
</Group> </Group>
<Group>
<GroupName>SSD1306</GroupName>
<Files>
<File>
<FileName>ssd1306.c</FileName>
<FileType>1</FileType>
<FilePath>..\Application\oled_ssd1306\ssd1306.c</FilePath>
</File>
<File>
<FileName>ssd1306_i2c.c</FileName>
<FileType>1</FileType>
<FilePath>..\Application\oled_ssd1306\ssd1306_i2c.c</FilePath>
</File>
</Files>
</Group>
</Groups> </Groups>
</Target> </Target>
</Targets> </Targets>

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<component_viewer schemaVersion="0.1" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="Component_Viewer.xsd">
<component name="EventRecorderStub" version="1.0.0"/> <!--name and version of the component-->
<events>
</events>
</component_viewer>

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save