新闻中心

EEPW首页>嵌入式系统>设计应用> ARM学习1-LED流水灯

ARM学习1-LED流水灯

作者: 时间:2016-11-10 来源:网络 收藏
通过近段时间的不懈努力终于找到一个可以用来编译ARM的Keil ,再利用Protuse软件进行模拟仿真。 开始了我的ARM学习之路……

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

本文引用地址://m.amcfsurvey.com/article/201611/317360.htm

本程序是花样流水。一共有三个花样,可以通过按键选择不同的花样。通过此程序学习了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;
}
}
}



关键词:ARMLED流水

评论


技术专区

关闭