歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

LED驅動程序

s3c6410有187個GPIO,分為GPA,GPB,GPC .......GPQ 共有17組,每組GPIO(GPA~GPQ),都可以通過5個寄存器來控制。

GPxCON:GPIO配置寄存器

GPxDAT:GPIO數據寄存器

GPxUD:上拉/下拉電阻控制寄存器

GPxCONSLP:GPIO配置寄存器(睡眠模式)

GPxPUDSLP:上拉/下拉電阻控制寄存器(睡眠模式)

(其中x為A~Q)


下面是它的程序分析

/**********************************************************
*實驗要求:   用Tiny6410上的4個LED資源實現跑馬燈程序。
*功能描述:   Tiny6410用下面4個引腳連接了LED發光二極管,分別是
*          GPK4--LED1
*          GPK5--LED2
*          GPK6--LED3
*          GPK7--LED4
*          本程序將控制這四個管腳的輸出電平,實現跑馬燈的效果
*日    期:   2011-3-10
*作    者:   國嵌
**********************************************************/
#include "def.h"
#include "gpio.h"


#define LED1_ON   ~(1<<4)
#define LED2_ON   ~(1<<5)
#define LED3_ON   ~(1<<6)
#define LED4_ON   ~(1<<7)


#define LED1_OFF   (1<<4)
#define LED2_OFF   (1<<5)
#define LED3_OFF   (1<<6)
#define LED4_OFF   (1<<7)
#define LEDALL_OFF (0xf<<4)


//GPIO
#define GPIO_BASE (0x7F008000)
//oGPIO_REGS類型在 gpio.h 中定義
#define GPIO   (( volatile oGPIO_REGS *)GPIO_BASE)


//函數聲明
void delay(int times);
void LedPortInit(void);
void LedRun(void);


/*
 * 程序入口
 * */
int main(void)
{
LedPortInit();
LedRun();
}


/*
 * 延時函數
 * */
void delay(int times)
{
    int i;
    for(;times>0;times--)
      for(i=0;i<3000;i++);
}


/*
 *   初始化連接LED燈的管腳資源
 * @ 通過將GPIO_BASE強制轉化為(volatile oGPIO_REGS*)型的指針可以很方便
 * 的訪問各個GPIO寄存器的值,這種方法比通過使用寄存器地址的宏定義訪問
 * 寄存器單元更加規范和科學。
 * */ 
void LedPortInit(void)
{
u32 uConValue;
uConValue = GPIO->rGPIOKCON0;
uConValue &= ~(0xffff<<16);
uConValue |= 0x1111<<16;
GPIO->rGPIOKCON0 = uConValue;
}


/*
 *   跑馬燈的實現函數
 * @ 通過控制連接LED的管腳的輸出電平點亮和熄滅各個LED。
 * @ 逐個循環點亮各個LED。在每點亮一個後保持一定時間再熄滅它,接著
 * 點亮下一個LED,這樣就形成了一個跑馬燈的效果。
 * @ 這是一個需要改善的跑馬燈程序,想想怎麼優化這段代碼。
 * */
void LedRun(void)
{
    GPIO->rGPIOKDAT |= LEDALL_OFF;
    while(1)
{
GPIO->rGPIOKDAT &= LED1_ON;
delay(1000);
GPIO->rGPIOKDAT |= LEDALL_OFF;


GPIO->rGPIOKDAT &= LED2_ON;
delay(1000);
GPIO->rGPIOKDAT |= LEDALL_OFF;


GPIO->rGPIOKDAT &= LED3_ON;
delay(1000);
GPIO->rGPIOKDAT |= LEDALL_OFF;


GPIO->rGPIOKDAT &= LED4_ON;
delay(1000);
GPIO->rGPIOKDAT |= LEDALL_OFF;
    }
}

Copyright © Linux教程網 All Rights Reserved