📄 main.c
字号:
//再对这个变量进行判断
if (gTimer_CSR & TIMER_B_CSR_OCF1) //判断是否为输出比较1的中断
{
TBOC1HR = gTime_Comp >> 8; //重置输出比较寄存器
TBOC1LR = gTime_Comp;
gTime_Comp += TIMER_B_OC1_10MS; //计算下次重置输出比较寄存器的值
gTime_10ms_Count++;
gSCI_Recv_Time++;
gGSM_Power_Time++;
gGSM_AT_Time++;
gGSM_Re_Wait_Time++;
gATZ_Delay_Time++;
gGSM_CLCC_Time++;
g9270_STD_Keep_Time++;
if (g9270_STD_Keep_Time > 200)
g9270_STD_Keep_Time = 3;
if (gTime_10ms_Count > 99)
{
gTime_10ms_Count = 0;
gTime_1s_Count++;
gGSM_CSQ_Time++;
gGSM_CMGL_Time++;
gSend_SMS_Time++;
gNo_DTMF_Time++;
}
return;
}
if (gTimer_CSR & TIMER_B_CSR_TOF) //若有计数器溢出标志
{
TBCLR; //清除该标志
return;
}
/* ******************************
//一个定时器中的两路输出比较中断不能单独使能
//这里必须清除另一路输出比较的中断
****************************** */
if (gTimer_CSR & TIMER_B_CSR_OCF2)//判断是否为输出比较2的中断
{
TBOC2LR; //读低八位清除输出比较2的标志
return;
}
}
/* **********************************************************************
// PortB中断操作
********************************************************************** */
@interrupt void INT_PORTB(void)
{
unsigned char Data_Temp = 0;
if (((PBDR&PB0_9270_STD)!=0) && (g9270_STD_Keep_Time>2))
{
g9270_STD_Keep_Time = 0;
Data_Temp = (PEDR>>4);
if ((Data_Temp>=0x01) && (Data_Temp<=0x09))
{
gDTMF_Record_Value = Data_Temp + 0x30;
gNo_DTMF_Time = 0;
gStatus_Flag_1 |= GF_1_DTMF_EECV;
}
else if (Data_Temp == 0x0A)
{
gDTMF_Record_Value = '0';
gNo_DTMF_Time = 0;
gStatus_Flag_1 |= GF_1_DTMF_EECV;
}
else if (Data_Temp == 0x0B)
{
gDTMF_Record_Value = '*';
gNo_DTMF_Time = 0;
gStatus_Flag_1 |= GF_1_DTMF_EECV;
}
else if (Data_Temp == 0x0C)
{
gDTMF_Record_Value = '#';
gNo_DTMF_Time = 0;
gStatus_Flag_1 |= GF_1_DTMF_EECV;
}
}
gStatus_Flag_1 |= GF_1_API840_FREE;
return;
}
/* **********************************************************************
// 主程序
********************************************************************** */
main()
{
unsigned int i = 0;
/* ******************************
// 端口A的设置
****************************** */
PADDR = 0;
PAOR = 0;
PADDR |= PA4_GSM_ICT;
PAOR |= PA4_GSM_ICT;
PADR |= PA4_GSM_ICT;
/*
PADDR |= PA6_I2C_SDA;
PAOR |= PA6_I2C_SDA;
PADR &=~PA6_I2C_SDA;
PADDR |= PA7_I2C_SCL;
PAOR |= PA7_I2C_SCL;
PADR &=~PA7_I2C_SCL;
*/
PADDR |= PA5_I2C_WP;
PAOR |= PA5_I2C_WP;
PADR |= PA5_I2C_WP; //24C02的数据保护管脚,为低时正常读写操作,为高时保护
/* ******************************
// 端口B的设置
****************************** */
PBDDR = 0;
PBOR = 0;
EICR = 0; //将PORTB中断设置成上升沿中断
EICR |= EICR_IS11 + EICR_IPB; //下降沿均触发
PBDDR &=~PB0_9270_STD; //将PORTB口Bit0设置成输入
PBOR |= PB0_9270_STD; //设置成普通输入模式
PBDDR |= PB1_9270_PWDN;
PBOR |= PB1_9270_PWDN;
PBDR &=~PB1_9270_PWDN;
PBDDR |= PB2_HC164_RST;
PBOR |= PB2_HC164_RST;
PBDR |= PB2_HC164_RST;
PBDDR &=~PB1_API840_BUSY;
PBOR |= PB1_API840_BUSY; //设置成中断模式
PBDDR |= PB4_HC164_DATA;
PBOR |= PB4_HC164_DATA;
PBDR &=~PB4_HC164_DATA;
PBDDR |= PB5_HC164_CLK;
PBOR |= PB5_HC164_CLK;
PBDR &=~PB5_HC164_CLK;
PBDDR |= PB6_API840_CS;
PBOR |= PB6_API840_CS;
PBDR &=~PB6_API840_CS; //如果为高,则片选JB09.11101 0503芯片
//如果为低,则片选JB09204.1 0520芯片
/* ******************************
// 端口C的设置
****************************** */
PCDDR = 0;
PCOR = 0;
PCDDR |= PC7_UNLOCK;
PCOR |= PC7_UNLOCK;
PCDR |= PC7_UNLOCK; //上锁状态
PCDDR |= PC6_LOCK;
PCOR |= PC6_LOCK;
PCDR &=~PC6_LOCK;
PCDDR |= PC5_LAMP; //控制两个方向灯
PCOR |= PC5_LAMP; //高有效
PCDR &=~PC5_LAMP;
PCDDR |= PC4_ALARM; //控制喇叭
PCOR |= PC4_ALARM; //高有效
PCDR &=~PC4_ALARM;
PCDDR |= PC2_BACK_DOOR; //控制尾门
PCOR |= PC2_BACK_DOOR; //高有效
PCDR &=~PC2_BACK_DOOR;
PCDDR |= PC3_LED; //测试架LED
PCOR |= PC3_LED; //高有效
PCDR &=~PC3_LED;
/* ******************************
// 端口D的设置
****************************** */
PDDDR = 0;
PDOR = 0;
PDDDR |= PD0_GSM_POWER;
PDOR |= PD0_GSM_POWER;
PDDR &=~PD0_GSM_POWER;
/* ******************************
// 端口E的设置
****************************** */
PEDDR = 0;
PEOR = 0;
/* ******************************
// 端口F的设置
****************************** */
PFDDR = 0;
PFOR = 0;
PFDDR &=~PF6_ICAP_RF;
PFOR &=~PF6_ICAP_RF;
/* ******************************
// 串口收发寄存器的设置
****************************** */
SCICR2 = 0;
SCICR2 |= SCI_CR2_RIE + SCI_CR2_RE;
SCIETPR = 0; //Disable extended Baud Rate Generator
SCIERPR = 0; //Disable extended Baud Rate Generator
// SCIBRR = (3<<6) | (2<<3) | 2; //仿真选择晶震16M,二分频,串口波特率为9600,
SCIBRR = (3<<6) | (0<<3) | 0; //仿真选择晶震16M,二分频,串口波特率为38400,
//PR = 13,TR = 1,RR = 1
//SCP1:SCP0 1:1
//SCT2:SCT1:SCT0 0:1:1
//SCR2:SCR1:SCR0 0:1:1
/* ******************************
//外部晶震11.0592M,串口波特率为115200,
//则11.0592*1000000/(16*115200) = 6 = 2 * 3
//PR = 3,TR = 2
****************************** */
/* ******************************
// 定时器使用设置
****************************** */
TACSR = 0;
TACR1 = 0;
TACR2 = 0;
TACSR |= TIMER_A_CSR_TIMD; //Disable the Timer
// TACR1 |= TIMER_A_CR1_OCIE; //Enable OC interrupt
TACR2 |= TIMER_A_CR2_CC0; //Prescaler = /2
TACR1 |= TIMER_A_CR1_ICIE; //Input Capture Interrupt Enable.
TACR1 |= TIMER_A_CR1_IEDG1; //A rising edge triggers the capture
TACLR = 0; //Clear the counter
TACSR = 0; //Enable the timer
TBCSR = 0;
TBCR1 = 0;
TBCR2 = 0;
TBCSR |= TIMER_B_CSR_TIMD; //Disable the Timer
TBCR1 |= TIMER_B_CR1_OCIE; //Enable OC interrupt
TBCR2 |= TIMER_B_CR2_CC0; //Prescaler = /2
gTime_Comp = TIMER_B_OC1_10MS - 4; //第一次使能Timer时,计时器从0xFFFC开始计数,
//所以第一次输出比较的值要减4
TBOC1HR = gTime_Comp >> 8;
TBOC1LR = gTime_Comp;
gTime_Comp += TIMER_B_OC1_10MS; //Prepare next time OC value
TBCLR = 0; //Clear the counter
TBCSR = 0; //Enable the timer
/* ******************************
// I2C中断的一些寄存器设置
****************************** */
// I2C_Init();
I2CCR = 0;
I2CCR |= I2C_CR_PE; //Write PE Twice
I2CCR |= I2C_CR_PE; //
I2CCR |= I2C_CR_ACK; //ACK Enable
I2CCCR = 0x23; //R = 4.7K, Standard Speed 100KB/s,V = 5V
_asm("rim"); //开放全局中断
/* ******************************
// 清空缓冲区中的内容
****************************** */
gTime_10ms_Count = 0;
gTime_1s_Count = 0;
for (i=0;i<sizeof(gSCI_Recv);i++)
gSCI_Recv[i] = 0;
gSCI_Recv_Point = 0;
for (i=0;i<sizeof(gG_Buffer);i++)
gG_Buffer[i] = 0;
gRF_Record_Point = 0;
/* ******************************
// 初始化程序时的一些参数设置等
****************************** */
gStatus_Flag_1 = 0;
gStatus_Flag_2 = 0;
gStatus_Flag_3 = 0;
gStatus_Flag_4 = 0;
gCar_Work_Status = CAR_DEF_FREE;
gSend_SMS_Er_Count = 0;
gRF_Command = 0;
gRF_Record_Char1 = 0;
gRF_Record_Char2 = 0;
gRF_Record_Char3 = 0;
gRF_Char_Command1 = 0;
gRF_Char_Command2 = 0;
gRF_Char_Command3 = 0;
Write_GSM_Re_Power_Value();
/* ******************************
// 程序主循环
****************************** */
while (1)
{
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -