?? 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 + -