/************************************************************
本文件主要用于写按键处理 与闹铃处理
************************************************************/
#include "HongWai.h"//主要用于调用红外的函数
#include "Alarm.h"
#include "Delay.h"
#include "control.h"
#include "12864.h"
#include "ds1302.h"
#include "Uart.h"
//g_Flag1看闹铃 g_Flag2 设闹铃
bit g_Alarm_Flag1,g_Alarm_Flag2;
bit g_Uart_Work_Flag;
bit g_Turn_Poem_Flag;
uchar g_Alarm_hour,g_Alarm_min;
uchar g_Set_Alarm_Num; //闹铃设定功能的变量
uchar g_Set_DS1302_Num; //DS1302的工能设置时间
/****************************************************
函数名称: 设置1302的时间
函数功能: 调整DS1302的时间数值
入口参数: 无
出口参数: 无
备 注: 按s1进入设定时间 再次按下其他的按键开始调节
s1设定的项目增加 s2设定的项目减小
s3增加相应的数值 s4减小相应的数值
*****************************************************/
void Set_DS1302()
{
if(s1 == 0) //功能增加位置键
{
DelayMs(15); //消抖
if(s1 == 0)
{
while(!s1); //等待按键释放
Di(); //响
g_Set_DS1302_Num++; //功能键按下次数
if(g_Set_DS1302_Num >= 9) //第八次按下
{
g_Set_DS1302_Num = 0;
g_Alarm_Flag1 = 0;
g_Alarm_Flag2 = 0;
}
if(g_Set_DS1302_Num > 0)
{
Locate_DS1302(); //一直定位
}
}
}
if(s2 == 0) //功能位置返回按键
{
DelayMs(15); //消抖
if(s2 == 0)
{
while(!s2); //等待按键释放
Di(); //响
g_Set_DS1302_Num--; //功能键按下次数
if(g_Set_DS1302_Num <= 0) //清零
{
Write_1302_Date(); //写入 存储数据
g_Set_DS1302_Num = 0;
Initial_12864();
Write_12864_DS1302_Constant();
}
if(g_Set_DS1302_Num > 0)
{
Locate_DS1302(); //一直定位
}
}
}
if(g_Set_DS1302_Num > 0) //否则进行调整
{
if(s3 == 0) //增大键调节
{
DelayMs(5); //消抖
if(s3== 0)
{
Di(); //响
while(!s3); //等待按键释放
Increase_DS1302(); //增大DS1302数值函数
}
}
if(s4 == 0) //减小调节
{
DelayMs(5); //消抖
if(s4== 0)
{
while(!s4); //等待按键释放
Di(); //响
Decrease_DS1302();//减小数值的函数
}
}
}
}
/**************************************************
函数名: Set_A()
函数功能: 设定闹铃的时间
入口参数: 无
出口参数: 无
备 注: s1设定的项目增加 s2设定的项目减小
s3增加相应的数值 s4减小相应的数值
***************************************************/
void Set_A() //设定闹铃的时间
{
if(s1 == 0) //闹铃设定的项目增加
{
DelayMs(15);
if(s1 == 0)
{
Di();
while(!s1);
g_Set_Alarm_Num ++; //闹铃的功能变量加
Initial_12864();
if(g_Set_Alarm_Num >= 3) //退出闹铃设定的功能
{
g_Set_Alarm_Num = 0;
g_Set_DS1302_Num = 0; //让时间走起来
Write_12864_DS1302_Constant();
g_Alarm_Flag2 = 0;
g_Alarm_Flag1 = 0;
}
Locate_A(); //定位改变的闹钟数值
}
}
if(s2 == 0) //闹铃设定的项目减小
{
DelayMs(15);
if(s2 == 0)
{
Di();
while(!s2);
g_Set_Alarm_Num --;
Initial_12864();
if(g_Set_Alarm_Num <= 0) //退出闹铃设置
{
g_Set_Alarm_Num = 0;
g_Set_DS1302_Num = 0; //让时间走起来
Initial_12864();
Write_12864_DS1302_Constant();
g_Alarm_Flag2 = 0;
g_Alarm_Flag1 = 0;
}
Locate_A(); //定位改变的闹钟数值
}
}
if(g_Set_Alarm_Num != 0) //进入闹铃时分秒的增大减小
{
if(s3 == 0) //对闹铃时分秒的数值进行增大
{
DelayMs(15);
if(s3 == 0)
{
Di();
while(!s3);
A_Increase();
}
}
if(s4 == 0) //对闹铃的数值进行减小
{
DelayMs(15);
if(s4 == 0)
{
Di();
while(!s4);
A_Decrease();
}
}
}
}
/***********************************************
函数名: 没有中断处理的标志位扫描
函数功能: 用于没有串口中断的各种各的标志位扫描
与按键扫描 包括闹铃 ,DS1302 ,红外
入口参数: 无
出口参数: 无
备 注: 友情提示在液晶上有显示
按下s1进入 DS1302的时间修订
按下s3进入 闹铃的的查看与修正
按下s4进入 串口中断的处理
***********************************************/
void Without_Uart()
{
static bit Stop_A_Flag = 0; //停止闹铃的标志位
if(g_Alarm_Flag1 == 0 && g_Alarm_Flag2 == 0 && g_HongWai_Work_Flag == 0) //DS1302的有关函数 主要看行走的时间与DS1302的时间修改
{
Set_DS1302(); //设置DS1302时间
if(g_Set_DS1302_Num == 0) //当功能键的数值为零时进行读取DS1302的所有数据
{
Read_All_DS1302_Date();
}
Display_DS1302_Time();
}
if(g_Alarm_Flag1 == 0 && g_Alarm_Flag2 == 0 && g_HongWai_Work_Flag == 0 && g_Set_DS1302_Num == 0)//s3闹铃查看与修正
{
if(s3 == 0)
{
DelayMs(15);
if(s3 == 0)
{
Di();
while(!s3);
g_Alarm_Flag1 = 1;
Initial_12864();
Remind_Whether_Set_Alarm();
}
}
}
if(g_Alarm_Flag1 == 1 && g_Alarm_Flag2 == 0 && g_HongWai_Work_Flag == 0) //判断是否进入闹铃
{
if(s1 == 0) //退出闹铃设定
{
DelayMs(15);
if(s1 == 0)
{
Di();
while(!s1);
g_Alarm_Flag2 = 0;
g_Alarm_Flag1 = 0;
g_Set_DS1302_Num = 0;
Write_12864_DS1302_Constant(); //写12864固定的部分
}
}
if(s2 == 0) //进入闹铃的设定
{
DelayMs(15);
if(s2 == 0)
{
Di();
while(!s2);
g_Alarm_Flag2 = 1;
g_Set_Alarm_Num ++; //开始调节分钟
Locate_A();
}
}
}
if(g_Alarm_Flag2 == 1 && g_HongWai_Work_Flag == 0)//设定闹铃的时间
{
Set_A();
Stop_A_Flag = 0; //设置好后让闹铃继续响
}
if(g_HongWai_Work_Flag == 1)
{
if(g_Turn_Poem_Flag == 0)
{
Turn_Page_Poem();
}
}
if(g_Alarm_hour == g_hour && g_Alarm_min == g_min && Stop_A_Flag == 0
&& g_Alarm_Flag1 == 0 && g_Alarm_Flag2 == 0 && g_Set_DS1302_Num == 0) //进入闹钟报响
{
Di();
Locate_pos (0,0);
Write_String ("闹铃来了 现在是",0,16);
Locate_pos (3,0); //友情提示
Write_String ("按s4退出退出闹铃",0,16);
if(g_sec >= 59)
{
Write_12864_DS1302_Constant();
}
if(s4 == 0) //退出闹铃
{
DelayMs(15);
if(s4 == 0)
{
Di();
while(!s4);
Stop_A_Flag = 1;//闹铃标志位置一 停止闹铃 如果想再次进入闹铃重新设定
Write_12864_DS1302_Constant();
}
}
}
IRR_Work(); //红外工作
}
/**************************************************
函数名: Key_Scan()
函数功能: 各种各样的标志位扫描与按键扫描
入口参数: 无
出口参数: 无
备 注: 主要被主函数调用以便让整个工程工作
主要用于各种各样的按键扫描于标志位扫描
***************************************************/
void Key_Scan()
{
if(g_Uart_Work_Flag == 0) //判断是否进入串口中断
{
if(g_Set_DS1302_Num == 0 && g_Alarm_Flag1 == 0 && g_Alarm_Flag2 == 0)
{
if(s4 == 0)
{
DelayMs(15);
if(s4 == 0)
{
Di();
while(!s4);
g_Uart_Work_Flag = 1;
Initial_Uart (); //初始化串口
Remind_Uart_process(); //提示进行串口处理
}
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………