ARM学习1-LED流水灯
本实例是我学习ARM的第一个实例,仿真软件是利用的是Porteus,编译软件用的是Keil的RealView.MDK.3.2。
本文引用地址:https://www.eepw.com.cn/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;
}
}
}
评论