/*_____ I N C L U D E S ____________________________________________________*/
#include "ML51.h"
#include "project_config.h"
#include "LED_stripe.h"
/*_____ D E C L A R A T I O N S ____________________________________________*/
// xdata volatile uint8_t u8TH0_Tmp = 0;
// xdata volatile uint8_t u8TL0_Tmp = 0;
#define TH0_INIT (HIBYTE(TIMER_DIV12_VALUE_1ms_FOSC_240000))
#define TL0_INIT (LOBYTE(TIMER_DIV12_VALUE_1ms_FOSC_240000))
//UART 0
bit BIT_UART;
bit uart0_receive_flag=0;
unsigned char uart0_receive_data;
uint16_t counter = 0;
/*_____ D E F I N I T I O N S ______________________________________________*/
volatile uint32_t BitFlag = 0;
volatile uint32_t counter_tick = 0;
/*_____ M A C R O S ________________________________________________________*/
#define SYS_CLOCK (24000000ul)
/*_____ F U N C T I O N S __________________________________________________*/
void tick_counter(void)
{
counter_tick++;
}
uint32_t get_tick(void)
{
return (counter_tick);
}
void set_tick(uint32_t t)
{
counter_tick = t;
}
//void compare_buffer(uint8_t *src, uint8_t *des, int nBytes)
//{
// uint16_t i = 0;
//
// for (i = 0; i < nBytes; i++)
// {
// if (src[i] != des[i])
// {
// printf("error idx : %4d : 0x%2X , 0x%2X\r\n", i , src[i],des[i]);
// set_flag(flag_error , Enable);
// }
// }
// if (!is_flag_set(flag_error))
// {
// printf("compare_buffer finish \r\n");
// set_flag(flag_error , Disable);
// }
//}
//void reset_buffer(void *dest, unsigned int val, unsigned int size)
//{
// uint8_t *pu8Dest;
//// unsigned int i;
//
// pu8Dest = (uint8_t *)dest;
// #if 1
// while (size-- > 0)
// *pu8Dest++ = val;
// #else
// memset(pu8Dest, val, size * (sizeof(pu8Dest[0]) ));
// #endif
//
//}
//void copy_buffer(void *dest, void *src, unsigned int size)
//{
// uint8_t *pu8Src, *pu8Dest;
// unsigned int i;
//
// pu8Dest = (uint8_t *)dest;
// pu8Src = (uint8_t *)src;
// #if 0
// while (size--)
// *pu8Dest++ = *pu8Src++;
// #else
// for (i = 0; i < size; i++)
// pu8Dest[i] = pu8Src[i];
// #endif
//}
//void dump_buffer(uint8_t *pucBuff, int nBytes)
//{
// uint16_t i = 0;
//
// printf("dump_buffer : %2d\r\n" , nBytes);
// for (i = 0 ; i < nBytes ; i++)
// {
// printf("0x%2X," , pucBuff[i]);
// if ((i+1)%8 ==0)
// {
// printf("\r\n");
// }
// }
// printf("\r\n\r\n");
//}
//void dump_buffer_hex(uint8_t *pucBuff, int nBytes)
//{
// int nIdx, i;
// nIdx = 0;
// while (nBytes > 0)
// {
// printf("0x%04X ", nIdx);
// for (i = 0; i < 16; i++)
// printf("%02X ", pucBuff[nIdx + i]);
// printf(" ");
// for (i = 0; i < 16; i++)
// {
// if ((pucBuff[nIdx + i] >= 0x20) && (pucBuff[nIdx + i] < 127))
// printf("%c", pucBuff[nIdx + i]);
// else
// printf(".");
// nBytes--;
// }
// nIdx += 16;
// printf("\n");
// }
// printf("\n");
//}
void delay(uint16_t dly)
{
/*
delay(100) : 14.84 us
delay(200) : 29.37 us
delay(300) : 43.97 us
delay(400) : 58.5 us
delay(500) : 73.13 us
delay(1500) : 0.218 ms (218 us)
delay(2000) : 0.291 ms (291 us)
*/
while( dly--);
}
//void send_UARTString(uint8_t* Data)
//{
// #if 1
// uint16_t i = 0;
// while (Data[i] != '\0')
// {
// #if 1
// SBUF = Data[i++];
// #else
// UART_Send_Data(UART0,Data[i++]);
// #endif
// }
// #endif
// #if 0
// uint16_t i = 0;
//
// for(i = 0;i< (strlen(Data)) ;i++ )
// {
// UART_Send_Data(UART0,Data[i]);
// }
// #endif
// #if 0
// while(*Data)
// {
// UART_Send_Data(UART0, (unsigned char) *Data++);
// }
// #endif
//}
//void send_UARTASCII(uint16_t Temp)
//{
// uint8_t print_buf[16];
// uint16_t i = 15, j;
// *(print_buf + i) = '\0';
// j = (uint16_t)Temp >> 31;
// if(j)
// (uint16_t) Temp = ~(uint16_t)Temp + 1;
// do
// {
// i--;
// *(print_buf + i) = '0' + (uint16_t)Temp % 10;
// (uint16_t)Temp = (uint16_t)Temp / 10;
// }
// while((uint16_t)Temp != 0);
// if(j)
// {
// i--;
// *(print_buf + i) = '-';
// }
// send_UARTString(print_buf + i);
//}
void WS2812C_Init(void)
{
#if defined (ENABLE_SPI)
#if 1
/* Set LED output */
P00 = 1;
P00_INPUT_MODE;
ENABLE_P00_PULLDOWN;
#endif
MFP_P00_SPI0_MOSI;
// P00_QUASI_MODE;
MFP_P02_SPI0_CLK; /*define SPI0 CLK pin */
P02_QUASI_MODE;
#if 0
MFP_P01_SPI0_MISO; /*define SPI0 MISO pin */
P01_QUASI_MODE;
MFP_P03_GPIO; /*define SPI0 SS pin as normal GPIO*/
P03_PUSHPULL_MODE;
#endif
set_SPI0SR_DISMODF; // SS General purpose I/O ( No Mode Fault )
clr_SPI0CR0_SSOE;
clr_SPI0CR0_LSBFE; // MSB first
clr_SPI0CR0_CPOL; // The SPI clock is low in idle mode
clr_SPI0CR0_CPHA; // The data is sample on the second edge of SPI clock
set_SPI0CR0_MSTR; // SPI in Master mode
SPI0_CLOCK_DIV_3; // Select SPI clock
set_SPI0CR0_SPIEN; // Enable SPI function
clr_SPI0SR_SPIF;
#elif defined (ENABLE_GPIO_EMULATE)
P00_PUSHPULL_MODE;
P02_PUSHPULL_MODE; // for debug
#endif
}
void loop(void)
{
static uint8_t flag_first_pwr_on = 1;
if (is_flag_set(flag_1000ms))
{
set_flag(flag_1000ms , FALSE);
P32 ^= 1;
SFRS = 0;printf("log :%d\r\n" , counter++);
}
if (RI)
{
clr_SCON_RI; // Clear RI (Receive Interrupt).
if (flag_first_pwr_on)
{
DemoState = state_Rainbow;
flag_first_pwr_on = 0;
}
else
{
DemoState = SBUF - 0x30;
}
SFRS = 0;printf("DemoState = %bu,%bc\r\n" , DemoState, SBUF);
}
if (!trans_finish_flag)
{
#if defined (ENABLE_DEBUG_WS2812_PROTOCOL)
setLED_ColorWipe(0xFF, 0x00, 0x00);
setLED_delayms(1);
#else
StateMachine();
#endif
}
}
void GPIO_Init(void)
{
MFP_P32_GPIO;
P32_PUSHPULL_MODE;
// P30_PUSHPULL_MODE;
}
void Timer0_IRQHandler(void)
{
tick_counter();
if ((get_tick() % 1000) == 0)
{
set_flag(flag_1000ms , TRUE);
}
if ((get_tick() % 50) == 0)
{
}
}
void Timer0_ISR(void) interrupt 1 // Vector [url=home.php?mod=space&uid=72445]@[/url] 0x0B
{
_push_(SFRS);
SFRS = 0;
clr_TCON_TF0;
TH0 = TH0_INIT;
TL0 = TL0_INIT;
Timer0_IRQHandler();
_pop_(SFRS);
}
void Timer0_Init(void)
{
ENABLE_TIMER0_MODE1;
TIMER0_FSYS_DIV12;
TH0 = TH0_INIT;
TL0 = TL0_INIT;
clr_TCON_TF0;
set_TCON_TR0; //Timer0 run
ENABLE_TIMER0_INTERRUPT; //enable Timer0 interrupt
ENABLE_GLOBAL_INTERRUPT; //enable interrupts
}
// void Serial_ISR (void) interrupt 4
// {
// _push_(SFRS);
// if (RI)
// {
// uart0_receive_flag = 1;
// uart0_receive_data = SBUF;
// clr_SCON_RI; // Clear RI (Receive Interrupt).
// }
// if (TI)
// {
// clr_SCON_TI;
// // if(!BIT_UART)
// // {
// // TI = 0;
// // }
// }
// _pop_(SFRS);
// }
void UART0_Init(void)
{
MFP_P31_UART0_TXD;
P31_QUASI_MODE;
MFP_P30_UART0_RXD;
P30_QUASI_MODE;
SFRS = 0x00;
SCON = 0x50; /*UART0 Mode1,REN=1,TI=1*/
set_PCON_SMOD; /*UART0 Double Rate Enable*/
T3CON &= 0xF8; /*T3PS2=0,T3PS1=0,T3PS0=0(Prescale=1)*/
set_T3CON_BRCK; /*UART0 baud rate clock source = Timer3*/
RH3 = 0xFF; /* HIBYTE(65536 - 13)*/
RL3 = 0xF3; /* LOBYTE(65536 - 13); */
set_T3CON_TR3; /*Trigger Timer3*/
set_SCON_RI;
set_SCON_TI;
BIT_UART = 1;
// ENABLE_UART0_INTERRUPT; /* Enable UART0 interrupt */
// ENABLE_GLOBAL_INTERRUPT; /* Global interrupt enable */
SFRS = 0;printf("\r\n\r\n\r\n\r\nUART0_Init\r\n");
}
void SYS_Init(void)
{
// FsysSelect(FSYS_HIRC);
ALL_GPIO_QUASI_MODE;
// ENABLE_GLOBAL_INTERRUPT; // global enable bit
}
void main (void)
{
SYS_Init();
UART0_Init();
GPIO_Init();
WS2812C_Init();
// setLED_ColorWipe(0, 0, 0);
Timer0_Init();
while(1)
{
loop();
}
}