LED驱动程序
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;
}
}
评论暂时关闭