基于ARM的流水灯仿真示例
2020-01-28 来源:eefocus
本设计使用的仿真工具是Proteus 7.4,IDE是ADS 1.2,芯片是LPC2134
在Proteus中的电路图如下图所示:
本设计使用的是周立功的LPC2131的工程模板。LPC2131的RAM为8K,而LPC2134的为16K,因此在使用工程模板时必须修改mem_a.scf、mem_b.scf和men_c.scf文件中的RAM最高端地址,即把“0x40002000”改为“0x40004000”。
本设计中的四个按钮对应着四个外部中断,用于控制流水灯的工作方式。
PS:本设计中的电路图只限用于仿真,在实际应用中还应加上晶振、复位电路等 。
源代码及注释如下:
1 #include 'config.h'
2
3 int DelayTime=50; //延时参数
4 int ModeSel=0; //流水灯控制
5
6 //延时函数原型声明
7 void delay(int dly);
8
9 //中断服务程序原型声明
10 void __irq IRQ_Eint0(void);
11 void __irq IRQ_Eint1(void);
12 void __irq IRQ_Eint2(void);
13 void __irq IRQ_Eint3(void);
14
15 //流水灯工作模式定义
16 int LED_Mode[2][8]=
17 {
18
19 {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f},
20 {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}
21 };
22
23 int ModeIndex; //工作模式索引
24
25 //********************************************************************************************************
26 //主函数
27 int main (void)
28 {
29 //配置引脚功能
30 PINSEL0=0x000cc0cc;
31 PINSEL1=0x00000000;
32
33 IO1DIR=0xff<<16; //设P1.16-P1.23为输出
34
35 EXTMODE=0x00; //设置外部中断为电平触发
36
37 IRQEnable(); //使能IRQ中断
38
39 VICIntSelect=0x00000000; //设置所有分配为IRQ中断
40
41 VICVectCntl0=0x20|0x0e; //分配外部中断0到向量中断0
42 VICVectCntl1=0x20|0x0f; //分配外部中断1到向量中断0
43 VICVectCntl2=0x20|0x10; //分配外部中断2到向量中断0
44 VICVectCntl3=0x20|0x11; //分配外部中断3到向量中断0
45
46
47 //设置中断服务程序地址
48 VICVectAddr0=(uint32)IRQ_Eint0;
49 VICVectAddr1=(uint32)IRQ_Eint1;
50 VICVectAddr2=(uint32)IRQ_Eint2;
51 VICVectAddr3=(uint32)IRQ_Eint3;
52
53 EXTINT=0x0f; //清除所有外部中断标志
54
55 VICIntEnable=(1<<0x0e)|(1<<0x0f)|(1<<0x10)|(1<<0x11); //使能外部中断
56
57 while(1)
58 {
59 for(ModeIndex=0; ModeIndex<8; ModeIndex++)
60 {
61 IO1SET=LED_Mode[ModeSel][ModeIndex]<<16; //点亮LED灯
62 delay(DelayTime); //延时
63 IO1CLR=LED_Mode[ModeSel][ModeIndex]<<16; //熄灭LED灯
64 }
65 }
66 return 0;
67 }
68
69 //********************************************************************************************************
70 //延时函数
71 void delay(int dly)
72 {
73 int i,j;
74 for(i=0; i 76 77 } 78 79 //******************************************************************************************************** 80 //外部中断0服务程序 81 void __irq IRQ_Eint0(void) 82 { 83 ModeSel=0; //设置LED工作模式 84 while((EXTINT&0x01)!=0) 85 { 86 EXTINT=0x01; //清除中断标志 87 } 88 VICVectAddr=0; 89 } 90 91 //******************************************************************************************************** 92 //外部中断1服务程序 93 void __irq IRQ_Eint1(void) 94 { 95 ModeSel=1; //设置LED工作模式 96 while((EXTINT&0x02)!=0) 97 { 98 EXTINT=0x02; //清除中断标志 99 } 100 VICVectAddr=0; 101 } 102 103 //******************************************************************************************************** 104 //外部中断2服务程序 105 void __irq IRQ_Eint2(void) 106 { 107 if(DelayTime>30) 108 DelayTime=DelayTime-10; //减少延时 109 110 while((EXTINT&0x04)!=0) 111 { 112 EXTINT=0x04; //清除中断标志 113 } 114 VICVectAddr=0; 115 } 116 117 //******************************************************************************************************** 118 //外部中断3服务程序 119 void __irq IRQ_Eint3(void) 120 { 121 if(DelayTime<80) 122 DelayTime=DelayTime+10; //增加延时 123 124 while((EXTINT&0x08)!=0) 125 { 126 EXTINT=0x08; //清除中断标志 127 } 128 VICVectAddr=0; 129 } 130 131
下一篇:ARM与X86 CPU架构区别