【原创】基于ARM的流水灯仿真示例(第一次修改)
本次设计在上一篇(《基于ARM的流水灯仿真示例》)的基础上,加了晶振电路,并且改变和与LED灯相连的电阻的接法。在原来的设计中,所有的LED灯都和一个电阻相连,虽然仿真没有出现问题,但在现实电路中这样的接法很可能导致该电阻烧坏,所以本设计分别给每个LED灯接了一个电阻。整体电路的连接如下图所示。
经过修改之后的电路图
修改之前的电路图
程序部分并没有做出任何修改,程序代码如下:
1 #include "config.h"
2
3 int DelayTime=60; //延时参数
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 {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f},
19 {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}
20 };
21
22 int ModeIndex; //工作模式索引
23
24 //*****************************************************************************************************
25
26 ***
27 //主函数
28 int main (void)
29 {
30 //配置引脚功能
31 PINSEL0=0x000cc0cc;
32 PINSEL1=0x00000000;
33
34 IO1DIR=0xff<<16; //设P1.16-P1.23为输出
35
36 EXTMODE=0x00; //设置外部中断为电平触发
37
38 IRQEnable(); //使能IRQ中断
39
40 VICIntSelect=0x00000000; //设置所有分配为IRQ中断
41
42 VICVectCntl0=0x20|0x0e; //分配外部中断0到向量中断0
43 VICVectCntl1=0x20|0x0f; //分配外部中断1到向量中断0
44 VICVectCntl2=0x20|0x10; //分配外部中断2到向量中断0
45 VICVectCntl3=0x20|0x11; //分配外部中断3到向量中断0
46
47
48 //设置中断服务程序地址
49 VICVectAddr0=(uint32)IRQ_Eint0;
50 VICVectAddr1=(uint32)IRQ_Eint1;
51 VICVectAddr2=(uint32)IRQ_Eint2;
52 VICVectAddr3=(uint32)IRQ_Eint3;
53
54 EXTINT=0x0f; //清除所有外部中断标志
55
56 VICIntEnable=(1<<0x0e)|(1<<0x0f)|(1<<0x10)|(1<<0x11); //使能外部中断
57
58 while(1)
59 {
60 for(ModeIndex=0; ModeIndex<8; ModeIndex++)
61 {
62 IO1SET=LED_Mode[ModeSel][ModeIndex]<<16; //点亮LED灯
63 delay(DelayTime); //延时
64 IO1CLR=LED_Mode[ModeSel][ModeIndex]<<16; //熄灭LED灯
65 }
66 }
67 return 0;
68 }
69
70 //*****************************************************************************************************
71
72 ***
73 //延时函数
74 void delay(int dly)
75 {
76 int i,j;
77 for(i=0; i<dly; i++)
78 for(j=0; j<25000; j++);
79
80 }
81
82 //*****************************************************************************************************
83
84 ***
85 //外部中断0服务程序
86 void __irq IRQ_Eint0(void)
87 {
88 ModeSel=0; //设置LED工作模式
89 while((EXTINT&0x01)!=0)
90 {
91 EXTINT=0x01; //清除中断标志
92 }
93 VICVectAddr=0;
94 }
95
96 //*****************************************************************************************************
97
98 ***
99 //外部中断1服务程序
100 void __irq IRQ_Eint1(void)
101 {
102 ModeSel=1; //设置LED工作模式
103 while((EXTINT&0x02)!=0)
104 {
105 EXTINT=0x02; //清除中断标志
106 }
107 VICVectAddr=0;
108 }
109
110 //*****************************************************************************************************
111
112 ***
113 //外部中断2服务程序
114 void __irq IRQ_Eint2(void)
115 {
116 if(DelayTime>20)
117 DelayTime=DelayTime-20; //减少延时
118
119 while((EXTINT&0x04)!=0)
120 {
121 EXTINT=0x04; //清除中断标志
122 }
123 VICVectAddr=0;
124 }
125
126 //*****************************************************************************************************
127
128 ***
129 //外部中断3服务程序
130 void __irq IRQ_Eint3(void)
131 {
132 if(DelayTime<100)
133 DelayTime=DelayTime+20; //增加延时
134
135 while((EXTINT&0x08)!=0)
136 {
137 EXTINT=0x08; //清除中断标志
138 }
139 VICVectAddr=0;
140 }
141
142 /******************************************************************************************************
143
144 ***
145 ** End Of File
146 *******************************************************************************************************
147
148 */
本设计源程序、电路图及HEX文件