实验结果:按左键led灯向左亮,按右键led灯向右亮
void __irq int_int(void); //声明中断服务函数
int flag=0; //定义一个标志位
void led_Y(void) //小灯自左向右依次亮灭
{
int i,nOut;
nOut = 0xF0;
rCPLDLEDADDR = nOut | 0x0F;
for(i = 0; i < 100000; i++);
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++);
nOut = 0xFF;
rCPLDLEDADDR = nOut & 0xF0;
for(i = 0; i < 100000; i++);
rCPLDLEDADDR = nOut & 0xF8;
for(i = 0; i < 100000; i++);
rCPLDLEDADDR = nOut & 0xFC;
for(i = 0; i < 100000; i++);
rCPLDLEDADDR = nOut & 0xFE;
for(i = 0; i < 100000; i++);
}
void led_Z(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++);
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_m(void)
{
int i;
rCPLDLEDADDR = 0xFF;
for(i = 0; i < 100000; i++);
}
中断程序
void __irq int_int(void)
{
unsigned char Status;
Status = rCPLDIntStatus; //中断状态是低有效
Status = ~(Status & 0x6); //将状态取反
if(Status & 0x2) //查询键和控制处理
{
flag=0;
uart_printf(" Eint0 interrupt occurred.\n");
rCPLDIntControl |= (1<<1);
rCPLDIntControl &= ~(1<<1);
}
else if(Status & 0x4)
{
flag=1;
uart_printf(" EINT1 interrupt occurred.\n");
rCPLDIntControl |= (1<<2);
rCPLDIntControl &= ~(1<<2);
}
rEINTPEND=(1<<9); //禁止外部中断EINT8
ClearPending(BIT_EINT8_23);
}
按键初始化
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; //外部中断请求设置全1
rSRCPND = BIT_EINT8_23; // Clear the previous pending states
rINTPND = BIT_EINT8_23; //记录CPU正在处理的中断源
rEXTINT1 &= ~((0x7<<4)|(0x7<<0)); //电平 控制EINT8为下降沿触发
rEXTINT1 |= ((0x2<<4)|(0x2<<0));
rEINTMASK &= ~(3<<8); //外部中断屏蔽寄存器,允许EINT8,9
rINTMSK &= ~(BIT_EINT8_23);
}
主程序
void int_test(void)
{
uart_printf("\n External Interrupt Test Example\n");
int_init();
while(1) //等待中断,循环
{
if(flag==0) //标志位为0,灯向左亮;为1,灯向右亮
led_Z();
else
led_Y();
}
}