?? main.c
字號:
//********************** 主處理 ****************
#include "msp430x14x.h"
#include "main.h"
//2002-11-10 14:31 全面檢查一遍
/**************************************************************************************************************************/
//********************** extern 區(qū)****************extern 區(qū)****************
//********************** extern 區(qū)****************extern 區(qū)****************
//from Mt8889.c
extern void init_8889(void);
//from Dtmf.c
extern void DtmfPhysicsReceive(void);
extern unsigned char g_chDtmfPhysicsReceive_50ms;
extern void DtmfPhysicsSend(void);
extern void BuildDTMF(void);
extern unsigned char g_chBuildDTMFTime_1s;
//from Debug.c
extern void ExternInsertDebugSendBuf(unsigned char *pData, unsigned int intLen);
extern void MainDebugProcess(void);
extern unsigned char g_chMainDebugSendTimeout_1s;
extern unsigned char g_chMainDebugProcessTimeout_1s;
extern unsigned char g_chDebugTail;
extern unsigned int g_int135Ver;
//from commpc.c
extern void QueryReportPC(void);
extern unsigned char g_chMainPushReportTime_1s;
extern unsigned char g_chSendPCBuf_1s;
extern void ReceivePCBuf(void);
extern void SendPCBuf(void);
extern void MainPushReport(void);
extern unsigned char g_chReceivePCBuf_1s;
extern unsigned char g_chMainPushReport_Stat;
//from flash.c
extern void InitInformationRam_PowerOn(void);
//from lcd.c
extern void InitLcd(void);
//from innerComm.c
extern void MainInnerComm(void);
extern unsigned char g_chMainInnerComm_50ms;
extern unsigned char g_chInnerCommSendBuf[MacroInnerCommSendBufMax];
extern void AddCheckSum(unsigned char chLen);
extern unsigned int g_intGP_FixedCurrent[8];
//from Env.c
extern void ProcessTemperatures(void);
extern unsigned char g_chDoorSwitch_50ms;
extern unsigned char g_chDoorOpened_1s;
extern unsigned char g_chDoorClosed_50ms;
extern void ReadDoorID(void);
extern void MainDoor(void);
extern void ProcessSwitch(void);
extern void ProcessAD(void);
extern unsigned char g_chProcessAD_50ms;
//from ds1820drv.c
extern void DS1820_Init(void);
//from lcd.c
extern void LcdDrive(void);
extern unsigned char g_chLcdDrive_50ms;
//from lcdshow.c
extern void MainLcdProcess(void);
extern unsigned char g_chMainLcdProcess_1s;
extern void ProcessKeyStoke(void);
extern unsigned char g_chMainLcdProcess_Stat;
//********************** extern 區(qū)****************extern 區(qū)****************
//********************** extern 區(qū)****************extern 區(qū)****************
///////////////////本模塊函數(shù)聲明//////////////////////////////
void Set_DCO (void);
void SysInit_IO(void);
//用作為 16 個位!BOOLEAN 變量來使用
unsigned int g_intMark;
unsigned int g_intMarkA;
//每 50 ms 的計數(shù)器!
unsigned int intTBCount_50ms;
//時間處理
unsigned char g_chSecond, g_chMinute = Ver_ID4, g_chHour = Ver_ID3, g_chDay = 4, g_chMonth = 9, g_chYear = 3, g_chSecondAdjust;
//unsigned char g_chSecond, g_chMinute, g_chHour, g_chDay, g_chMonth, g_chYear;
// *********調(diào)試版本 Hour:Minute *** ###編譯時間 Year-Month-Day #######################
unsigned char g_chKeyStoke_1s;
/**************************************************************************************************************************/
/**************************************
*功能:主程序
*參數(shù):
*返回:
**************************************/
void main(void)
{
g_intMark = 0;
g_intMarkA = 0;
SysInit_IO();
//調(diào)用外部
init_8889();
InitLcd();
DS1820_Init();
//也可在后的地方開中斷
_EINT();
//用于開機要問 工頻固定數(shù)值的標(biāo)志
g_intGP_FixedCurrent[0] = 9999;
//test
// g_intMark |= CommDebugUart_Mark;
// g_intMark |= RS232DTMFSendPC_Mark;
//g_intMark |= CommBuilded_Mark;
//開機必須要有這個標(biāo)志
g_intMark |= ICanPush_Mark;
//寫上電標(biāo)志
g_intMark |= PowerOn_Mark;
//開機下一次時間!下時間!---在每次更改的時候下!
//g_chMainInnerComm_Stat = 0;
g_chInnerCommSendBuf[1] = 216;
//second minute hour
g_chInnerCommSendBuf[2] = g_chSecond;
g_chInnerCommSendBuf[3] = g_chMinute;
g_chInnerCommSendBuf[4] = g_chHour;
//5 sum
//6 200
AddCheckSum(5);
while (1)
{
//實時運行
if(g_intMarkA & RunLess1Minute_MarkA)
{//運行后 超過一分鐘
if(g_intMarkA & RunBetween12Minute_MarkA)
{//運行后 超過二分鐘
//讓燈 反轉(zhuǎn)
P2OUT ^= Run_LED;
}
else
{//運行后 一分鐘 到 二分鐘之間
//讓燈 亮
P2OUT &= ~Run_LED;
//顯示按鍵有問題!
if(g_intMarkA & KeyStokeGood_MarkA)
{
//表明按紐OK
}
else
{
if((g_intMarkA & KeyStokeMute_MarkA) || (g_intMarkA & KeyStokeAuto_MarkA))
{//表明肯定有一個有問題
g_chMainLcdProcess_Stat = 8;
}
}
}
}
else
{//運行后 不到一分鐘
if(g_intMarkA & KeyStokeGood_MarkA)
{//兩個按紐是否正常
//按自校驗按紐超過 5 秒 g_chKeyStoke_1s
if(P1IN & CHEK)
{//CHEK BIT2 //CHEK----P1.2,自檢按鍵控制端,常態(tài)為高,低有效
//高,沒有動作
g_chKeyStoke_1s = 0;
}
else
{
if(g_chKeyStoke_1s > 5)
{//啟動 自己校驗自己
//----------no--------
}
}
}
else
{//檢查!
if(P6IN & NOspeak)
{//NOspeak BIT7 //P6.7--J2.4---Speak按鍵控制端,低有效
//高,沒有動作
}
else
{
//可能有問題!
g_chKeyStoke_1s = 0;
g_intMarkA |= KeyStokeMute_MarkA;//如果有問題,在這里記錄!
}
if(P1IN & CHEK)
{//CHEK BIT2 //CHEK----P1.2,自檢按鍵控制端,常態(tài)為高,低有效
//高,沒有動作
}
else
{
g_chKeyStoke_1s = 0;
g_intMarkA |= KeyStokeAuto_MarkA;//如果有問題,在這里記錄!
}
if(g_chKeyStoke_1s > 5)
{
//表明按紐OK
g_intMarkA |= KeyStokeGood_MarkA;
//以下太嚴(yán)格,開機后不可以按一下!---改為不如果一分鐘里 不停在按鍵,表示壞
// if((g_intMarkA & KeyStokeMute_MarkA) || (g_intMarkA & KeyStokeAuto_MarkA))
// {//表明肯定有一個有問題
// g_chMainLcdProcess_Stat = 8;
// }
}
}
}
//處理軟 RESET
if(g_intMark & SoftReset_Mark)
{
if(intTBCount_50ms > 20)//借用
{//1 s
WDTCTL = 0;
}
}
DtmfPhysicsReceive();
MainDebugProcess();
ReceivePCBuf();
SendPCBuf();
MainPushReport();
MainInnerComm();
ReadDoorID();
MainDoor();
ProcessSwitch();
LcdDrive();
MainLcdProcess();
ProcessAD();
ProcessKeyStoke();
if(g_int135Ver > 0)
{
if(g_intMark & HaveDTMFModule_Mark)
{//有DTMF模塊
BuildDTMF();
}
else
{//由于無 DTMF模塊,這里保證不使用 DTMF 通信
g_intMark &= ~DTMFPhysicsReceiveWorkToPCBuf_Mark;//保證DTMF不工作
g_intMark &= ~RS232DTMFSendPC_Mark;//保證DTMF不工作
g_intMark &= ~DtmfPhysicsReceive_Mark;//保證DTMF不工作
}
}
//每 50 ms 處理一次
if(g_intMark & Time_50_ms_Mark)
{
g_intMark &= ~Time_50_ms_Mark;
//
g_chMainInnerComm_50ms++;
g_chDoorSwitch_50ms++;
g_chDoorClosed_50ms++;
g_chLcdDrive_50ms++;
g_chProcessAD_50ms++;
g_chDtmfPhysicsReceive_50ms++;
//
DtmfPhysicsSend();
}
//每 300 ms 處理一次
if(g_intMark & Time_300_ms_Mark)
{
g_intMark &= ~Time_300_ms_Mark;
//2。喂狗 要勤快----開啟了看門狗
WDTCTL = WDT_ARST_1000; //使用 ACLK 1 秒 RESET
//
QueryReportPC();
}
//每 1 s 處理一次
if(g_intMark & Time_1_s_Mark)
{
g_intMark &= ~Time_1_s_Mark;
//
g_chMainDebugSendTimeout_1s++;
g_chMainPushReportTime_1s++;
g_chSendPCBuf_1s++;
g_chBuildDTMFTime_1s++;
g_chMainDebugProcessTimeout_1s++;
g_chReceivePCBuf_1s++;
g_chDoorOpened_1s++;
g_chMainLcdProcess_1s++;
g_chKeyStoke_1s++;
//
ProcessTemperatures();
//運行時間段標(biāo)志
if(g_intMarkA & RunLess1Minute_MarkA)
{//運行后 超過一分鐘
//不做任何事情
}
else
{//運行后 不到一分鐘
//每 秒 反轉(zhuǎn)一一次
P2OUT ^= Run_LED;
}
//時間處理
g_chSecondAdjust++;//沒有不要考慮 g_chSecondAdjust 的其他地方 清 0
if(g_chSecondAdjust > 249)//2002-8-11,運行 13 小時后慢1--2 秒
{//由于時間 每 249.5 秒 會快一秒 所以這里每 249秒停止加 1 秒,用來校準(zhǔn)時間
g_chSecondAdjust = 0;
}
else
{
g_chSecond++;
}
if(g_chSecond >= 60)
{
g_chSecond = 0;//(保證0---59)
g_chMinute++;
if(g_chMinute >= 60)
{
g_chMinute = 0;//(保證0---59)
g_chHour++;
if(g_chHour >= 24)
{
g_chHour = 0;//(保證0---23)
g_chDay++;
if(g_chDay >= 32)
{
g_chDay = 1;//(保證1---31)
g_chMonth++;
if(g_chMonth > 13)
{
g_chMonth = 1;//(保證1---12)
g_chYear++;//(不保證)
}
}
}
}
}
}
//每 60 s 處理一次
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -