【原创】基于ARM的流水灯仿真示例
本设计使用的仿真工具是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<DelayTime; i++)
75 for(j=0; j<25000; j++);
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
浙公网安备 33010602011771号