# include "bsp_init.h"
# include "bsp_seg.h"
# include "timer.h"
# include "bsp_key.h"
# include "bsp_led.h"
#include "bsp_onewire.h"
#include "bsp_ds1302.h"
# include "stdio.h"
//-----------------------------------------------
/* 函数声明 */
//三个主体循环,基本上永远不变
void Key_Proc(void);//按键处理,底层数据变更
void Seg_Proc(void);//显示处理,显示信息生成
void Led_Proc(void);//LED处理,LED状态信息表示
//-----------------------------------------------
/* 全局变量声明 */
//数码管显示专用,基本上永远不变
unsigned char seg_buf[8];//放置字符串转换后的段码到数组
unsigned char seg_string[10];//放置字符串
unsigned char pos = 0;//中断显示专用
//LED显示专用,基本上永远不变
unsigned char ucLed;//记录LED的状态信息
//按键专用,基本上永远不变
unsigned char Key_Value;//读取按键的数值存储变量
unsigned char Key_Down, Key_Old;//读取按键的数值存储变量
//按键和显示函数减速专用,基本永远不变
unsigned int Key_Slow_Down;//按键减速
unsigned int Seg_Slow_Down;//按键减速
//根据代码需求发生变化
unsigned char Running_Setting_Mode = 4;//运行时候的模式,4是正常模式,1-3是时钟设置时分秒,5-7为闹钟时分秒设置
unsigned char Clock_HMS[3] = {23, 59, 50};//时钟内容
unsigned char Alarm_HMS[3] = {00, 00, 00};//闹钟内容
unsigned int Ms_Count = 0;//运行毫秒的记录 0-1000
bit Disp_BlingBling = 0;//数码管闪动专用 0-1
bit Temp_Mode = 0;//是否是温度模式标志
unsigned char LED_Ms_Count = 0;//LED运行毫秒的记录 0-1000
bit Alarm_Flag = 0;//是否进入了闹钟
unsigned char LED_s_Count = 0;//LED闪烁时长
bit Alarm_Flag_Pri = 0;//闹钟功能使能位
//-----------------------------------------------
/* main */
void main()
{
//根据代码需求发生变化
Cls_Peripheral();//关闭外设
Timer1Init();//定时器1初始化,并且使能定时器1中断,1ms进入一次
EA = 1;//打开总中断
Set_Rtc(Clock_HMS);//时钟初始化
while(1)
{
//永远不变
Key_Proc();//按键处理,底层数据变更
Seg_Proc();//显示处理,显示信息生成
Led_Proc();//LED处理,LED状态信息表示
}
}
//-----------------------------------------------
/* Timer1_interrupt routine */
void tm1_isr() interrupt 3
{
//永远不变
if(++Key_Slow_Down == 10) Key_Slow_Down = 0;
if(++Seg_Slow_Down == 500) Seg_Slow_Down = 0;
//根据代码需求变换
Ms_Count++;
if(Ms_Count == 1000)//到一秒钟
{
Ms_Count=0;
if( Alarm_Flag == 1) LED_s_Count++;//LED延时时间
Disp_BlingBling ^= 1;//闪动变量翻滚
}
if(Alarm_Flag == 1)//闹钟状态
{
if(LED_s_Count < 6)//如果没到6s闪烁
{
LED_Ms_Count++;
if(LED_Ms_Count == 200)//到200ms
{
LED_Ms_Count = 0;
ucLed ^= 0x01;//然最后一位翻滚
}
}
else if(LED_s_Count == 6)
{
ucLed = 0;//如果为0,则不显示
LED_s_Count = 0;
Alarm_Flag = 0;
}
}
//永远不变
Seg_Disp(seg_buf, pos);//数码管显示刷新
if( ++pos == 8 ) pos = 0;
Led_Disp(ucLed);//LED显示内容
}
//-----------------------------------------------
/*key_proc */
void Key_Proc(void)//按键处理,底层数据变更
{
//永远不变
if(Key_Slow_Down) return;
Key_Slow_Down = 1;//减速程序
Key_Value = Key_Read_BTN();//读取按键按下的编号
Key_Down = Key_Value & (Key_Old ^ Key_Value);// (0000^0101) = 0101 0101 & 0101 =0101 ,如果按键发生了下降沿的变化,输出结果和本次按键数值相同
// (0101^0101) = 0000 0101&0000 = 0000 如果按键一直保持同样的状态,输出结果为0
Key_Old = Key_Value;//长按的标志
if((Key_Down)&&(Alarm_Flag == 1))//当停止闪动按钮按下去
{
LED_s_Count = 0;
Alarm_Flag = 0;//不让闪动
ucLed = 0;
Alarm_Flag_Pri=1;//关闭闹钟功能
}
else if((Key_Down)&&(Alarm_Flag == 0))//优先级位通过在不闹状态下按任何按键都会解除锁定
{
Alarm_Flag_Pri=0;//打开闹钟功能
}
//根据代码需求发生变化
switch(Key_Down)//如果捕捉到下降沿跳变
{
case 7://时钟3-时、2分、1-秒的设置
if((Running_Setting_Mode==4)|(Running_Setting_Mode<4))
{
Running_Setting_Mode--;
if(Running_Setting_Mode == 0)
{
Running_Setting_Mode = 4;//实现运行模式在4,3,2,1之间的切换
Set_Rtc(Clock_HMS);//时钟重新赋值
}
}
break;
case 6://闹钟5-时、6-分、7-秒的设置
if((Running_Setting_Mode==4)|(Running_Setting_Mode>4))
{
Running_Setting_Mode++;
if(Running_Setting_Mode == 8)
Running_Setting_Mode = 4;//实现运行模式在4,5,6,7之间的切换
}
break;
case 5://设置+
switch(Running_Setting_Mode)
{
case 3://时钟时
Clock_HMS[0]++;
if(Clock_HMS[0] == 24)
Clock_HMS[0] = 23;//钳制
break;
case 2://时钟分
Clock_HMS[1]++;
if(Clock_HMS[1] == 60)
Clock_HMS[1] = 59;//钳制
break;
case 1://时钟秒
Clock_HMS[2]++;
if(Clock_HMS[2] == 60)
Clock_HMS[2] = 59;//钳制
break;
case 5://闹钟时
Alarm_HMS[0]++;
if(Alarm_HMS[0] == 24)
Alarm_HMS[0] = 23;//钳制
break;
case 6://闹钟分
Alarm_HMS[1]++;
if(Alarm_HMS[1] == 60)
Alarm_HMS[1] = 59;//钳制
break;
case 7://闹钟秒
Alarm_HMS[2]++;
if(Alarm_HMS[2] == 60)
Alarm_HMS[2] = 59;//钳制
break;
}
break;
case 4://设置-
switch(Running_Setting_Mode)
{
case 3://时钟时
Clock_HMS[0]--;
if(Clock_HMS[0] == 255)
Clock_HMS[0] = 0;//钳制
break;
case 2://时钟分
Clock_HMS[1]--;
if(Clock_HMS[1] == 255)
Clock_HMS[1] = 0;//钳制
break;
case 1://时钟秒
Clock_HMS[2]--;
if(Clock_HMS[2] == 255)
Clock_HMS[2] = 0;//钳制
break;
case 5://闹钟时
Alarm_HMS[0]--;
if(Alarm_HMS[0] == 255)
Alarm_HMS[0] = 0;//钳制
break;
case 6://闹钟分
Alarm_HMS[1]--;
if(Alarm_HMS[1] == 255)
Alarm_HMS[1] = 0;//钳制
break;
case 7://闹钟秒
Alarm_HMS[2]--;
if(Alarm_HMS[2] == 255)
Alarm_HMS[2] = 0;//钳制
break;
}
break;
}
if(Key_Old == 4)//表示S8长按
Temp_Mode = 1;//表示进入温度模式
else
Temp_Mode = 0;//表示退出温度模式
}
//----------------------------------------------
/*seg_proc */
void Seg_Proc(void)//显示处理,显示信息生成
{
//永远不变
if(Seg_Slow_Down) return;
Seg_Slow_Down = 1;//减速程序
//根据代码需求发生变化
switch(Running_Setting_Mode)
{
case 4://正常时间显示界面
if(Temp_Mode == 0)//时钟模式
{
Read_Rtc(Clock_HMS);//读取时间
sprintf(seg_string, "%02d-%02d-%02d",(unsigned int)Clock_HMS[0],(unsigned int)Clock_HMS[1],(unsigned int)Clock_HMS[2]);//时间显示处理
}
else if(Temp_Mode == 1)//温度模式
{
sprintf(seg_string, " %2dC",(unsigned int)rd_temperature()/16);//温度读取
}
break;
case 1:
case 2:
case 3://S5 时钟界面
sprintf(seg_string, "%02d-%02d-%02d",(unsigned int)Clock_HMS[0],(unsigned int)Clock_HMS[1],(unsigned int)Clock_HMS[2]);//待设置的时间显示处理
break;
case 5:
case 6:
case 7://S6 闹钟界面
sprintf(seg_string, "%02d-%02d-%02d",(unsigned int)Alarm_HMS[0],(unsigned int)Alarm_HMS[1],(unsigned int)Alarm_HMS[2]);//待设置的闹钟显示处理
break;
}
if( Disp_BlingBling==1 )
{
switch(Running_Setting_Mode)
{
case 1://时钟秒
case 7://闹钟秒
seg_string[6] = " ";
seg_string[7] = " ";
break;
case 2://时钟分
case 6://闹钟分
seg_string[3] = " ";
seg_string[4] = " ";
break;
case 3://时钟时
case 5://闹钟时
seg_string[0] = " ";
seg_string[1] = " ";
break;
}
}
//永远不变
Seg_Tran(seg_string, seg_buf);
}
//----------------------------------------------
/*led_proc */
void Led_Proc(void)//显示处理,显示信息生成
{