8a8k单片机c语言写闹钟,我的12864超级时钟制作资料 带红外遥控 闹铃 按键 完整源码...

/************************************************************

本文件主要用于写按键处理 与闹铃处理

************************************************************/

#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黑下载附件…………

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值