现阶段学习ARM裸机程序,今天修改写了LED流水灯简单程序:
程序代码修改如下:
#define GLOBAL_CLK 1 #include <stdlib.h> #include <string.h> #include "def.h" #include "option.h" #include "2440addr.h" #include "2440lib.h" #include "2440slib.h" #include "mmu.h" #include "profile.h" #include "memtest.h" void Led_port_init(void); /*设置GPBDAT5 GPBDAT6 GPBDAT7 GPBDAT8为低电平,即点亮LED */ #define LED1_ON ~(1<<5) #define LED2_ON ~(1<<6) #define LED3_ON ~(1<<7) #define LED4_ON ~(1<<8) /*设置GPBDAT5 GPBDAT6 GPBDAT7 GPBDAT8为高电平,即灭LED */ #define LED1_OFF (1<<5) #define LED2_OFF (1<<6) #define LED3_OFF (1<<7) #define LED4_OFF (1<<8) /************************************************* Function name: delay Parameter : times Description : 延时函数 Return : void Argument : void Autor & date : **************************************************/ void delay(int times) { int i; for(;times>0;times--) for(i=0;i<400;i++); } /************************************************* Function name: Main Parameter : void Description : 主功能函数 Return : void Argument : void Autor & date : **************************************************/ void Main(void) { int i; Led_port_init(); //for(i=0;i<100;i++) //{ /* 全亮 */ // rGPBDAT = rGPBDAT&(LED1_ON)&(LED2_ON)&(LED3_ON)&(LED4_ON); // delay(10000); /* 全灭 */ // rGPBDAT = rGPBDAT|(LED1_OFF)|(LED2_OFF)|(LED3_OFF)|(LED4_OFF); // delay(10000); //} for(i=0;i<5;i<i++) { rGPBDAT = rGPBDAT&(LED1_ON)|(LED2_OFF)|(LED3_OFF)|(LED4_OFF); delay(5000); rGPBDAT = rGPBDAT|(LED1_OFF)&(LED2_ON)|(LED3_OFF)|(LED4_OFF); delay(5000); rGPBDAT = rGPBDAT|(LED1_OFF)|(LED2_OFF)&(LED3_ON)|(LED4_OFF); delay(5000); rGPBDAT = rGPBDAT|(LED1_OFF)|(LED2_OFF)|(LED3_OFF)&(LED4_ON); delay(5000); } /* for(i=0;i<3;i++) { rGPBDAT = rGPBDAT&(LED1_ON); delay(2000); rGPBDAT = rGPBDAT|(LED1_OFF); delay(2000); }*/ } /************************************************* Function name: Led_port_init Parameter : void Description : mini2440开发板有4个引脚连接了LED发光 二极管,分别是GPB5--LED1,GPB6—LED2 GPB7--LED3,GPB8--LED4,该函数的作用 是对其个引脚进行初始化。 Return : void Argument : void Autor & date : Daniel **************************************************/ void Led_port_init(void) { /*设置GPB5-GPB8为输出端口*/ rGPBCON &= ~((3<<10)|(3<<12)|(3<<14)|(3<<16)); rGPBCON |= (1<<10)|(1<<12)|(1<<14)|(1<<16); }
上面修改代码,用ADS环境调试后,并没有像我想要实现的流水灯效果,而是LED1一亮一灭交替闪烁,真的还不知道出错在哪里????解决:
自己认真检查,原来在C语言上犯了一个错误。因为按位与”&“优先级高于 按位或”||“运算符,所以执行的时候并不是按顺序执行下去,程序先执行“&”,在执行“|”,就不是自己想要的流水灯顺序执行下去的了。加上()改变优先级,代码修改如下:
/*流水灯*/
/*for(i=0;i<5;i<i++)
{
rGPBDAT = rGPBDAT&(LED1_ON)|(LED2_OFF)|(LED3_OFF)|(LED4_OFF);delay(5000);
rGPBDAT = (rGPBDAT|(LED1_OFF))&(LED2_ON)|(LED3_OFF)|(LED4_OFF);
delay(5000);
rGPBDAT = (rGPBDAT|(LED1_OFF)|(LED2_OFF))&(LED3_ON)|(LED4_OFF);
delay(5000);
rGPBDAT = (rGPBDAT|(LED1_OFF)|(LED2_OFF)|(LED3_OFF))&(LED4_ON);
delay(5000);
}*/
自己修改的程序如下:
/* 全亮全灭交替 */ /* for(i=0;i<100;i++) { //全亮 rGPBDAT = rGPBDAT&(LED1_ON)&(LED2_ON)&(LED3_ON)&(LED4_ON); delay(10000); // 全灭 rGPBDAT = rGPBDAT|(LED1_OFF)|(LED2_OFF)|(LED3_OFF)|(LED4_OFF); delay(10000); }*/ /*流水灯*/ /*for(i=0;i<5;i<i++) { rGPBDAT = rGPBDAT&(LED1_ON)|(LED2_OFF)|(LED3_OFF)|(LED4_OFF); delay(5000); rGPBDAT = (rGPBDAT|(LED1_OFF))&(LED2_ON)|(LED3_OFF)|(LED4_OFF); delay(5000); rGPBDAT = (rGPBDAT|(LED1_OFF)|(LED2_OFF))&(LED3_ON)|(LED4_OFF); delay(5000); rGPBDAT = (rGPBDAT|(LED1_OFF)|(LED2_OFF)|(LED3_OFF))&(LED4_ON); delay(5000); }*/ /*用led显示0-15数字*/ for(i=0;i<16;i++) { if(i & 0x08) rGPBDAT = rGPBDAT&(LED4_ON); else rGPBDAT = rGPBDAT|(LED4_OFF); if(i & 0x04) rGPBDAT = rGPBDAT&(LED3_ON); else rGPBDAT = rGPBDAT|(LED3_OFF); if(i & 0x02) rGPBDAT = rGPBDAT&(LED2_ON); else rGPBDAT = rGPBDAT|(LED2_OFF); if(i & 0x01) rGPBDAT = rGPBDAT&(LED1_ON); else rGPBDAT = rGPBDAT|(LED1_OFF); delay(5000); } /* 验证某一盏灯对应的GPIO口*/ /* for(i=0;i<3;i++) { rGPBDAT = rGPBDAT&(LED1_ON); delay(2000); rGPBDAT = rGPBDAT|(LED1_OFF); delay(2000); }*/