时钟可调时间可报时程序

  • 格式:doc
  • 大小:45.00 KB
  • 文档页数:6

下载文档原格式

  / 6
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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)