⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 用单片机实现(载波监听/冲突检测)的功能
💻 C
📖 第 1 页 / 共 5 页
字号:
void SysInit(void)
{
   unsigned int iq0;
   BCSCTL1 &= ~XT2OFF;     				//打开XT2振荡器
   do
   {
      IFG1 &= ~OFIFG;				        // 清除振荡器失效标志
      for(iq0=0xFF; iq0>0; iq0--);    	                // 延时,等待XT2起振
   }
   while((IFG1 & OFIFG) != 0);			        // 判断XT2是否起振
   BCSCTL2 = SELM_2 + SELS;		                //选择MCLK为XT2
} 


//*****************************************************************************
//  设置波特率程序,参数band为可以选择的波特率的编号
//  默认的波特率为119200bps
//
//*****************************************************************************
void SetBaud(int baud)
{
  UCTL0 &= ~SWRST;                              // Release USART
  
  if((baud & 0X10) == 0X10)
  {
    baud = 0X05;                                //9600bps
  }
  else
  {
    baud = 0X04;                                //19200bps
  }
  
  ME1 &= ~(UTXE0 + URXE0);                      // Disable USART operation
  ME1 |= UTXE0 + URXE0;                         // Re-enable USART operation
  IE1 |= URXIE0;    

  UBR00  = BaudRate[baud][0];                   // Set configuration for
  UBR10  = BaudRate[baud][1];                   // new baud rate
  UMCTL0 = BaudRate[baud][2];

  RXBUF0;                                       // Empty RX buffer and clear flags
}



#pragma vector = PORT1_VECTOR 
__interrupt void GetKeyCode(void)
{
     _DINT();
     //Delay10ms(2); 
     if((ConflictFlag & LINKSENDFLG) == LINKSENDFLG)            //通信过程不允许按键
     {
       _EINT();
       P1IFG = 0X00;
       return;
     }
     if(((P1IFG & P1IFG_6) == P1IFG_6)
        ||((P1IFG & P1IFG_7) == P1IFG_7)
        ||((P1IFG & P1IFG_5) == P1IFG_5))
     {
        count = 0;
        for(i =50; i>1; i--)
        {
           if(((P1IFG & P1IFG_6) == P1IFG_6)
             ||((P1IFG & P1IFG_7) == P1IFG_7)
             ||((P1IFG & P1IFG_5) == P1IFG_5))
           {
              count++;
              if(count >= 30)
              {
                break;
              }
           }
           else 
           {
             count =0;
             break;
           }
       }
     }
     
     if(count >= 30)                                  //确认有按键被按下
     {
       if((P1IFG & P1IFG_6) == P1IFG_6)              //Start
        {
          if((P1IFG & P1IFG_6) == P1IFG_6)
          {
            // P3OUT    &= ~P3OUT_1;                   //解除异常灯
            Flag     &= ~SwitchOn;                    //异常开关关闭
            Flag     &= ~SwitchOff;                    //异常开关解除
          }
        }
     
        if((P1IFG & P1IFG_7) == P1IFG_7)                 //解除异常灯
        {
           if((Flag & SwitchOn) == SwitchOn)
             ConflictFlag |= NEEDCOMM;                         //有通信需求
           else if((Flag & SwitchOff) == SwitchOff)
             ConflictFlag &= ~NEEDCOMM;                        //无通信需求
           Flag     |= SwitchOff;                             //解除开关打开
           Flag     &= ~SwitchOn;                           
        }
     
        if((P1IFG & P1IFG_5) == P1IFG_5)
        {
          if((Flag & SwitchOff) == SwitchOff)
            ConflictFlag  |= NEEDCOMM;                        //有通信需求
          else if((Flag & SwitchOn) == SwitchOn)
            ConflictFlag  &= ~NEEDCOMM;                      //无通信需求
          Flag |= SwitchOn;                                  //异常开关打开
          Flag &= ~SwitchOff;
        }
     }
     P1IFG = 0X00;                                     //P1口标志清零
     _EINT();
  /*_DINT();                                                          //关闭中断
  if((P1IFG & P1IFG_4) == P1IFG_4)                                  //中断触发状态位
  {
    KeyTemp = P1IN & 0X0F;                                          //获取按键编码
    _NOP();                                                         //延迟处理
    _NOP();
    _NOP();
    _NOP();
    KeyTemp = P1IN & 0X0F;                                          //再次获取按键信息
    if((P1IN & 0X0F) == KeyTemp)
    {
      Key  =  KeyTemp;                                              //如果按键和上次的按键相同,确定按键
    }
  

  
  if(((Key == 0X0C) || (Key == 0X08) || (Key == 0X01) 
      || (Key == 0X0A) || (Key == 0X06) || (Key == 0X00)
      || (Key == 0X0B)) 
      && ((Flag & StartFlg) == StartFlg)
      && ((DisplayFlg & ErrFlg) !=ErrFlg))                          //0键和1.2键被按下
  {
     if(Key == 0X0C)                                                 //工数设定(0键)
     {
       Flag |= ResetFlg;                                              //设定状态
       Flag &= ~LCJ;
       Flag &= ~RUNFlg;
       
       if((DisplayFlg & ChangeWorkFlg) !=ChangeWorkFlg)
         DisplayFlg = DShrinkFlg;                                      //闪烁状态
       else 
       {
         DisplayFlg = DShrinkFlg;
         DisplayFlg |= ChangeWorkFlg;
       }
       DisplayFlg |= NumSetFlg;                                      //工数设
       ConvertData(Number);
     }
     else  if(Key == 0X08)                                           //计划设定 (1键)
     {
       Flag |= ResetFlg;                                    //设置状态
       Flag &= ~LCJ;
       Flag &= ~RUNFlg;
       if((DisplayFlg & ChangeWorkFlg) !=ChangeWorkFlg)
         DisplayFlg = DShrinkFlg;                                      //闪烁状态
       else 
       {
         DisplayFlg = DShrinkFlg;
         DisplayFlg |= ChangeWorkFlg;
       }
       DisplayFlg |= PlanSetFlg;                           //计划设定
       ConvertData(Plan);       
     }
     else if(Key == 0X01)                                  //按键2 时钟设定
     {
       Flag |= ResetFlg;                                    //设置状态
       Flag &= ~LCJ;
       Flag &= ~RUNFlg;
       if((DisplayFlg & ChangeWorkFlg) !=ChangeWorkFlg)
         DisplayFlg = DShrinkFlg;                                      //闪烁状态
       else 
       {
         DisplayFlg = DShrinkFlg;
         DisplayFlg |= ChangeWorkFlg;
       }
       DisplayFlg |= ClockSetFlg;                          //计划设定
       temp = Hour*100+Min;
       ConvertData(temp);
     }
     else if(Key == 0X0A)                                  //按键3 本机地址设定  
     {
       Flag |= ResetFlg;                                    //设置状态
       Flag &= ~LCJ;
       Flag &= ~RUNFlg;
      if((DisplayFlg & ChangeWorkFlg) !=ChangeWorkFlg)
         DisplayFlg = DShrinkFlg;                                      //闪烁状态
       else 
       {
         DisplayFlg = DShrinkFlg;
         DisplayFlg |= ChangeWorkFlg;
       }
       DisplayFlg |= AddressSetFlg;                        //计划设定
       ConvertData(SelfAddress);       
     }
     else if(Key == 0X06)                                 //第一班时间设定
     {
        
        Flag |= ResetFlg;                                 //设置状态
        Flag &= ~LCJ;                                     //非启动状态
        Flag &= ~RUNFlg;                                  //非运状态行
        if((DisplayFlg & ChangeWorkFlg) !=ChangeWorkFlg)
          DisplayFlg = DShrinkFlg;                                      //闪烁状态
        else 
        {
          DisplayFlg = DShrinkFlg;
          DisplayFlg |= ChangeWorkFlg;
        }
        if((TimeSec1[0][0] <= 2359) && (ScaleClock != -1))
        {
           DisplayFlg |= TimeIndexFlg;                           //时间段检索标志
           DisplayFlg |= CheckTimeFlg;                           //时间段索引状态
           DisplayFlg  &= ~DShrSetFlg;                           //第二行非闪烁状态
           DisplayFlg  |= DShrinkFlg;                            //第一行闪烁状态
           DisplayFlg |= TimeFirstFlg;                           //时间段索引第一次标志
        }
        else 
        {
           DisplayFlg &= ~CheckTimeFlg;                      //非时间段检查确认状态
           DisplayFlg &= ~TimeFirstFlg;
           DisplayFlg &= ~TimeIndexFlg;
        }
        DisplayFlg |= TimeSection1SetFlg;                 //时间段1设置状态
        DisplayFlg &= ~TimeSection2SetFlg;                //非时间段2设置状态
        TimeSectionIndex =0;                              //时间段设置的索引
        Index =0;                                         //时间段查询的索引
        SearchIndex = 0;                                  //时间段检索的索引
        Counter = 0;                                      //记数
        ConvertCode =0;                                   //当前设定值
     }
     else if(Key == 0X00)                                 //第二班时间设定
     {
        Flag |= ResetFlg;                                 //设置状态
        Flag &= ~LCJ;                                     //非启动状态
        Flag &= ~RUNFlg;                                  //非运行状态
        if((DisplayFlg & ChangeWorkFlg) !=ChangeWorkFlg)
          DisplayFlg = DShrinkFlg;                                      //闪烁状态
        else 
        {
          DisplayFlg = DShrinkFlg;
          DisplayFlg |= ChangeWorkFlg;
        }
        
        if((TimeSec2[0][0] <= 2359) && (ScaleClock != -1))
        {
           DisplayFlg |= TimeIndexFlg;                           //时间段检索标志
           DisplayFlg |= CheckTimeFlg;                           //时间段索引状态
           DisplayFlg  &= ~DShrSetFlg;                           //第二行非闪烁状态
           DisplayFlg |= DShrinkFlg;                            //第一行闪烁状态
           DisplayFlg |= TimeFirstFlg;                           //时间段索引第一次标志
        }
        else 
        {
           DisplayFlg &= ~CheckTimeFlg;                      //非时间段检查确认状态
           DisplayFlg &= ~TimeFirstFlg;
           DisplayFlg &= ~TimeIndexFlg;
        }
        
        DisplayFlg |= TimeSection2SetFlg;                 //时间段2的设定状态
        DisplayFlg &= ~TimeSection1SetFlg;                //非时间段1的设定状态
        TimeSectionIndex =0;
        Index =0;
        SearchIndex = 0;
        Counter = 0;
        ConvertCode =0;
     } 
      TimerCount =0;                                      //时钟定时量
      DisplayFlg &= ~FirstFlg;                            //非第一次标志状态
      DisplayFlg &= ~StartShrinkFlg;                      //非启动闪烁状态、
      Flag &= ~StartFlg;                                  //非设定状态
    }
 
  else if((Flag & ResetFlg) == ResetFlg)                  //在设定状态下,进行数据输入
  {
    if((Key == 0X0B))                                     //按键CLR清除设定数据
     {
       if(((DisplayFlg & TimeSection1SetFlg) == TimeSection1SetFlg))
       {
         for(Counter =0; Counter<25; Counter++)
         {
           if(Counter<9)
           {
             TimeSec2[Counter][0] =8888;                  //时间段1的清零操作
             TimeSec2[Counter][1] =8888;
           }
           TimeSec1[Counter][0] = 8888;
           TimeSec1[Counter][1] = 8888;
           ScaleClock = -1;
           Key = 0X0E ;                                  //进入取消操作处理 
         }
       }
       else if((DisplayFlg & TimeSection2SetFlg) == TimeSection2SetFlg)
       {
         for(Counter =0; Counter<9; Counter++)
         {
           TimeSec2[Counter][0] = 8888;                 //时间段2的清零操作

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -