ARM學(xué)習(xí)1-LED流水燈
本實例是我學(xué)習(xí)ARM的第一個實例,仿真軟件是利用的是Porteus,編譯軟件用的是Keil的RealView.MDK.3.2。
本文引用地址:http://m.butianyuan.cn/article/201611/317360.htm本程序是花樣流水。一共有三個花樣,可以通過按鍵選擇不同的花樣。通過此程序?qū)W習(xí)了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;// 設(shè)置低16引腳為GPIO
IO0DIR = 0x000000FF;// 將P0低8位設(shè)置為輸出
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; // 關(guān)閉所有燈
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;
}
}
}
評論