⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 eint01.c

📁 针对周立功2104板子的一个秒表程序,可以通过按键分别查看秒表的时间,分,秒.
💻 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 + -