您的位置:首页 > 其它

【原创】基于ARM的流水灯仿真示例(第一次修改)

2010-05-14 19:25 211 查看
  本次设计在上一篇(《基于ARM的流水灯仿真示例》)的基础上,加了晶振电路,并且改变和与LED灯相连的电阻的接法。在原来的设计中,所有的LED灯都和一个电阻相连,虽然仿真没有出现问题,但在现实电路中这样的接法很可能导致该电阻烧坏,所以本设计分别给每个LED灯接了一个电阻。整体电路的连接如下图所示。



经过修改之后的电路图



修改之前的电路图

  程序部分并没有做出任何修改,程序代码如下:

#include "config.h"

int DelayTime=60;    //延时参数
int ModeSel=0;        //流水灯控制

//延时函数原型声明
void delay(int dly);

//中断服务程序原型声明
void __irq IRQ_Eint0(void);
void __irq IRQ_Eint1(void);
void __irq IRQ_Eint2(void);
void __irq IRQ_Eint3(void);

//流水灯工作模式定义
int LED_Mode[2][8]=
{
{0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f},
{0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}
};

int ModeIndex;        //工作模式索引

//*****************************************************************************************************

***
//主函数
int main (void)
{
//配置引脚功能
PINSEL0=0x000cc0cc;
PINSEL1=0x00000000;

IO1DIR=0xff<<16;    //设P1.16-P1.23为输出

EXTMODE=0x00;        //设置外部中断为电平触发

IRQEnable();        //使能IRQ中断

VICIntSelect=0x00000000;    //设置所有分配为IRQ中断

VICVectCntl0=0x20|0x0e;        //分配外部中断0到向量中断0
VICVectCntl1=0x20|0x0f;        //分配外部中断1到向量中断0
VICVectCntl2=0x20|0x10;        //分配外部中断2到向量中断0
VICVectCntl3=0x20|0x11;        //分配外部中断3到向量中断0

//设置中断服务程序地址
VICVectAddr0=(uint32)IRQ_Eint0;
VICVectAddr1=(uint32)IRQ_Eint1;
VICVectAddr2=(uint32)IRQ_Eint2;
VICVectAddr3=(uint32)IRQ_Eint3;

EXTINT=0x0f;    //清除所有外部中断标志

VICIntEnable=(1<<0x0e)|(1<<0x0f)|(1<<0x10)|(1<<0x11);    //使能外部中断

while(1)
{
for(ModeIndex=0; ModeIndex<8; ModeIndex++)
{
IO1SET=LED_Mode[ModeSel][ModeIndex]<<16;    //点亮LED灯
delay(DelayTime);                //延时
IO1CLR=LED_Mode[ModeSel][ModeIndex]<<16;    //熄灭LED灯
}
}
return 0;
}

//*****************************************************************************************************

***
//延时函数
void delay(int dly)
{
int i,j;
for(i=0; i<dly; i++)
for(j=0; j<25000; j++);

}

//*****************************************************************************************************

***
//外部中断0服务程序
void __irq IRQ_Eint0(void)
{
ModeSel=0;            //设置LED工作模式
while((EXTINT&0x01)!=0)
{
EXTINT=0x01;    //清除中断标志
}
VICVectAddr=0;
}

//*****************************************************************************************************

***
//外部中断1服务程序
void __irq IRQ_Eint1(void)
{
ModeSel=1;            //设置LED工作模式
while((EXTINT&0x02)!=0)
{
EXTINT=0x02;    //清除中断标志
}
VICVectAddr=0;
}

//*****************************************************************************************************

***
//外部中断2服务程序
void __irq IRQ_Eint2(void)
{
if(DelayTime>20)
DelayTime=DelayTime-20;        //减少延时

while((EXTINT&0x04)!=0)
{
EXTINT=0x04;            //清除中断标志
}
VICVectAddr=0;
}

//*****************************************************************************************************

***
//外部中断3服务程序
void __irq IRQ_Eint3(void)
{
if(DelayTime<100)
DelayTime=DelayTime+20;        //增加延时

while((EXTINT&0x08)!=0)
{
EXTINT=0x08;            //清除中断标志
}
VICVectAddr=0;
}

/******************************************************************************************************

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

*/


  本设计源程序、电路图及HEX文件

  LED.7z
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐