📄 main.c
字号:
#include <hidef.h> /* for EnableInterrupts macro */
#include "derivative.h" /* include peripheral declarations */
#include "includes.h"
#include "PCF8563.h"//一个未调试完成的实时时钟程序
#include "i2c.h"
#define TASK_STK_SIZE 20
#define SDA PTDD_PTDD2 //74LS164 SAD
#define SCK PTGD_PTGD3 //74LS164 SCK
#define uchar unsigned char
#define uint unsigned int
void Delay_ms(void); //显示扫描函数
void Time_display1(void);//正常显示时间函数
void Time_display2(void);//调试显示时间
void Delay_key(void);//键盘防抖动延时
void key_display(void);//键值显示函数
void Time_config(void);//时间调整
unsigned char key1=0; //键值数组
unsigned char key2=0;
unsigned char key3=0;
unsigned char key4=0;
unsigned char keyn=0;
unsigned char keyn1=0;
unsigned char keyn2=0;
unsigned char keyn3=0;
unsigned char keyn4=0;
unsigned char keyn5=0;
unsigned char keyn6=0;
unsigned char keyn7=0;
unsigned char display_config=0;
unsigned char F=0;
unsigned char FF=1;
const uchar szdm[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0xfe,0xff ,0xfd }; /*共阳数码管0-9和全灭的16进制代码*/
// 0 1 2 3 4 5 6 7 8 9 点 全灭 中间横杠
TIME_T a={0,0,0,0,0,0,0};
TIME_T b={0,0,0,0,0,0,0};
TIME_T * pp;
void data_config (void) //数据交换,用于交换调整过的时间数据和8563时间
{
if(key4==4){
a.ucDay=b.ucDay;
a.ucHour=b.ucHour;
a.ucMin=b.ucMin;
a.ucMonth=b.ucMonth;
a.ucSec=b.ucSec;
a.ucWeek=b.ucWeek;
a.ucYear=b.ucYear;
}
else{
b.ucDay=a.ucDay;
b.ucHour=a.ucHour;
b.ucMin=a.ucMin;
b.ucMonth=a.ucMonth;
b.ucSec=a.ucSec;
b.ucWeek=a.ucWeek;
b.ucYear=a.ucYear;
}
}
unsigned char *buffer_pp;
static OS_STK TASK_STK_SIZE1[TASK_STK_SIZE];
static OS_STK TASK_STK_SIZE2[TASK_STK_SIZE];
static OS_STK TASK_STK_SIZE3[TASK_STK_SIZE*10];
static OS_STK TASK_STK_SIZE4[TASK_STK_SIZE];
char Send_message[]="It My TRSK ID 4.\n\r\0";
/*OS_STK *pstk;
pstk=(OS_STK*)malloc(TASK_STK_SIZE);
if(pstk!=(OS_STK*)0){
Create the task;
} */// 动态产生任务分配堆栈空间,未成功
void TestTask4(void *pdata)
{
pdata=pdata;
for(;;)
{
PTCD_PTCD4=1;
buffer_pp=Send_message;
OSTimeDly(150);
while(*buffer_pp!='\0')
{
while(SCI2S1_TC==0){
};
SCI2D=*buffer_pp;
buffer_pp++;
};
PTCD_PTCD4=0;
}
}
void TestTask3(void *pdata)
{
pdata=pdata;
for(;;)
{
OSTimeDly(100);
//StartClock();
//WriteClock(&a);
key_display();
if(key1==1)
{
Time_config();
if(key4==4)
{
key1=0;
key2=0;
key3=0;
data_config();
WriteClock(&a);
key4=0;
};//清除键值,初始化键值,修改时钟数据
}//时钟为选,顺序为秒,分,时
else
{
if(F==0)ReadClock(&a);//CPU时钟定时器置标记,一秒钟读一次时钟
if(F==0)F=1;
Time_display1();
}
/* __RESET_WATCHDOG(); by default, COP is disabled with device init. When enabling, also reset the watchdog. */
} /* loop forever */
}
void TestTask2(void *pdata)
{
pdata=pdata;
for(;;)
{
OSTimeDly(50);
PTED_PTED2=~PTED_PTED2;
}
}
void TestTask(void *pdata)
{
pdata=pdata;
for(;;)
{
OSTimeDly(20);
PTED_PTED2=~PTED_PTED2;
}
}
void main(void)
{
MCU_init() ;
OSInit();
OSTaskCreate(TestTask, (void*)0, (void*)&TASK_STK_SIZE1[TASK_STK_SIZE], 0);
OSTaskCreate(TestTask2, (void*)0, (void*)&TASK_STK_SIZE2[TASK_STK_SIZE], 1);
OSTaskCreate(TestTask3, (void*)0, (void*)&TASK_STK_SIZE3[TASK_STK_SIZE*5], 2);
OSTaskCreate(TestTask4, (void*)0, (void*)&TASK_STK_SIZE4[TASK_STK_SIZE], 3);
OSStart();
}
void Time_config(void) //按键时间设置
{
switch(keyn)
{
case 1:
if(key2==2)
{
key2=0;
++b.ucSec;
if(b.ucSec>=0b01100000)
{
b.ucSec=0;
}
if((b.ucSec&0b00001111)>0b00001001)
{
b.ucSec=b.ucSec+0b00010000;
b.ucSec=b.ucSec&0b11110000;
}
}
if(key3==3)
{
key3=0;
--b.ucSec;
if(b.ucSec>=0b01100000)
{
b.ucSec=0;
}
if((b.ucSec&0b00001111)>0b00001001)
{
b.ucSec=b.ucSec&0b11110000;
b.ucSec=b.ucSec|0b00001001;
}
};break; //位选择秒
case 2:
if(key2==2){
key2=0;
++b.ucMin;
if(b.ucMin>=0b01100000)
{
b.ucMin=0;
}
if((b.ucMin&0b00001111)>0b00001001)
{
b.ucMin=b.ucMin+0b00010000;
b.ucMin=b.ucMin&0b11110000;
}
}
if(key3==3)
{
key3=0;
--b.ucMin;
if(b.ucMin>=0b01100000)
{
b.ucMin=0b01011001;
}
if((b.ucMin&0b00001111)>0b00001001)
{
b.ucMin=b.ucMin&0b11110000;
b.ucMin=b.ucMin|0b00001001;
}
};break; //位选择分
case 3:
if(key2==2)
{
key2=0;
++b.ucHour;
if(b.ucHour>=0b00100100)
{
b.ucHour=0;
}
if((b.ucHour<=0b00100000)&((b.ucHour&0b00001111)>0b00001001))
{
b.ucHour=b.ucHour+0b00010000;
b.ucHour=b.ucHour&0b11110000;
}
if((b.ucHour>=0b00100000)&((b.ucHour&0b00001111)>0b00000100))
{
b.ucHour=0b00000000;
//b.ucHour=b.ucHour&0b11110000;
}
}
if(key3==3)
{
key3=0;
--b.ucHour;
if(b.ucHour>=0b00100100)
{
b.ucHour=0b00100011;
}
if((b.ucHour>=0b00100000)&((b.ucHour&0b00001111)>0b00000100))
{
b.ucHour=(b.ucHour-0b00010000)&0b11110000;
b.ucHour=b.ucHour|0b00001001;
}
if((b.ucHour<0b00100000)&((b.ucHour&0b00001111)>0b00001001))
{
b.ucHour=b.ucHour&0b11110000;
b.ucHour=b.ucHour|0b00001001;
}
};break; //位选择小时
case 4:
if(key2==2)
{
key2=0;
++b.ucDay;
if(b.ucDay>=0b00110001)
{
b.ucDay=0;
}
if((b.ucDay&0b00001111)>0b00001001)
{
b.ucDay=b.ucDay+0b00010000;
b.ucDay=b.ucDay&0b11110000;
}
}
if(key3==3)
{
key3=0;
--b.ucDay;
if(b.ucDay>=0b00110001)
{
b.ucDay=0;
}
if((b.ucDay&0b00001111)>0b00001001)
{
b.ucDay=b.ucDay&0b11110000;
b.ucDay=b.ucDay|0b00001001;
}
};break; //位选择日期
case 5:
if(key2==2)
{
key2=0;
++b.ucMonth;
if(b.ucMonth>=0b00010011)
{
b.ucMonth=0;
}
if((b.ucMonth<0b00010000)&((b.ucMonth&0b00001111)>0b00001001))
{
b.ucMonth=0b00010000;
}
}
if(key3==3)
{
key3=0;
--b.ucMonth;
if(b.ucMonth>0b00010010)
{
b.ucMonth=0b00010010;
}
if((b.ucMonth<0b00010000)&((b.ucMonth&0b00001111)>0b00001001))
{
b.ucMonth=0b00001001;
}
};break; //位选择月
case 6:
if(key2==2)
{
key2=0;
++b.ucYear;
if(b.ucYear>0b10011001)
{
b.ucYear=0;
}
if((b.ucYear&0b00001111)>0b00001001)
{
b.ucYear=b.ucYear+0b00010000;
b.ucYear=b.ucYear&0b11110000;
}
}
if(key3==3)
{
key3=0;
--b.ucYear;
if(b.ucYear>0b10011001)
{
b.ucYear=0b10011001;
}
if((b.ucYear&0b00001111)>0b00001001)
{
b.ucYear=b.ucYear&0b11110000;
b.ucYear=b.ucYear|0b00001001;
}
};break; //位选择年
case 7:
if(key2==2)
{
key2=0;
++b.ucWeek;
if(b.ucWeek>=7)
{
b.ucWeek=0;
}
}
if(key3==3)
{
key3=0;
--b.ucWeek;
if(b.ucWeek>=7)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -