?? main.c
字號:
#include "I2C.h"
#include "Led.h"
#define N 624
int nInputCount;
int nIn_Flag;
int nTimeCount;
int nWrite_Flag;
unsigned char seg[]={0x3f,0x06,0x5b,0x4f, /* 0 1 2 3*/
0x66,0x6d,0x7d,0x07, /* 4 5 6 7 */
0x7f,0x6f,0x77,0x7c, /* 8 9 A B */
0x39,0x5e,0x79,0x71 /* C D E F */
};
void Init_TimerB(void);
void main(void)
{
unsigned char nValue;
char nTemp0;
char nTemp1;
char nTemp2;
char nTemp3;
char nTemp4;
char nTemp5;
int nSpeed;
int nSpeed1;
int nSpeed2;
int nSpeed3;
// 關閉看門狗
WDTCTL = WDTPW + WDTHOLD;
//關閉中斷
_DINT();
//初始化時鐘
Init_CLK();
//端口初始化
Init_Port();
I2C_Initial();
nInputCount = 0;
nIn_Flag = 0;
nTimeCount = 0;
nWrite_Flag = 0;
nTemp0 = 0;
nTemp1 = 0;
nTemp2 = 0;
nTemp3 = 0;
nTemp4 = 0;
nTemp5 = 0;
//打開中斷
_EINT();
//讀出初始的里程數
ReadRandom(0,&nTemp0);
if(nTemp0 == 0xff) nTemp0 = 0;
ReadRandom(1,&nTemp1);
if(nTemp1 == 0xff) nTemp1 = 0;
ReadRandom(2,&nTemp2);
if(nTemp2 == 0xff) nTemp2 = 0;
ReadRandom(3,&nTemp3);
if(nTemp3 == 0xff) nTemp3 = 0;
ReadRandom(4,&nTemp4);
if(nTemp4 == 0xff) nTemp4 = 0;
ReadRandom(5,&nTemp5);
if(nTemp5 == 0xff) nTemp5 = 0;
//顯示初始里程數據
//清除鎖存信號
STCLK_Lo();
DataOut(seg[nTemp5]);
DataOut(seg[nTemp4]);
DataOut(seg[nTemp3]);
DataOut(seg[nTemp2]);
DataOut(seg[nTemp1]);
DataOut(seg[nTemp0]);
//給鎖存信號,顯示上面的6位數據
STCLK_Hi();
for(;;)
{
if(nIn_Flag == 1)
{
nIn_Flag = 0;
//等待時間計數器設置完
while(1)
{
if(nWrite_Flag == 0)
{
break;
}
}
//計算速度
nSpeed = (int)(1 * 3600 / nTimeCount);
nTimeCount = 0;
nSpeed3 = (int)(nSpeed / 100);
nSpeed2 = (int)((nSpeed - 100 * nSpeed3) / 10);
nSpeed1 = nSpeed - 100 * nSpeed3 - 10 * nSpeed2;
//顯示速度
//清除鎖存信號
STCLK_Lo1();
DataOut1(seg[nSpeed3]);
DataOut1(seg[nSpeed2]);
DataOut1(seg[nSpeed1]);
//給鎖存信號,顯示上面的3位數據
STCLK_Hi1();
//處理里程參數
nTemp0 += 1;
if(nTemp0 >= 10)
{
nTemp0 = 0;
nTemp1 += 1;
if(nTemp1 >= 10)
{
nTemp1 = 0;
nTemp2 += 1;
if(nTemp2 >= 10)
{
nTemp2 = 0;
nTemp3 += 1;
if(nTemp3 >= 10)
{
nTemp3 = 0;
nTemp4 += 1;
if(nTemp4 >= 10)
{
nTemp4 = 0;
nTemp5 += 1;
if(nTemp5 >= 10)
{
nTemp0 = 0;
nTemp1 = 0;
nTemp2 = 0;
nTemp3 = 0;
nTemp4 = 0;
nTemp5 = 0;
}//if(nTemp5 >= 10)
}//if(nTemp4 >= 10)
}//if(nTemp3 >= 10)
}//if(nTemp2 >= 10)
}//if(nTemp1 >= 10)
}//if(nTemp0 >= 10)
//顯示里程數據
//清除鎖存信號
STCLK_Lo();
DataOut(seg[nTemp5]);
DataOut(seg[nTemp4]);
DataOut(seg[nTemp3]);
DataOut(seg[nTemp2]);
DataOut(seg[nTemp1]);
DataOut(seg[nTemp0]);
//給鎖存信號,顯示上面的6位數據
STCLK_Hi();
//將里程數據寫入EEPROM
WriteSingleByte(0,nTemp0);
WriteSingleByte(1,nTemp1);
WriteSingleByte(2,nTemp2);
WriteSingleByte(3,nTemp3);
WriteSingleByte(4,nTemp4);
WriteSingleByte(5,nTemp5);
}
}
return;
}
void Init_TimerB(void)
{
// 選擇ACLK,清除TAR
TBCTL = TBSSEL0 + TBCLR;
// TBCCR0 中斷允許
TBCCTL0 = CCIE;
// 時間間隔為 1 s
TBCCR0 = 32768;
// 增記數模式
TBCTL |= MC0;
return;
}
///////////////////////////////////////
// 處理來自端口 P2.0 的中斷
interrupt [PORT1_VECTOR] void INPUT_ISR(void)
{
if(P2IFG & BIT0)
{
//增加脈沖計數器
nInputCount += 1;
if(nInputCount >= 8 * N)
{
//行使到一公里
nInputCount = 0;
//設置標志
nIn_Flag = 1;
}
// 清除中斷標志位
P2IFG &= ~(BIT0);
}
}
//定時器B的中斷處理
interrupt [TIMERB0_VECTOR] void TimerB_ISR(void)
{
//設置寫標志
nWrite_Flag = 1;
//秒記數器加1
nTimeCount += 1;
//解除寫標志
nWrite_Flag = 0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -