📄 main.c
字号:
buff[2]=(New_time.sec%10)|(((New_time.sec/10)<<4)&0x70); // 转化秒
buff[3]=(New_time.min%10)|(((New_time.min/10)<<4)&0x70); // 转化分
buff[4]=(New_time.hour%10)|(((New_time.hour/10)<<4)&0x70); // 转化小时
buff[6]=(New_time.dow&0x07); // 转化星期
buff[5]=(New_data.day%10)|(((New_data.day/10)<<4)&0x30); // 转化日
buff[7]=(New_data.mon%10)|(((New_data.mon/10)<<4)&0x10); // 转化月
if(New_data.year>2000) // 转化年
{
buff[7]=buff[7]&(~0x80);
buff[8]=(New_data.year-2000);
}
else
{
buff[7]=buff[7]|0x80;
buff[8]=(New_data.year-1900);
}
/*初始化PCF8563剩下的寄存器*/
buff[0]=0x00;
buff[1]=0x12;
buff[9]=0x80;
buff[10]=0x80;
buff[11]=0x80;
buff[12]=0x80;
buff[13]=0x80;
buff[14]=0x00;
buff[15]=0x5a;
}
#define PCF8563 0xA2 // PCF8563 I2C地址
extern void UpsysTime(void);
/*******************************************************************************************
** Function name: TASK0
** Descriptions: 通过调试观察RTC的运行
如果按下KEY1,实时时钟PCF8563重新恢复默认设置值为2007年6月22日,星期5,1时22分30秒
** Input: 无
** Output: 无
*******************************************************************************************/
void TASK0(void *pdata)
{
TIME read_time; // 时间结构体, 用于调试观察
DATE read_date; // 日期结构体, 用于调试观察
int32 I2C_Handles=0; // 定义I2C句柄
char buff[7]; // 存放从8563读出的时间和日期数据
char buff2[16] ;
int32 Err;
pdata = pdata;
I2C_Handles = dopen("I2C", O_RDWR, SHARE); // 以读写和共享方式打开I2C设备
if (I2C_Handles < 0 )
{
Err = getlasterr(I2C_Handles); // 打开I2C错误,查看错误状态
while (1)
{
OSTimeDly(OS_TICKS_PER_SEC);
}
}
while (1)
{
if (gpio_get(KEY1) == 0) // 如果按下KEY1,RTC重新恢复默认设置值为2007年6月22日,星期5,1时22分30秒
{
/* RTC的初始设置值 */
TimeToData("2007-06-22","5","01:22:30",buff2);
diocontrol(I2C_Handles, I2C_DEVICE_ADDR, (void *)PCF8563); // 设置从器件写地址
diocontrol(I2C_Handles, I2C_ONE_BYTE_SUBA, (void *)0); // 设置单字节从器件子地址, 从0x00地址开始配置8563的16个寄存器
diocontrol(I2C_Handles, I2C_TIME_DLY, (void *)50); // 设置超时时间
dwrite(I2C_Handles, buff2, sizeof(buff2)); // 向I2C 器件写数据
OSTimeDly(OS_TICKS_PER_SEC/200);
UpsysTime(); // 更新系统内部时钟
}
diocontrol(I2C_Handles, I2C_DEVICE_ADDR, (void *)PCF8563); // 设置从器件读地址
diocontrol(I2C_Handles, I2C_ONE_BYTE_SUBA, (void *)2); // 设置单字节从器件子地址, 从0x02秒寄存器开始读出时间和日期
diocontrol(I2C_Handles, I2C_TIME_DLY, (void *)50); // 设置超时时间
dread(I2C_Handles, buff, sizeof(buff)); // 从I2C 器件读数据
/* 把读出的时间和日期BCD码转换成十进制数 */
read_time.sec = ((buff[0]&0x70)>>4)*10 + (buff[0]&0x0f); // 秒
read_time.min = ((buff[1]&0x70)>>4)*10 + (buff[1]&0x0f); // 分
read_time.hour = ((buff[2]&0x30)>>4)*10 + (buff[2]&0x0f); // 小时
read_time.dow = buff[4]&0x07; // 星期
read_date.day = ((buff[3]&0x30)>>4)*10 + (buff[3]&0x0f); // 日
read_date.mon = ((buff[5]&0x10)>>4)*10 + (buff[5]&0x0f); // 月
if (buff[5]&0x80) // 年为19XX
{
read_date.year = ((buff[6]&0xf0)>>4)*10 + (buff[6]&0x0f) +1900;
}
else // 年为20XX
{
read_date.year = ((buff[6]&0xf0)>>4)*10 + (buff[6]&0x0f) +2000;
}
/* 在此设置断点,从RTC中读出日期和时间参数(read_date, read_time)
通过变量调试窗口观察读出的日期和时间参数
观察RTC是否有运行 */
OSTimeDly(OS_TICKS_PER_SEC/200);
}
}
/*******************************************************************************************
** Function name: TASK1
** Descriptions :
** Input : 无
** Output : 无
*******************************************************************************************/
void TASK1(void *pdata)
{
pdata = pdata;
while (1)
{
OSTimeDly(OS_TICKS_PER_SEC);
}
}
/*******************************************************************************************
** Function name: TASK2
** Descriptions :
** Input : 无
** Output : 无
*******************************************************************************************/
void TASK2(void *pdata)
{
pdata = pdata;
while (1)
{
OSTimeDly(OS_TICKS_PER_SEC);
}
}
/*******************************************************************************************
** Function name: TASK3
** Descriptions :
** Input : 无
** Output : 无
*******************************************************************************************/
void TASK3(void *pdata)
{
pdata = pdata;
while(1)
{
OSTimeDly(OS_TICKS_PER_SEC);
}
}
/*******************************************************************************************
** Function name: TASK4
** Descriptions :
** Input : 无
** Output : 无
*******************************************************************************************/
void TASK4(void *pdata)
{
pdata = pdata;
while (1)
{
OSTimeDly(OS_TICKS_PER_SEC);
}
}
/*******************************************************************************************
** Function name: TASK5
** Descriptions : 系统正常运行指示灯,如果系统正常运行,LDE9会正常闪烁。
** Input : 无
** Output : 无
*******************************************************************************************/
void TASK5(void *pdata)
{
pdata = pdata;
while (1)
{
gpio_clr(LED9);
OSTimeDly(OS_TICKS_PER_SEC/2);
gpio_set(LED9);
OSTimeDly(OS_TICKS_PER_SEC/2);
}
}
/*******************************************************************************************
** End Of File
*******************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -