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

📄 main.c

📁 ARM9 s3c2410 KEY键盘中断 已调通
💻 C
字号:
/****************************************Copyright (c)**************************************************
**                               Guangzhou ZHIYUAN Electronics Co.,LTD.
**                                      graduate school
**                                 http://www.zyinside.com
**
**--------------File Info-------------------------------------------------------------------------------
** File name:			main.c
** Last modified Date:  2006-07-08
** Last Version:		1.0
** Descriptions: DeviceARM2410A的基础实验---GPIO输出控制实验。
**               使用GPIO控制LED1~LED8及蜂鸣器,先蜂鸣器响一声,LED灯全部闪烁5次,然后控制流水灯显示。
**
**------------------------------------------------------------------------------------------------------
** Created by:			Chenmingji
** Created date:		2004-09-16
** Version:				1.0
** Descriptions:		The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by: 黄绍斌
** Modified date: 2006-07-08
** Version: 1.0
** Descriptions:
**
********************************************************************************************************/
#include "config.h"

// 定义LED控制口 (输出低电平时点亮LED)                                
#define  LED1_CON           (1<<1)      /* GPG1口  */
#define  LED2_CON           (1<<3)      /* GPG3口  */
#define  LED3_CON           (1<<5)      /* GPG5口  */
#define  LED4_CON           (1<<6)      /* GPG6口  */
#define  LED5_CON           (1<<7)      /* GPG7口  */
#define  LED6_CON           (1<<1)      /* GPB1口  */
#define  LED7_CON           (1<<2)      /* GPB2口  */
#define  LED8_CON           (1<<3)      /* GPB3口  */

// 定义蜂鸣器控制口
#define  BEEP		        (1<<10)     /* GPH10口 */	
#define  BEEP_MASK	        (~BEEP)

#define   KEY_CON			(1<<4)		/* GPF4口  */
// 定义KEY1的键值
unsigned int key_count = 0;//KEY1的键值

unsigned int key_pressed = 1;//控制程序是否运行 0:不能运行   1:能运行

/*********************************************************************************************************
** Function name: DelayNS
** Descriptions: 长软件延时。
**              延时时间与系统时钟有关。
** Input: dly	延时参数,值越大,延时越久
** Output: 无
** Created by: 黄绍斌
** Created Date: 2005-12-31 
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void  DelayNS(uint32  dly)
{  
	uint32  i;

   	for(; dly>0; dly--) 
       for(i=0; i<50000; i++);
}

/*********************************************************************************************************
** Function name: RunBeep
** Descriptions: 控制蜂鸣器Be一声音。  
** Input: 无
** Output: 无
** Created by: 黄绍斌
** Created Date: 2006-07-08
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void  RunBeep(void)
{  
    rGPHDAT = rGPHDAT & BEEP_MASK;	    // BEEP = 0
    DelayNS(5);
    rGPHDAT = rGPHDAT | BEEP;		    // BEEP = 1 
    DelayNS(5);
}




/*********************************************************************************************************
** Function name: LED_DispAllOn
** Descriptions: 控制LED1~LED8全部点亮。   
** Input: 无
** Output: 无
** Created by: 黄绍斌
** Created Date: 2006-07-08
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void  LED_DispAllOn(void)
{  
    rGPGDAT = rGPGDAT & (~(0x000000EA));    // GPG1、GPG3、GPG5、GPG6、GPG7均输出0
    rGPBDAT = rGPBDAT & (~(0x0000000E));    // GPB1、GPB2、GPB3均输出0
}



/*********************************************************************************************************
** Function name: LED_DispAllOff
** Descriptions: 控制LED1~LED8全部熄灭。     
** Input: 无
** Output: 无
** Created by: 黄绍斌
** Created Date: 2006-07-08
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void  LED_DispAllOff(void)
{  
    rGPGDAT = rGPGDAT | 0x000000EA;     // GPG1、GPG3、GPG5、GPG6、GPG7均输出1
    rGPBDAT = rGPBDAT | 0x0000000E;     // GPB1、GPB2、GPB3均输出1
}



/*********************************************************************************************************
** Function name: LED_DispNum
** Descriptions: 控制LED1~LED8显示指定16进制数值。LED8为最高位,LED1为最低为,点亮表示该位为1。      
** Input: dat      显示数值(低8位有效)
** Output: 无
** Created by: 黄绍斌
** Created Date: 2006-07-08
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void  LED_DispNum(uint32 dat1,uint32 dat2)
{
    dat1 = dat1 & 0x000000FF;     // 参数过滤
    dat2 = dat2 & 0x000000FF;     // 参数过滤      
    if(dat1 & 0x80 || dat2 & 0x80) rGPBDAT = rGPBDAT & (~LED8_CON); 
      else rGPBDAT = rGPBDAT | LED8_CON;       
    if(dat1 & 0x40 || dat2 & 0x40) rGPBDAT = rGPBDAT & (~LED7_CON); 
      else  rGPBDAT = rGPBDAT | LED7_CON; 
    if(dat1 & 0x20 || dat2 & 0x20) rGPBDAT = rGPBDAT & (~LED6_CON); 
      else  rGPBDAT = rGPBDAT | LED6_CON;
    if(dat1 & 0x10 || dat2 & 0x10) rGPGDAT = rGPGDAT & (~LED5_CON); 
      else  rGPGDAT = rGPGDAT | LED5_CON;   
    if(dat1 & 0x08 || dat2 & 0x08) rGPGDAT = rGPGDAT & (~LED4_CON); 
      else  rGPGDAT = rGPGDAT | LED4_CON;   
    if(dat1 & 0x04 || dat2 & 0x04) rGPGDAT = rGPGDAT & (~LED3_CON); 
      else  rGPGDAT = rGPGDAT | LED3_CON;
    if(dat1 & 0x02 || dat2 & 0x02) rGPGDAT = rGPGDAT & (~LED2_CON); 
      else  rGPGDAT = rGPGDAT | LED2_CON;
    if(dat1 & 0x01 || dat2 & 0x01) rGPGDAT = rGPGDAT & (~LED1_CON); 
      else  rGPGDAT = rGPGDAT | LED1_CON;
}


// 定义流水灯控制数据
const uint8  LED_DISP[] = 
{   0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,
    0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01
};

//定义IRQ中断服务函数
void IRQ_Eint4(void)
{
	int i;
	
	rGPFCON=rGPFCON&(~(0x03<<8));
	for(i=0;i<10000;i++);//延时消抖
	if(rGPFDAT&KEY_CON)
	{
		rGPFCON = rGPFCON|(0x02<<8);
		
		rEINTPEND = (1<<4);
		rSRCPND = (1<<4);
		rINTPND = rINTPND;
		return;
	}
	rGPFCON = rGPFCON|(0x02<<8);
	
	key_count++;	
	switch(key_count)
	{
		case 1:
			key_pressed = 1;
			break;
		case 2:
			key_count = 0;
			LED_DispAllOff();
			key_pressed = 0;
			break;
	}
	
	rEINTPEND = (1<<4);
	rSRCPND = (1<<4);
	rINTPND = rINTPND;
}

//中断初始化函数
void EINT_init(void)
{
	rGPFCON = (rGPFCON&0xFFFFFCFF)|(0x02<<8);
	rEXTINT0 = (0x2<<16);
	VICVectAddr[4] = (uint32)IRQ_Eint4;
	
	rPRIORITY = 0x00000000;
	rINTMOD = 0x00000000;
	rINTMSK = ~0x0000010;
	rEINTMASK = ~0x0000010;
}

/*********************************************************************************************************
** Function name: main
** Descriptions: 初始化I/O,然后控制LED显示。          
** Input: 无
** Output: 系统返回值0
** Created by: 黄绍斌
** Created Date: 2006-07-08
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
int  main(void)
{		
   int  i = 0;
    
    // 初始化I/O
    rGPBCON = (rGPBCON & (~0x000000FC)) | 0x00000054;       // 设置GPB1--GPB3为GPIO输出模式                    
    rGPGCON = (rGPGCON & (~0x0000FCCC)) | 0x00005444;       // 设置GPG1、GPG3、GPG5、GPG6和GPG7为GPIO输出模式                                                       
    rGPHCON = (rGPHCON & (~(0x03<<20))) | (0x01<<20);       // 设置GPH10为GPIO输出模式
    
    LED_DispAllOff();
    EINT_init();
    IRQEnable();
    while(1)
    {
			if( key_pressed == 1 )
			{
				LED_DispNum(LED_DISP[i],LED_DISP[i+1]);
				DelayNS(5);
				i++;
				if(i == 14)
					i = 0;
			}
		}
   	return(0);
}

/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -