📄 main.c.bak
字号:
/*
*********************************************************************************************************
XX电子实业有限公司技术部
版权所有(c)2006.12.16--2006.12.18
http://www.XX.cn
********************************************************************************************************
文件 名:main.C
创建 人:许 文
创建日期:2008.05.29
版 本:万年历V01
描 述:
========================================================================================================
修改 人:
修改时间:
版 本:
描 述:
*********************************************************************************************************
*/
#include "config.h"
#define BUZZER 1 << 7 // P0.7控制蜂鸣器,低电平蜂鸣
#define BUZZER_Set() PINSEL0 &= (~(INT32U)(1 << 7)), IO0DIR|=(1<<7),IO0CLR|=(1<<7) // 开蜂鸣器
#define BUZZER_Clr() IO0SET|=(1<<7)
#define TASKKEY_STACK_SIZE 256 /* TaskKey定义用户堆栈长度 */
#define TASKDISP_STACK_SIZE 128 /* TaskDisp定义用户堆栈长度 */
#define TASKSET_STACK_SIZE 128 /* TaskSet定义用户堆栈长度 */
static OS_EVENT *KeyBox;
static OS_EVENT *RtcBox;
OS_STK TASKKEY_STACK[TASKKEY_STACK_SIZE];
OS_STK TASKDISP_STACK[TASKDISP_STACK_SIZE];
OS_STK TASKSET_STACK[TASKSET_STACK_SIZE];
#define KEY1 1 << 16 /* P0.16为KEY1输入脚 */
#define KEY2 1 << 17 /* P0.17为KEY2输入脚 */
#define KEY3 1 << 18 /* P0.18为KEY3输入脚 */
#define KEY4 1 << 19 /* P0.19为KEY3输入脚 */
uint8 const SHOWTABLE[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void TaskKey(void *pdata);
void TaskDisp(void *pdata);
void TaskSet(void *pdata);
/*
*********************************************************************************************************
* Function name: rtcException
* Descriptions: RTC的中断服务函数
* Input parameters: 无
* Output parameters: 无
*********************************************************************************************************
*/
void rtcException(void)
{
static INT32U time[2];
ILR |= 0x01; /* 清除RTC增量中断标志 */
time[0] = CTIME0;
time[1] = CTIME1;
OSMboxPost(RtcBox,(void*)time);
VICVectAddr = 0; /* 通知中断控制器中断结束 */
}
/*
*********************************************************************************************************
* Function name: gpioInit
* Descriptions: GPIO的初始化
* Input parameters: 无
* Output: 无
*********************************************************************************************************
*/
void gpioInit(void)
{
PINSEL0 &= (~(uint32)(1 << 7));
IO0DIR|=(1<<7);
IO0SET|=(1<<7);
}
/*
*******************************************************************************************************
* Function name: rtcInit
* Descriptions: 按照默认值初始化实时时钟.RTC被初始化为时钟源选择Fpclk,秒值增加一次后产生中断.
* Input parameters: time:初始化时间指针
* Output: 无
*******************************************************************************************************
*/
void rtcInit(uint16 *time)
{
PREINT = Fpclk / 32768 - 1; // 设置基准时钟分频器
PREFRAC = Fpclk - (Fpclk / 32768) * 32768;
CCR = 0x00; // 禁止时间计数器
YEAR = time[0]; /* 初始化时间寄存器 */
MONTH = time[1];
DOM = time[2];
DOW = time[3];
HOUR = time[4];
MIN = time[5];
SEC = time[6];
CIIR = 0x01; // 设置秒值的增量产生一次中断
ILR = 0x03; // 清除RTC增量和报警中断标志
CCR = 0x01; // 启动RTC
VICVectAddr0 = (INT32U)rtcException; // 设置中断服务程序地址
VICIntEnable = (1 << 13); // 使能RTC中断
}
/*********************************************************************************************************
** Function name: keyIn
** Descriptions: 查询按键的输入
** Input parameters: 无
** Returned value: 有效键按下时,返回对应的键值,否则返回0;
********************************************************************************************************/
INT32U keyIn(void)
{
INT32U i,uiKey;
uiKey = KEY1;
for (i=1;i<5;i++) {
if ((uiKey&IO0PIN) == 0) {
break;
} else {
uiKey<<=1;
}
}
if (i >=5 ) {
uiKey = 0;
}
return uiKey;
}
/*******************************************************************************************
** Function name: timeDisp
** Descriptions: 将RTC的数据发送到PC机上显示
** Input parameters: uiTimes RTC的CTIME0的值
uiDates RTC的CTIME1的值
** Output parameters: 无
*******************************************************************************************/
void timeDisp(INT32U uiTimes,INT32U uiDates)
{
INT32U uiTimedata;
uiTimedata = (uiDates >> 16) & 0xfff; /* 发送年 */
pcDispChar(0, SHOWTABLE[uiTimedata / 1000]);
uiTimedata = uiTimedata % 1000;
pcDispChar(1, SHOWTABLE[uiTimedata / 100]);
uiTimedata = uiTimedata % 100;
pcDispChar(2, SHOWTABLE[uiTimedata / 10]);
pcDispChar(3, SHOWTABLE[uiTimedata % 10]);
uiTimedata = (uiDates >> 8) & 0x0f; /* 发送月 */
pcDispChar(4, SHOWTABLE[uiTimedata / 10]);
pcDispChar(5, SHOWTABLE[uiTimedata % 10]);
uiTimedata = uiDates & 0x1f; /* 发送日 */
pcDispChar(6, SHOWTABLE[uiTimedata / 10]);
pcDispChar(7, SHOWTABLE[uiTimedata % 10]);
uiTimedata = (uiTimes >> 24) & 0x07; /* 发送星期 */
pcDispChar(8, SHOWTABLE[uiTimedata]);
uiTimedata = (uiTimes >> 16) & 0x1f; /* 发送小时 */
pcDispChar(9, SHOWTABLE[uiTimedata / 10]);
pcDispChar(10, SHOWTABLE[uiTimedata % 10]);
uiTimedata = (uiTimes >> 8) & 0x3f; /* 发送分钟 */
pcDispChar(11, SHOWTABLE[uiTimedata / 10]);
pcDispChar(12, SHOWTABLE[uiTimedata % 10]);
uiTimedata = uiTimes & 0x3f; /* 发送秒钟 */
pcDispChar(13, SHOWTABLE[uiTimedata / 10]);
pcDispChar(14, SHOWTABLE[uiTimedata % 10]);
}
/*******************************************************************************************
** Function name: timeGet
** Descriptions: 根据输入的编号,获得对应编号的数据位的值。
** Input parameters: n PC的万年历窗口中时间数据位对应的编号。
** Output parameters: 无
** Returned value: 输入编号对应的时间数据位的值
*******************************************************************************************/
INT32U timeGet(INT32U n)
{
INT32U uiTimedata,uiTimes,uiDates;
uiTimes = (INT32U)CTIME0; /* 读取完整的时钟寄存器 */
uiDates = (INT32U)CTIME1;
switch(n) {
case 0:
uiTimedata = (uiDates >> 16) & 0xfff; /* 获取年的千位数据 */
uiTimedata = uiTimedata / 1000;
break;
case 1:
uiTimedata = (uiDates >> 16) & 0xfff; /* 获取年的百位数据 */
uiTimedata = uiTimedata % 1000;
uiTimedata = uiTimedata / 100;
break;
case 2: /* 获取年的十位数据 */
uiTimedata = (uiDates >> 16) & 0xfff;
uiTimedata = uiTimedata % 100;
uiTimedata = uiTimedata / 10;
break;
case 3: /* 获取年的个位数据 */
uiTimedata = (uiDates >> 16) & 0xfff;
uiTimedata = uiTimedata % 10;
break;
case 4:
uiTimedata = (uiDates >> 8) & 0x0f; /* 获取月的十位数据 */
uiTimedata = uiTimedata / 10;
break;
case 5:
uiTimedata = (uiDates >> 8) & 0x0f; /* 获取月的个位数据 */
uiTimedata = uiTimedata % 10;
break;
case 6:
uiTimedata = uiDates & 0x1f; /* 获取日的十位数据 */
uiTimedata = uiTimedata / 10;
break;
case 7:
uiTimedata = uiDates & 0x1f; /* 获取日的个位数据 */
uiTimedata = uiTimedata % 10;
break;
case 8:
uiTimedata = (uiTimes >> 24) & 0x07; /* 获取星期数 */
break;
case 9:
uiTimedata = (uiTimes >> 16) & 0x1f; /* 获取小时的十位数据 */
uiTimedata = uiTimedata / 10;
break;
case 10:
uiTimedata = (uiTimes >> 16) & 0x1f; /* 获取小时的个位数据 */
uiTimedata = uiTimedata % 10;
break;
case 11:
uiTimedata = (uiTimes >> 8) & 0x3f; /* 获取分钟的十位数据 */
uiTimedata = uiTimedata / 10;
break;
case 12:
uiTimedata = (uiTimes >> 8) & 0x3f; /* 获取分钟的个位数据 */
uiTimedata = uiTimedata % 10;
break;
case 13:
uiTimedata = uiTimes & 0x3f; /* 获取秒钟的十位数据 */
uiTimedata = uiTimedata / 10;
break;
case 14:
uiTimedata = uiTimes & 0x3f; /* 获取秒钟的个位数据 */
uiTimedata = uiTimedata % 10;
break;
}
return uiTimedata;
}
/*******************************************************************************************
** Function name: timeSet
** Descriptions: 根据输入的编号,设置对应编号的时间数据位的值。
** Input parameters: n PC的万年历窗口中时间数据位对应的编号。
uiTimedata 对应的数据位变化的值,如:+1,-1
** Output parameters: 无
** Returned value: 无
*******************************************************************************************/
void timeSet(INT32U n,INT32S uiTimedata)
{
switch(n) {
case 0: /* 设置年的千位数据 */
YEAR += (INT32S)(uiTimedata*1000);
break;
case 1:
YEAR += (INT32S)(uiTimedata*100);
break;
case 2:
YEAR += (INT32S)(uiTimedata*10);
break;
case 3:
YEAR += uiTimedata;
break;
case 4:
MONTH += (INT32S)(uiTimedata*10); /* 设置月 */
break;
case 5:
if ((MONTH == 12) && (uiTimedata == 1)) {
MONTH = 1;
} else if ((MONTH ==1) && (uiTimedata ==-1)) {
MONTH = 12;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -