时钟可调时间可报时程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/////////////////////////////////////////////////////////
// 工程名称:可调时报时电子钟
// 使用描述:
// K1 按一次进入时间调整模块调完后,再按一次恢复时间
// K2 非时间调整模式下,按键报时时间调整模块下,按键选择调整秒分时
// K3 时间调整模块下,时间值增加
// K4 时间调整模块下,时间值减小
// 硬件连接:IOA0~IOA7接SEG IOA8~IOA15接1*8KEY
// IOB0~IOB7接DIG 2*4KEY.D_dp接高电平
// 维护记录:2012-8-15 增加时间调整功能,增加报时功能
//
///////////////////////////////////////////////////////////
#include "spce061a.h"
#include "Sound.h"
#include "Clock_Speech.h"
//定义各种宏
#define P_IOA_Data (volatile unsigned int *)0x7000
#define P_IOA_Buffer (volatile unsigned int *)0x7001
#define P_IOA_Dir (volatile unsigned int *)0x7002
#define P_IOA_Attrib (volatile unsigned int *)0x7003
#define P_IOB_Data (volatile unsigned int *)0x7005
#define P_IOB_Buffer (volatile unsigned int *)0x7006
#define P_IOB_Dir (volatile unsigned int *)0x7007
#define P_IOB_Attrib (volatile unsigned int *)0x7008
#define P_Watchdog_Clear (volatile unsigned int *)0x7012
#define P_INT_Ctrl (volatile unsigned int *)0x7010
#define P_INT_Clear (volatile unsigned int *)0x7011
#define uint unsigned int
#define KEY_ALL 0xff00
int DispTbl[10] = { 0x003F,0x0006,0x005B,0x004F,0x0066,
0x006D,0x007D,0x0007,0x007F,0x006F};
uint sec=0,min=0,hour=0;
uint Start_End_Flag=0;
uint Adjust_Wei=4;
uint flag=1;
uint Sleep_flag=1;
volatile uint Count=0;
//中断服务程序
void IRQ5(void) __attribute__ ((ISR));
void IRQ5(void)
{
Count++;
if(Count==2) //处理时分秒的进位
{
Count=0;
sec++;
if(sec==60)
{
sec=0;
min++;
if(min==60)
{
min=0;
hour++;
if(hour==24)
hour=0;
}
}
}
if(flag==0)
flag=1;
else
flag=0;
*P_INT_Clear=0x0004;
}
//数码管显示延时
void DelayShort()
{
unsigned c;
for(c=0;c<0xB5;c++)
*P_Watchdog_Clear = 0x0001;
}
//在数码管显示数值
void Display(uint hour,uint min,uint sec)
{
if(flag==1)
*P_IOB_Data=0x0080;
else
*P_IOB_Data=0x0000;
DelayShort();
*P_IOB_Data=0x0020;
*P_IOA_Data=DispTbl[sec%10];
DelayShort();
*P_IOA_Data=0x0000;
*P_IOB_Data=0x0010;
*P_IOA_Data=DispTbl[sec/10];
DelayShort();
*P_IOB_Data=0x0008;
*P_IOA_Data=DispTbl[min%10];
DelayShort();
*P_IOB_Data=0x0004;
*P_IOA_Data=DispTbl[min/10];
DelayShort();
*P_IOB_Data=0x0002;
*P_IOA_Data=DispTbl[hour%10];
DelayShort();
*P_IOB_Data=0x0001;
*P_IOA_Data=DispTbl[hour/10];
DelayShort();
}
//键盘扫描是否有键按下
uint Key_scan()
{
uint Keystatic=0;
*P_IOA_Dir=0x00ff;
*P_IOA_Attrib =0x00ff;
*P_IOA_Buffer|=0xff00;
if((*P_IOA_Data & KEY_ALL)^KEY_ALL)
{
DelayShort(); //消抖
DelayShort();
if((*P_IOA_Data & KEY_ALL)^KEY_ALL)
{
Keystatic=(*P_IOA_Data&KEY_ALL)^KEY_ALL;
while((*P_IOA_Data & KEY_ALL)^KEY_ALL)