原创 匠人DIY旋转时钟全程实播(连载22:串行通讯源程序)

2008-3-5 23:00 3033 9 9 分类: MCU/ 嵌入式

相关连接:jhinfo.gif [匠人DIY旋转时钟 系列文章 (连载中…)]



//--------------------------------------------------------
// 项目:
// 模块:串行通讯
// 说明:
// 设计:程序匠人(版权所有,引用者请保留原作者彰?
//--------------------------------------------------------
/*
版本说明:
Serial.c  2008-2-10 15:36



*/
//--------------------------------------------------------



//--------------------------------------------------------
//插入文件包
//--------------------------------------------------------
#include "common.h"
//--------------------------------------------------------



//--------------------------------------------------------
//串行通讯后台处理
//入口: COMM_BUF[] =通讯缓冲区(接收缓冲队列)
// COMM_PUT_PTR =接收数据存放指针
// COMM_GET_PTR    =接收数据读取指针
//--------------------------------------------------------
void comm_cnt(void)
{
 tU08 i ;


 while ( COMM_PUT_PTR != COMM_GET_PTR )  //接收数据存放指针<>接收数据读取指针,说明通讯缓冲区非空
 {
  i = COMM_BUF[ COMM_GET_PTR ] ;  //读取当前缓冲数据
  if ( ++COMM_GET_PTR >= COMM_BUF_NUM ) COMM_GET_PTR=0 ; //接收数据读取指针+1,结果>=通讯缓冲区大小,则清零


  if ( MOTOR_ST_FLAG )    //电机状态标志=1?(0=关闭,1=开启)
  {
   NO_KEY_JSQ = 0 ;     //无按键计数器=0(每1S+1)
 
   //命令解析(根据命令字处理)
   switch( i )     
   {
    case  COM_SET:     //"设置"命令字 
     //显示状态
     if ( SET_EN_FLAG == 0 )
     {
      SET_EN_FLAG = 1 ;   //设置使能标志=1(0=禁止,1=使能)
      SET_MODE = 0 ;    //设置状态=0
      }


     //设置状态
     else
     {
      SET_EN_FLAG = 0 ;   //设置使能标志=0(0=禁止,1=使能)
     }
 
     break;  
 
    case  COM_CH:     //"切换"命令字 
     //显示状态
     if ( SET_EN_FLAG == 0 )
     {
      if ( ++DISP_MODE > 3 ) DISP_MODE = 0 ; //显示状态+1,结果>最大值时,=0
      }
     
     //设置状态
     else
     {
      if ( ++SET_MODE > 5 )   //设置状态+1,结果>最大值时?
      {
       SET_MODE = 0 ;   //设置状态=0
       SET_EN_FLAG = 0 ;  //设置使能标志=0(0=禁止,1=使能)
      }
     }
 
     break;  
 
    case  COM_INC:     //"递增"命令字 
     //显示状态
     if ( SET_EN_FLAG == 0 )
     {
      if ( ++DISP_LINE_ADJ > 179 ) DISP_LINE_ADJ = 0 ; //盘面角度修正值+1,结果>最大值时,=0
      DISP_LINE_ADJ_FLAG = 1 ;    //EEPROM数据更新标志=1  
      }
     
     //设置状态
     else
     {
      //根据设置状态判断
      switch( SET_MODE )     
      {
       case  0:     //设置状态0:时钟"时"  
        if ( ++TIME_H > 23 ) TIME_H = 0 ;  //时钟"时"+1,结果>最大值时,=0
        break;  
       case  1:     //设置状态1:时钟"分"  
        if ( ++TIME_M > 59 ) TIME_M = 0 ;  //时钟"分"+1,结果>最大值时,=0
        TIME_S = 0 ;     //时钟"秒"=0   
        break;  
       case  2:     //设置状态2:闹钟"时"  
        if ( ++TIMER_H > 23 ) TIMER_H = 0 ;  //闹钟"时"+1,结果>最大值时,=0
        TIMER_H_FLAG = 1 ;    //EEPROM数据更新标志=1  
        break;  
       case  3:     //设置状态3:闹钟"分"
        if ( ++TIMER_M > 59 ) TIMER_M = 0 ;  //闹钟"分"+1,结果>最大值时,=0
        TIMER_M_FLAG = 1 ;    //EEPROM数据更新标志=1  
        break;  
         case  4:     //设置状态4:闹铃时间
        if ( ++SP_M > 99 ) SP_M= 0 ;   //闹铃时间设置值+1,结果>最大值时,=0
        SP_M_FLAG = 1 ;     //EEPROM数据更新标志=1  
        break;  
          case  5:     //设置状态5:报时功能
        FUN_ZDBS_FLAG = ! FUN_ZDBS_FLAG;     //整点报时标志取反(0=禁止,1=使能)
        break;  
         default:
         break; 
      }
     }
 
     break;  
 
    case  COM_DEC:     //"递减"命令字 
     //显示状态
     if ( SET_EN_FLAG == 0 )
     {
      if ( --DISP_LINE_ADJ > 179 ) DISP_LINE_ADJ = 179 ; //盘面角度修正值-1,结果为负时,=179
      DISP_LINE_ADJ_FLAG = 1 ;    //EEPROM数据更新标志=1  
      }
     
     //设置状态
     else
     {
      //根据设置状态判断
      switch( SET_MODE )     
      {
       case  0:     //设置状态0:时钟"时"  
        if ( --TIME_H > 23 ) TIME_H = 23 ;  //时钟"时"-1,结果为负时,=最大值
        break;  
       case  1:     //设置状态1:时钟"分"  
        if ( --TIME_M > 59 ) TIME_M = 59 ;  //时钟"分"-1,结果为负时,=最大值
        TIME_S = 0 ;     //时钟"秒"=0   
        break;  
       case  2:     //设置状态2:闹钟"时"  
        if ( --TIMER_H > 23 ) TIMER_H = 23 ;  //闹钟"时"-1,结果为负时,=最大值
        TIMER_H_FLAG = 1 ;    //EEPROM数据更新标志=1  
        break;  
       case  3:     //设置状态3:闹钟"分"
        if ( --TIMER_M > 59 ) TIMER_M = 59 ;  //闹钟"分"-1,结果为负时,=最大值
        TIMER_M_FLAG = 1 ;    //EEPROM数据更新标志=1  
        break;  
         case  4:     //设置状态4:闹铃时间
        if ( --SP_M > 99 ) SP_M= 99 ;   //闹铃时间设置值-1,结果为负时,=最大值
        SP_M_FLAG = 1 ;     //EEPROM数据更新标志=1  
        break;  
          case  5:     //设置状态5:报时功能
        FUN_ZDBS_FLAG = ! FUN_ZDBS_FLAG;     //整点报时标志取反(0=禁止,1=使能)
        break;  
         default:
         break; 
      }
     }


     break;  


      default:
     break; 
   }
  }
 } 
}



//--------------------------------------------------------
//
// THE END
//
// 版权所有:程序匠人(引用者请保留原作者姓名)
//
//--------------------------------------------------------


 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
9
关闭 站长推荐上一条 /3 下一条