以下这个程序是基于EasyLPC2200系列的实时时钟实验,我想实现的功能是:先计数,到12:00:00后报警。但现在的问题是:先进行计数了,到12:00:00后也报警了,但是报警后,计数却中止了,没有继续计数。哪位大虾帮我解决下啊,多谢。。。。。 注:关键在于void __irq IRQ_RTC(void)这个中断服务子程序中感觉有问题,其它程序都是正确的。。。
/*功能:运行RTC进行计时,把秒值输出到LED1~LED8显示 同时定时12:00:00报警功能*/
#include "config.h"
#define SPI_CS 0x00000100 #define SPI_DATA 0x00000040 #define SPI_CLK 0x00000010 #define SPI_IOCON 0x00000150
#define BEEPCON 0x00000080 //p0.7引脚控制蜂鸣器,低电平蜂鸣
void DelayNs(uint32 dly) { uint32 i; for(;dly>0;dly--) for(i=0;i<5000;i++); }
void HC595_SendDat(uint8 dat) { uint8 i; IO0CLR=SPI_CS; for(i=0;i<8;i++) { IO0CLR=SPI_CLK; if((dat&0x80)!=0) IO0SET=SPI_DATA; else IO0CLR=SPI_DATA; dat<<=1; IO0SET=SPI_CLK; } IO0SET=SPI_CS; //SPI_CS=1,输出显示数据 }
void StartAlarm(void) { IO0DIR=BEEPCON; IO0SET=BEEPCON; if((IO0SET&BEEPCON)==0) IO0SET=BEEPCON; else { IO0CLR=BEEPCON; //开始蜂鸣 DelayNs(1); IO0SET=BEEPCON; //停止蜂鸣 }
}
void __irq IRQ_RTC(void) { if(1==(ILR&0x01)) { ILR=0x01; HC595_SendDat(~SEC); } if(2==(ILR&0x02)) { ILR=0x02; StartAlarm(); //if(ILR==3) // HC595_SendDat(~SEC); } ILR=0x03; VICVectAddr=0x00; }
void RTCIni(void) { PREINT=Fpclk/32768-1; PREFRAC=Fpclk-(PREINT+1)*32768; YEAR=2004; MONTH=2; DOM=19; HOUR=11; MIN=59; SEC=50;
ILR=0x03; //清除RTC中断标志 ALHOUR=12; //设置小时比较值 ALMIN=0; //设置分比较值 ALSEC=2; //设置秒比较值 AMR=0xf8; //设置报警屏蔽寄存器,只允许时分秒比较
CIIR=0x01; CCR=0x01; VICIntSelect=0x00000000; VICVectCntl0=0x2D; VICVectAddr0=(uint32)IRQ_RTC; VICIntEnable=0x00002000; //使能RTC中断 }
int main(void) {
PINSEL0=0x00000005; //设置连接到UART0其他为通用I/O口 PINSEL1=0x00000000; IO0DIR=SPI_IOCON; //设置LED控制口为输出其他I/O口为输入 RTCIni(); //初始化RTC while(1); return(0); } |