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