通过按键,实现灯左移右移
#include "int_test.h"
#include "sys_init.h"
#define rCPLDLEDADDR (*(volatile unsigned char*)0x21180000)
/*********************************************************************************************
* name: main
* func: c code entry
* para: none
* ret: none
* modify:
* comment:
*********************************************************************************************/
int main( )
{
sys_init(); // Initial s3c2410's Clock, Interrupt,Port and UART
while(1)
{
int_test();
}
}
/*********************************************************************************************
* File: button_test.c
* Author: embest
* Descript: Button_Test
* History:
* EINT0 --- KEY1 EINT1 --- KEY2
*********************************************************************************************/
/*------------------------------------------------------------------------------------------*/
/* include files */
/*------------------------------------------------------------------------------------------*/
#include "2410lib.h"
/*------------------------------------------------------------------------------------------*/
/* const define */
/*------------------------------------------------------------------------------------------*/
#define rCPLDIntControl (*(volatile unsigned char*)0x22600000)
#define rCPLDIntStatus (*(volatile unsigned char*)0x22200000)
#define rCPLDLEDADDR (*(volatile unsigned char*)0x21180000)
extern int flag;
/*------------------------------------------------------------------------------------------*/
/* function declare */
/*------------------------------------------------------------------------------------------*/
void __irq int_int(void);
/*********************************************************************************************
* name: int_int
* func: EXTINT interrupt service routine
* para: none
* ret: none
* modify:
* comment:
*********************************************************************************************/
void __irq int_int(void)
{
unsigned char Status;
Status = rCPLDIntStatus;
Status = ~(Status & 0x6);
if(Status & 0x2)
{
flag=1;
uart_printf(" Eint0 interrupt occurred.\n");
rCPLDIntControl |= (1<<1);
rCPLDIntControl &= ~(1<<1);
}
else if(Status & 0x4)
{
flag=0;
uart_printf(" EINT1 interrupt occurred.\n");
rCPLDIntControl |= (1<<2);
rCPLDIntControl &= ~(1<<2);
}
rEINTPEND=(1<<9);
ClearPending(BIT_EINT8_23);
}
/*********************************************************************************************
* name: int_init
* func: Interrupt initialize
* para: none
* ret: none
* modify:
* comment:
*********************************************************************************************/
void int_init(void)
{
rSRCPND = rSRCPND; // Clear all interrupt
rINTPND = rINTPND; // Clear all interrupt
// nIntMode='3';
rGPGCON |= (0xf<<0);
rGPGCON &= (0xa<<0);
rCPLDIntControl = 0xFF;
rCPLDIntControl = 0xF9;
pISR_EINT8_23=(UINT32T)int_int;
rEINTPEND = 0xffffff;
rSRCPND = BIT_EINT8_23; // Clear the previous pending states
rINTPND = BIT_EINT8_23;
rEXTINT1 &= ~((0x7<<4)|(0x7<<0));
rEXTINT1 |= ((0x2<<4)|(0x2<<0));
rEINTMASK &= ~(3<<8);
rINTMSK &= ~(BIT_EINT8_23);
}
void led_on(void)
{
int i,nOut;
nOut = 0xFF;
rCPLDLEDADDR = nOut & 0xFE;
for(i = 0; i < 100000; i++);
rCPLDLEDADDR = nOut & 0xFC;
for(i = 0; i < 100000; i++);
rCPLDLEDADDR = nOut & 0xF8;
for(i = 0; i < 100000; i++);
rCPLDLEDADDR = nOut & 0xF0;
for(i = 0; i < 100000; i++);
}
void led_off(void)
{
int i,nOut;
nOut = 0xF0;
rCPLDLEDADDR = nOut | 0x01;
for(i = 0; i < 100000; i++);
rCPLDLEDADDR = nOut | 0x03;
for(i = 0; i < 100000; i++);
rCPLDLEDADDR = nOut | 0x07;
for(i = 0; i < 100000; i++);
rCPLDLEDADDR = nOut | 0x0F;
for(i = 0; i < 100000; i++);
}
void led_on_off(void)
{
int i;
rCPLDLEDADDR = 0xF0;
for(i = 0; i < 100000; i++);
rCPLDLEDADDR = 0xFF;
for(i = 0; i < 100000; i++);
}
void led_left(void)
{
int i,nOut;
nOut = 0xFF;
rCPLDLEDADDR = nOut & 0xFE;
for(i = 0; i < 100000; i++);
rCPLDLEDADDR = nOut & 0xFC;
for(i = 0; i < 100000; i++);
rCPLDLEDADDR = nOut & 0xF8;
for(i = 0; i < 100000; i++);
rCPLDLEDADDR = nOut & 0xF0;
for(i = 0; i < 100000; i++);
}
void led_right(void)
{
int i,nOut;
nOut = 0xF0;
rCPLDLEDADDR = nOut | 0x07;
for(i = 0; i < 100000; i++);
rCPLDLEDADDR = nOut | 0x03;
for(i = 0; i < 100000; i++);
rCPLDLEDADDR = nOut | 0x01;
for(i = 0; i < 100000; i++);
rCPLDLEDADDR = nOut | 0x00;
for(i = 0; i < 100000; i++);
}
void led_on_off1(void)
{
int i;
rCPLDLEDADDR = 0xF0;
for(i = 0; i < 100000; i++);
rCPLDLEDADDR = 0xFF;
for(i = 0; i < 100000; i++);
}
/*********************************************************************************************
* name: int_test
* func: Extern interrupt test
* para: none
* ret: none
* modify:
* comment:
*********************************************************************************************/
void int_test(void)
{
int_init();
uart_printf("\n External Interrupt Test Example\n");
if(flag==1)
{led_left();led_on_off1();}
else{led_right();led_on_off1();}
}