您的位置 首页 5G

ARM学习1-LED流水灯

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

经过近段时刻的不懈努力总算找到一个能够用来编译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;
}
}
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/5g/275933.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部