×
单片机 > 单片机程序设计 > 详情

ARM学习1-LED流水灯

发布时间:2020-06-20 发布时间:
|
         通过近段时间的不懈努力终于找到一个可以用来编译ARM 的Keil ,再利用Protuse软件进行模拟仿真。 开始了我的ARM学习之路……

         本实例是我学习ARM的第一个实例,仿真软件是利用的是Porteus,编译软件用的是Keil的RealView.MDK.3.2。

         本程序是花样流水。一共有三个花样,可以通过按键选择不同的花样。通过此程序学习了ARM GPIO的处理和按键处理。

原理图:

程序代码:

/*********************************************/
/*                                           */
/*          led.c:  花样流水                 */
/*                                           */
/*********************************************/
                  
#include             
          
#define KEY 0x00010000            // P0.16引脚连接按键

unsigned char Count;    
      
/*********************************************
**函 数 名: delay()
**描    述: 软件延时
**参数说明:无
**返 回 值:无
**********************************************/
void delay (unsigned char num)  
{                         
   unsigned char i;
 unsigned volatile long j;

   for(i=0;i  {
    for(j=0;j<60000;j++)
  {
   ;
  }
 }
}
/*********************************************
**函 数 名: init()
**描    述: 初始化
**参数说明:无
**返 回 值:无
**********************************************/
void init(void)
{
 PINSEL0 = 0;       // 设置低16引脚为GPIO 
 IO0DIR = 0x000000FF;     // 将P0低8位设置为输出 
 IO0SET = 0x000000FF;     // 将P0低8位置1,也就是让led灭
 Count = 0;
}
/*********************************************
**函 数 名: light_one_by_one()
**描    述: 逐个点亮
**参数说明:无
**返 回 值:无
**********************************************/
void light_one_by_one(void)
{
 unsigned char i;
 unsigned volatile long tem;

 tem = 0x01;

 for (i=0; i<8; i++)
 {
  IO0CLR = tem;
  delay(5);
  tem <<= 1;
 }

 IO0SET = 0x000000FF;    // 关闭所有灯
 delay(5);
}
 
/*********************************************
**函 数 名: light_interval()
**描    述: 间隔点亮
**参数说明:无
**返 回 值:无
**********************************************/
void light_interval(void)
{
 unsigned char i;

 for (i=0; i<4; i++)
 {
  IO0SET = 0x00000055;
  IO0CLR = 0x000000aa;
  delay(5);

  IO0SET = 0x000000aa;
  IO0CLR = 0x00000055;
  delay(5);
 }
}

/*********************************************
**函 数 名: light_single()
**描    述: 单个点亮
**参数说明:无
**返 回 值:无
**********************************************/
void light_single(void)
{
 unsigned char i;
 unsigned volatile long tem;

 tem = 0x01;

 for (i=0; i<8; i++)
 {
  IO0SET = 0x000000FF;
  IO0CLR = tem;
  delay(5);
  tem <<= 1;
 }

 IO0SET = 0x000000FF;
 delay(5);
}
/*********************************************
**函 数 名: WaitKey()
**描    述: 按键处理
**参数说明:无
**返 回 值:无
**********************************************/
void WaitKey(void)
{

 if ((IO0PIN&KEY)==0)         // 如果有键按下
 {
  delay(1);              // 延时消抖

  if ((IO0PIN&KEY)==0)     // 再次判断
  {        
   Count++;       // 有键按下,计数器加1
  }
 
  if (Count >= 3) 
  {
      Count = 0;
  }
 
  while ((IO0PIN&KEY)==0); // 等待按键释放
 }
}

/*********************************************
**函 数 名: main()
**描    述: 主函数
**参数说明:无
**返 回 值:无
**********************************************/
int main(void) 
{
    init();

 while (1)  
 {
  WaitKey();

     switch (Count)
  {
    case 0: light_one_by_one();break; // 逐个点亮
   case 1: light_interval();break;   // 间隔点亮
   case 2: light_single();break;   // 单个点亮
   default: break;
  }
 }
}

关键字:ARM  LED流水灯 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
如何为单片机选择合适的负载电容