凌陽16位單片機(jī)之用時(shí)基中斷定時(shí)
當(dāng)作為讀操作的時(shí)候,P_INT_Ctrl主要作為中斷標(biāo)志,因每一位均代表一個(gè)中斷,當(dāng)CPU相應(yīng)某個(gè)中斷的時(shí)候,便將該中斷標(biāo)識(shí)值=置為1
本文引用地址:http://www.ex-cimer.com/article/201611/318709.htm清楚標(biāo)志控制單元P_INT_Clear只具有寫的功能,當(dāng)CPU響應(yīng)中斷后,會(huì)將中斷標(biāo)志為1;當(dāng)進(jìn)入中斷服務(wù)的時(shí)候,會(huì)將中斷標(biāo)志位0,否則CPU將會(huì)總進(jìn)行這個(gè)中斷;
P_INT_Ctr_New與P_INT_Ctrl功能相似。
首先在打開中斷的情況下,有多少Hz一秒鐘就進(jìn)入多少次中斷,
所以要定時(shí)0.5秒鐘的話,只需要有2Hz就可以了 ,沒進(jìn)入一次就是0.5秒,所以就不用在計(jì)算了,
如果要是用更高頻率的話也是可以的,比如說用16Hz的話,那就是8Hz為0.5秒,這樣就可以提前定義一個(gè)變量叫做n,這個(gè)n在中斷內(nèi),當(dāng)n==8才真正的進(jìn)入相應(yīng)的中斷,
#include "SPCE061A.H"
unsigned int g_uioutput = 0x0001,n=0;
void IRQ5(void)__attribute__((ISR));
int main()
{
asm("INT OFF");
*P_IOA_Dir = 0x00ff;
*P_IOA_Attrib = 0x00ff;
*P_IOA_Data = 0x0000;
*P_INT_Ctrl = C_IRQ5_2Hz;
asm("INT IRQ");
while(1)
*P_Watchdog_Clear = 0x0001;
}
void IRQ5(void)
{
if(*P_INT_Ctrl&C_IRQ5_2Hz)
{
if(++n == 4)//兩秒的時(shí)候回正真的進(jìn)入一次中斷,n就作為一個(gè)標(biāo)記
n=0;//設(shè)置n為0;為了下一次重新開始
*P_IOA_Data = g_uioutput;
g_uioutput&=0x0000;
}
*P_INT_Clear = 0x0004;//清楚中斷標(biāo)志位
}
else
{
*P_INT_Clear = 0x0008;//C_IRQ5_2Hz控制的有兩個(gè)頻率如果進(jìn)入的4Hz的頻率的話
}
}
評(píng)論