📄 main.c
字号:
#include "..\ucos-ii\includes.h"
static INT16U count_t2=2000; //定时2的1000次 就是1秒/亮
static INT16U count_prit=20; //在任务6中用着调试print用的参数。
sbit LED_GRE=P2^0;
sbit LED_RED=P2^1;
//start/alarm /sec /min /hour /day /week /month /year
INT8U code Clock_buf[9]={0x01, 0x00, 0x10,0x40,0x08, 0x1B, 0x05, 0x02, 0x09};
void TaskStart(void* ppdata) reentrant;
void Task_GRE(void* ppdata) reentrant;
void Task_RED(void* ppdata) reentrant;
OS_STK TaskStkStart[MaxStkSize]; //MaxStkSize=100
OS_STK TaskStk_GRE[MaxStkSize];
OS_STK TaskStk_RED[MaxStkSize];
void TMR2_ISR(void) reentrant;
/*******************结构体定义************************/
struct real_time
{
INT8U year;
INT8U month;
INT8U day;
INT8U hour;
INT8U min;
INT8U sec;
}R_time;
void main(void)
{
config(); //要关看门狗
OSInit();
OSTaskCreate(TaskStart, (void *)0, TaskStkStart,5);
EA=1;
OSStart();
}
void TaskStart(void* ppdata) reentrant
{
// INT8U k;
char SFRPAGE_SAVE;
SFRPAGE_SAVE = SFRPAGE;
ppdata=ppdata;
InitTimer0();
ET0=1;
I2cInit();
PCF8563_init();
OSTaskCreate(Task_GRE, (void *)0,TaskStk_GRE,6);
// OSTaskCreate(Task_RED, (void *)0, TaskStk_RED,7);
for(;;)
{
LED_RED=~LED_RED;
PCF8563_Read();
SFRPAGE = UART0_PAGE;
/*
printf("******YEAR: 20%d\n",R_time.year);
printf("******MONTH: %d\n",R_time.month);
printf("******DAY: %d\n",R_time.day);
printf("******MINITUE: %d\n",R_time.min);
printf("******SECOND: %d\n",R_time.sec);
SFRPAGE =SFRPAGE_SAVE;
*/
OSTimeDly(2*OS_TICKS_PER_SEC);
}
}
void Task_GRE(void* ppdata) reentrant
{
char SFRPAGE_SAVE;
SFRPAGE_SAVE = SFRPAGE;
ppdata=ppdata;
for(;;)
{
//LED_GRE=~LED_GRE;
SFRPAGE = UART0_PAGE;
count_prit--;
printf("******number of task_entering: %d\n",count_prit);
if(count_prit==10)
{
count_prit=20;
}
SFRPAGE =SFRPAGE_SAVE ;
OSTimeDly(OS_TICKS_PER_SEC);
}
}
void Task_RED(void* ppdata) reentrant
{
ppdata=ppdata;
for(;;)
{
//LED_RED=~LED_RED;
OSTimeDly(12);
}
}
void TMR2_ISR(void) reentrant
{
char SFRPAGE_SAVE;
SFRPAGE_SAVE = SFRPAGE; // Preserve SFRPAGE
SFRPAGE = TMR2_PAGE;
count_t2--;
if(count_t2==0)
{
count_t2=2000;
LED_GRE=~LED_GRE;
}
TF2=0;
SFRPAGE =SFRPAGE_SAVE ;
}
/****************************************************************************
* 功 能:读取PCF8563时钟芯片内寄存器数据
*---------------------------------------------------------------------------*
* 入口参数:nil
* 出口参数:nil
****************************************************************************/
void PCF8563_Read(void) reentrant
{
R_time.year=I2C_ReadData(0x08,0xff); //读取year,屏蔽高7~5位(7~5无效)
R_time.month=I2C_ReadData(0x07,0x1f); //读取month,屏蔽高7~5位(7~5无效)
R_time.day=I2C_ReadData(0x05,0x3f); //读取day,屏蔽高7-6位(7-6无效)
R_time.hour=I2C_ReadData(0x04,0x3f); //读取小时,屏蔽高7-6位(7-6无效)
R_time.min=I2C_ReadData(0x03,0x7f); //读取分钟,屏蔽高7位(7无效)
R_time.sec=I2C_ReadData(0x02,0x7f); //读取秒,屏蔽高7位(7无效)
}
INT8U I2C_ReadData(INT8U reg,INT8U mark) reentrant
{
INT8U cur_tmr;
cur_tmr=SM_Receive(PCF_R_ADD, reg,SINGLE_ADD) &mark;
cur_tmr=Bcd2Decimal(cur_tmr);//转换为十进制
return cur_tmr;
}
INT8U Bcd2Decimal(INT8U bcd_dat) reentrant
{
INT8U num1,num2;
num1=bcd_dat/16;
num2=bcd_dat%16;
return (num1*10+num2);
}
void PCF8563_init(void) reentrant
{
INT8U i=0;
i=SM_Receive(PCF_R_ADD, 0x00,SINGLE_ADD);
if(i!=0x01) //没有初始化
{
//start/alarm /sec /min /hour /day /week /month /year
for(i=0;i<9;i++)
{
SM_Send(PCF_W_ADD, i,SINGLE_ADD, Clock_buf[i]); //启动时钟
OSTimeDly(3);//delay 30ms
}
//设置报警及定时器中断,定时器中断为脉冲形
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -