相关连接: [匠人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
//
// 版权所有:程序匠人(引用者请保留原作者姓名)
//
//--------------------------------------------------------
文章评论(0条评论)
登录后参与讨论