📄 leddriver.c
字号:
/*----------------------------------------------------------------------------------------------------------------------------------------
说明:本程序主要完成ColorSort的一个LED light的控制。
-----------------------------------------------------------------------------------------------------------------------------------------*/
#include "LedDriver.h"
#include "Ad5258.h"
//Entry----------------------------------------------------
void main(void)
{
uchar index = 0;
//close all interrupt
EA = 0;
EX1 = 0;
EX0 = 0;
TMOD = 0x01; //timer0, mod = 1
//init
InitParams();
//configure AD5258
for(index = 0; index < ADDR_NUM; index ++)
{
RdDataFromEEprom(index);
}
//Timer0
InitTimer0(); //Initial clock0
//Init uart
InitUart(); //
EnableDog();
/*---------------------------------------------------------*/
ET0 = 1; //Timer0 enable
EA = 1; //All Int enable
//loop for ever------------------------------------
while (1) //主循环
{
KickDog();
//adjust
TEST_TP0 = 1;
if(light_flag_up == 2)
{
EA = 0;
light_flag_up = 0;
ConfigAd5258(uaddr_index, I2C_val[uaddr_index]);
WrData2EEprom(uaddr_index);
EA = 1;
}
TEST_TP0 = 0;
if(light_flag_down == 2)
{
EA = 0;
light_flag_down = 0;
ConfigAd5258(uaddr_index, I2C_val[uaddr_index]);
WrData2EEprom(uaddr_index);
EA = 1;
}
if(bSendBack == 1)
{
EA = 0;
bSendBack = 0;
SendByteUart(uart_val);
EA = 1;
}
}
}
//初始化系统参数
void InitParams(void)
{
//max3221
MAX3221_EN = 1;
MAX3221_FORCE_ON = 1;
MAX3221_FORCE_OFF = 0;
//configure
for(uaddr_index = 0; uaddr_index < ADDR_NUM; uaddr_index ++)
I2C_val[uaddr_index] = 160;
//Light
light_flag_up = 0;
light_flag_down = 0;
//Test
time_count = 0;
time_flag = 1;
uart_val = 0;
//connect
led_flag = 0;
led_count = 0;
CONNECT_LED = 0;
}
//Timer0-----------------------------------------------------
//Timer0 中断
void Timer0ISR(void) interrupt 1
{
//disable interrupt
EA = 0;
//light key up
/*----------------------------------------------------------------------------------*/
if(LIGHT_UP == 0)
{
if(light_flag_up == 0)
light_flag_up = 1;
}
else
{
if(light_flag_up == 1)
{
//get address
/*----------------------------------------------------------------------------------*/
uaddr_index = JUMP0;
if(JUMP1 == 1) uaddr_index += 2;
if(I2C_val[uaddr_index] < MAX_STEP_NUM)
I2C_val[uaddr_index] = I2C_val[uaddr_index] + 1;
light_flag_up = 2;
//uart_val = I2C_val[uaddr_index];
//bSendBack = 1;
}
}
//light key down
if(LIGHT_DOWN == 0)
{
if(light_flag_down == 0)
light_flag_down = 1;
}
else
{
if(light_flag_down == 1)
{
//get address
/*----------------------------------------------------------------------------------*/
uaddr_index = JUMP0;
if(JUMP1 == 1) uaddr_index += 2;
if(I2C_val[uaddr_index] > 0)
I2C_val[uaddr_index] = I2C_val[uaddr_index] - 1;
light_flag_down = 2;
//uart_val = I2C_val[uaddr_index];
//bSendBack = 1;
}
}
/*-------------------------------------------------------------------------------------*/
if(time_flag == 1)
{
time_count ++;
if(time_count == 20)
{
time_flag = 0;
MAX3221_EN = 0;
MAX3221_FORCE_ON = 1;
MAX3221_FORCE_OFF = 1;
}
}
//light led
if(led_flag == 1)
{
led_count ++;
if(led_count == 1)
CONNECT_LED = 1;
else if(led_count == 5)
{
CONNECT_LED = 0;
led_flag = 0;
}
}
//enable interrupt
/*--------------------------------------------------------------------------------------*/
InitTimer0();
EA = 1;
}
/*-----------------------------------------------------------------------------------------*/
//初始化Timer0
void InitTimer0(void)
{
TR0 = 0;
TH0 = 0x3C; // 50ms
TL0 = 0xAF;
TR0 = 1;
}
/*-----------------------------------------------------------------------------------------*/
//串口中断
void UartISR(void) interrupt 4
{
if(_testbit_(RI))
{
uart_val = SBUF;
if(uart_val < ADDR_NUM) //instruct
{
uaddr_index = uart_val;
}
else //data
{
if(I2C_val[uaddr_index] > uart_val)
light_flag_down = 2;
else
light_flag_up = 2;
I2C_val[uaddr_index] = uart_val;
bSendBack = 1;
led_count = 0;
led_flag = 1;
}
}
}
/*uart----------------------------------------------------------------------------------------*/
//初始化串口
void InitUart(void)
{
SCON = 0x50; //SCON: serail mode 1, 8-bit UART, enable recv
TMOD |= 0x20; //TMOD: timer 1, mode 2, 8-bit reload
PCON |= 0x80; //SMOD=1;
TH1 = 0xFD; //Baud:19.2k fosc=11.0592MHz
IE |= 0x90; //Enable Serial Interrupt
TR1 = 1; //timer 1 run
}
/*--------------------------------------------------------------------------------------------*/
//串口发送数据
void SendByteUart(uchar val)
{
SBUF = val;
while(TI == 0);
TI = 0;
}
/*enable watch dog----------------------------------------------------------------------------*/
//使能看门狗
void EnableDog(void)
{
WDTRST = 0x1E;
WDTRST = 0xE1;
}
/*kick the dog---------------------------------------------------------------------------------*/
//喂狗
void KickDog(void)
{
WDTRST = 0x1E;
WDTRST = 0xE1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -