?? eint01.c
字號:
/****************************************************************************
* File:EINT01.C
* 功能:使能外部中斷0和外部中斷1,當外部中斷0有效時,控制LED1取反;
* 當外部中斷1有效時,控制取反LED2。
* 說明:將跳線器JP8_LED1、JP8_LED2短接。
****************************************************************************/
#include "config.h"
#define LED1CON 0x00000400 /* P0.10引腳控制LED1,低電平點亮 */
#define LED2CON 0x00000800 /* P0.11引腳控制LED2,低電平點亮 */
#define LED3CON 0x00001000 /* P0.13引腳控制LED4,低電平點亮*/
#define LED4CON 0x00002000 /* P0.13引腳控制LED4,低電平點亮*/
#define SPI_CS 0x00000100 /* P0.8 */
#define SPI_DATA 0x00000040 /* P0.6 */
#define SPI_CLK 0x00000010 /* P0.4 */
#define BEEP 0x00000080 /* P0.7為蜂鳴器控制 */
#define SPI_IOCON 0x000001D0 /* SPI接口的I/O設置字,蜂鳴器設置 */
#define KEY1 0x00004000 /* P0.14引腳連接KEY1 */
#define KEY2 0x00008000 /* P0.14引腳連接KEY1 */
#define KEY3 0x00010000 /* P0.14引腳連接KEY1 */
#define KEY4 0x00400000 /* P0.14引腳連接KEY1 */
#define KEY5 0x00800000 /* P0.14引腳連接KEY1 */
#define KEY6 0x01000000 /* P0.14引腳連接KEY1 */
int second=0;
int minute=0;
int hour=0;
int RunFlag=1;
int Key=6;
int Keyflag=0;
/****************************************************************************
* 名稱:IRQ_Eint0()
* 功能:外部中斷EINT0服務函數,取反LED1。
* 入口參數:無
* 出口參數:無
****************************************************************************/
void __irq IRQ_Eint0(void)
{ uint32 i;
i = VICIRQStatus; // 讀出VICIRQStatus的值
for(i=0; i<100; i++);
if( (IOPIN&KEY3)==0 )
Keyflag=1;
// if(Key==7)Key=3;
while( (EXTINT&0x01)!=0 ) // 等待外部中斷信號恢復為高電平
{ EXTINT |= 0x01; // 清除EINT0中斷標志
}
VICVectAddr = 0x00;
}
/****************************************************************************
* 名稱:IRQ_Eint1()
* 功能:外部中斷EINT1服務函數,Key1輸入
* 入口參數:無
* 出口參數:無
****************************************************************************/
void __irq IRQ_Eint1(void)
{ uint32 i;
i = VICIRQStatus; // 讀出VICIRQStatus的值
if(RunFlag == 1)
{
T0TCR &= 0x00;
RunFlag=0;
}
else
{
// T0TCR |= 0x01;
T0TCR = 0x03; // 啟動并復位T0TC
T0TCR = 0x01;
RunFlag=1;
}
while( (EXTINT&0x02)!=0 ) // 等待外部中斷信號恢復為高電平
{ EXTINT |= 0x07; // 清除EINT0中斷標志
}
VICVectAddr = 0x00;
}
/****************************************************************************
* 名稱:IRQ_Eint1()
* 功能:外部中斷EINT1服務函數,Key2輸入。
* 入口參數:無
* 出口參數:無
****************************************************************************/
void __irq IRQ_Eint2(void)
{ uint32 i;
i = VICIRQStatus; // 讀出VICIRQStatus的值
second=0;
minute=0;
hour=0;
VICVectAddr = 0x00;
while( (EXTINT&0x04)!=0 ) // 等待外部中斷信號恢復為高電平
{ EXTINT |= 0x04; // 清除EINT1中斷標志
}
VICVectAddr = 0x00;
}
/****************************************************************************
* 名稱:IRQ_Timer0()
* 功能:外部中斷Timer0服務函數
* 入口參數:無
* 出口參數:無
****************************************************************************/
void __irq IRQ_Timer0(void)
{
second++;
T0IR = 0x01; // 清除中斷標志
VICVectAddr = 0x00; // 通知VIC中斷處理結束
}
/****************************************************************************
* 名稱:DispLight(int LigntNum)
* 功能:燈的顯示函數
* 入口參數:無
* 出口參數:無
****************************************************************************/
void DispLight(int LigntNum)
{
switch(LigntNum)
{
case 1:
IOCLR = LED1CON;
IOSET = LED2CON+LED3CON+LED4CON;
break;
case 2:
IOCLR = LED2CON;
IOSET = LED1CON+LED3CON+LED4CON;
break;
case 3:
IOCLR = LED3CON;
IOSET = LED1CON+LED2CON+LED4CON;
break;
case 4:
IOCLR = LED4CON;
IOSET = LED1CON+LED2CON+LED3CON;
break;
default :
break;
}
}
/****************************************************************************
* 名稱:HC595_SendDat(uint8 dat)
* 功能:LED數碼管的顯示底層函數
* 入口參數:dat
* 出口參數:無
****************************************************************************/
void HC595_SendDat(uint8 dat)
{ uint8 i;
IOCLR = SPI_CS; // SPI_CS = 0
for(i=0; i<8; i++) // 發送8位數據
{ IOCLR = SPI_CLK; // SPI_CLK = 0
/* 設置SPI的DATA輸出值 */
if( (dat&0x80)!=0 ) IOSET = SPI_DATA;
else IOCLR = SPI_DATA;
dat <<= 1;
IOSET = SPI_CLK; // SPI_CLK = 1
}
IOSET = SPI_CS; // SPI_CS = 1,輸出顯示數據
}
/****************************************************************************
* 名稱:DispLED(int LigntNum)
* 功能:LED數碼管的顯示函數
* 入口參數:LedNum
* 出口參數:無
****************************************************************************/
void DispLED(int LedNum)
{
const uint8 DISP_TAB[16] = { 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,
0x88,0x83,0xC6,0xA1,0x86,0x8E };
HC595_SendDat(DISP_TAB[LedNum]);
}
/****************************************************************************
* 名稱:WaitKey()
* 功能:等待鍵盤輸入函數
* 入口參數:LedNum
* 出口參數:無
****************************************************************************/
int WaitKeywww(int KeyNum)
{
int i;
if( (IOPIN&KEY3)==0 )
{
for(i=0; i<50; i++);
if( (IOPIN&KEY3)==0 )
{
//DispLED(KeyNum);
return KeyNum;
}
}
return KeyNum;
}
void WaitKey(void)
{ uint32 i;
while(1)
{ while( (IOPIN&KEY3)!=0 ); // 等待KEY1鍵按下
for(i=0; i<500; i++); // 延時去抖
if( (IOPIN&KEY3)==0 ) break;
}
while( (IOPIN&KEY3)==0 ); // 等待KEY1鍵放開
Key++;
}
/****************************************************************************
* 名稱:main()
* 功能:初始化外部中斷0、外部中斷1及IO連接等。
****************************************************************************/
int main(void)
{
int LedNum=0,LigntNum=0;
PINSEL0 = 0xa0000000; // 設置IO口工作模式,P0.14設置為EINT1
PINSEL1 = 0x00000001; // P0.16設置為EINT0
IODIR = LED1CON|LED2CON|LED3CON|LED4CON|SPI_IOCON; // 設置LED1、LED2控制口為輸出,其它I/O為輸入
VICIntSelect = 0x00000000; // 設置所有通道為IRQ中斷
VICVectCntl0 = 0x2f; // EINT1通道分配到IRQ slot 0,即優先級最高
VICVectAddr0 = (int)IRQ_Eint1; // 設置EINT1向量地址
VICVectCntl1 = 0x30;
VICVectAddr1 = (int)IRQ_Eint2;
VICVectCntl3 = 0x2e;
VICVectAddr3 = (int)IRQ_Eint0;
VICVectCntl2 = 0x24;
VICVectAddr2 = (int)IRQ_Timer0;
VICIntEnable = 0x0001c010; // 使能EINT1、EINT2,TIMER0中斷
// VICIntEnable = 0x00018010; // 使能EINT1、EINT2,TIMER0中斷
EXTINT |= 0x07; // 清除外部中斷標志
TargetInit();
while(1)
{
//WaitKey();
//Key=tem;
//if(Key>6)Key=3;
if(Keyflag==1)
{
Key++;
Keyflag=0;
}
if(second>=60)
{
second-=60;
minute+=1;
}
if(minute>=60)
{
minute-=60;
hour+=1;
}
switch((Key-3)%4)
{
case 0:
LedNum=minute/10;
LigntNum=1;
break;
case 1:
LedNum=minute%10;
LigntNum=2;
break;
case 2:
LedNum=second/10;
LigntNum=3;
break;
case 3:
LedNum=second%10;
LigntNum=4;
break;
default :
break;
}
DispLED(LedNum);
DispLight(LigntNum);
} // 等待中斷
return(0);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -