新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > ARM學習1-LED流水燈

ARM學習1-LED流水燈

作者: 時間:2016-11-10 來源:網(wǎng)絡 收藏
通過近段時間的不懈努力終于找到一個可以用來編譯ARM 的Keil ,再利用Protuse軟件進行模擬仿真。 開始了我的ARM學習之路……

本實例是我學習ARM的第一個實例,仿真軟件是利用的是Porteus,編譯軟件用的是Keil的RealView.MDK.3.2。

本文引用地址:http://butianyuan.cn/article/201611/317360.htm

本程序是花樣流水。一共有三個花樣,可以通過按鍵選擇不同的花樣。通過此程序學習了ARM GPIO的處理和按鍵處理。

原理圖:

程序代碼:

/*********************************************/
/* */
/* led.c: 花樣流水 */
/* */
/*********************************************/

#include

#define KEY 0x00010000 // P0.16引腳連接按鍵

unsigned char Count;

/*********************************************
**函 數(shù) 名: delay()
**描 述: 軟件延時
**參數(shù)說明:無
**返 回 值:無
**********************************************/
void delay (unsigned char num)
{
unsigned char i;
unsigned volatile long j;

for(i=0;i{
for(j=0;j<60000;j++)
{
;
}
}
}
/*********************************************
**函 數(shù) 名: init()
**描 述: 初始化
**參數(shù)說明:無
**返 回 值:無
**********************************************/
void init(void)
{
PINSEL0 = 0;// 設置低16引腳為GPIO
IO0DIR = 0x000000FF;// 將P0低8位設置為輸出
IO0SET = 0x000000FF;// 將P0低8位置1,也就是讓led滅
Count = 0;
}
/*********************************************
**函 數(shù) 名: light_one_by_one()
**描 述: 逐個點亮
**參數(shù)說明:無
**返 回 值:無
**********************************************/
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);
}

/*********************************************
**函 數(shù) 名: light_interval()
**描 述: 間隔點亮
**參數(shù)說明:無
**返 回 值:無
**********************************************/
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);
}
}

/*********************************************
**函 數(shù) 名: light_single()
**描 述: 單個點亮
**參數(shù)說明:無
**返 回 值:無
**********************************************/
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);
}
/*********************************************
**函 數(shù) 名: WaitKey()
**描 述: 按鍵處理
**參數(shù)說明:無
**返 回 值:無
**********************************************/
void WaitKey(void)
{

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

if ((IO0PIN&KEY)==0) // 再次判斷
{
Count++; // 有鍵按下,計數(shù)器加1
}

if (Count >= 3)
{
Count = 0;
}

while ((IO0PIN&KEY)==0); // 等待按鍵釋放
}
}

/*********************************************
**函 數(shù) 名: main()
**描 述: 主函數(shù)
**參數(shù)說明:無
**返 回 值:無
**********************************************/
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流水

評論


技術專區(qū)

關閉