|
12864时钟资料包:
单片机源程序如下:
- /*********************************************************
- 项目名称: 万年历的制作
- 项目目的: 通过制作万年历熟悉并掌握51系列的单片机
- 项目制作时间: 10月12日到10月25日
- 项目制作人: 柳振
- 项目实现功能:1,通过 12864显示DS1302的当前时间
- 2,可以通过按键调节DS1302的时间并保存调节的时间
- 到芯片里面去
- 3,调节DS1302时间是屏幕的时间时有友情提示
- 4,实现闹钟功能并且能设定闹钟,设定闹钟时屏幕上有
- 友情提示
- 5,设定的闹钟时间能在掉电的时候储存当再次开启时
- 闹钟的时间仍然是上次的闹钟时间
- 按s4闹铃停止
- 6,红外按下 1 键并且在走动时间时切换屏幕 再按一下时
- 返回走动时间的界面 或者按s2键返回原来的界面
- 7,按下 s4键之后单片机进入串口通讯 并调整 DS1302
- 的时分秒的时间 通讯完之后单片机自动返回原来的界面
- 在通讯时仍然可以走动时间并每隔5 s把时间发送费电脑
- 通过按s4键退出
- **********************************************************/
- #include "Initial.h" //主要用于初始化
- #include "Alarm.h" //主要用于按键扫描于红外扫描
- void main(void) //主函数
- {
- Initial(); //初始化
-
- while(1) //按键扫描主要在alarm.c文件里面
- {
- Key_Scan();
- }
- }
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
alarm文件:
- /************************************************************
- 本文件主要用于写按键处理 与闹铃处理
- ************************************************************/
- #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黑下载附件…………
复制代码
所有资料51hei提供下载地址:
http://www.51hei.com/bbs/dpj-86188-1.html
|
|