【原创】基于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

 

 

 

智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



猜您在找
【原创】基于ARM的流水灯仿真示例(第一次修改) proteus7 和 keil4 仿真流水灯 proteus7 和 keil4 仿真流水灯 【ARM】2410裸机系列-流水灯 ARM学习之GPIO实现流水灯
智能推荐
 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告