本帖最后由 MOP 于 2016-10-26 15:43 编辑
嗨,最簡單的方式可參考我的文章//www.icxbk.com/community/forum.php?mod=viewthread&tid=67282&extra=
概念是一樣的,使用到TimeDisplay這個變數翻轉時候觸發一次,即1秒,這觸發是由RTC的ISR來的,只要一個定時器就可完成不中斷時鐘和持續N秒的蜂鳴器鳴叫
所以您要改的話,一樣有關I/O的最好還是宣告成volatile,再來因為您要蜂鳴器鳴叫也是以秒為最小單位(假設),所以一樣ˋ只要一個定時器
volatile uchar num;
您的Code Interrupt中遞增的是num變數
void T0_Time() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
num++;
}
所以只要保留這個Interrupt,要實現您的功能,參考我的文章以後,增加以下
uchar beeper = 0; //global
uchar started=0; //global
#define BEEPER(x) //要控制的GPIO Output Pin,假設0輸出低電位,1輸出高電位
#define ALARM_TIME 3
void alarm(void)
{
if(MIN>0 && val==0) // When booting up, the beeper didn't need to beep.
{
if(!started)
started=1;
}
if(started && val==0)
{
if(!beeper)
beeper=1;
}
if(beeper)
{
if(val說明也可參考我的文章,您只要實現BEEPER函式即可,這裡我用Macro,您可以自己定義哪個腳位跟實現輸出,另外變數名稱最好有意義跟小寫,#define才大寫,培養好的寫程式習慣很重要:)
最後加入您的While loop即可
while(1)
{
SFM();
display3(shi,ge);
display2(f_shi,f_ge);
display1(s_shi,s_ge);
alarm();
}