本文提供基于Texas Instruments 公司开发的Tiva C Series的系统板 ––—- TM4C123GH6PM ,以及DY - Tiva - PB v3.0 的拓展板实现呼吸灯算法。
核心思路是通过循环调整亮灭的时间,总时间一定,使灭的时间与亮的时间成反比
int i = 0, j = 0, flag = 0;
int m = 180, n = 180, t = 180, q = 180;
//设置系统时钟为50MHz
SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN |
SYSCTL_XTAL_16MHZ);
// 端口GPIO F使能,F0引脚解锁NMI功能
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); // 使能 GPIO F模块
HWREG(GPIO_PORTF_BASE + GPIO_O_LOCK) = GPIO_LOCK_KEY; // 开锁 PORT F
HWREG(GPIO_PORTF_BASE + GPIO_O_CR) |= GPIO_PIN_0; // 解锁 F0 引脚
HWREG(GPIO_PORTF_BASE + GPIO_O_LOCK) = 0; // 重新上锁
// 设置GPIO方向
GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_0); // PF0设置为输出
GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_0,1<<0); // 蓝LED灯初始态:灭
// 设置PA4为输出
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); // 使能 GPIO A模块
GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE, GPIO_PIN_4); // PA4设置为输出
GPIOPinWrite(GPIO_PORTA_BASE,GPIO_PIN_4,1<<4); // 绿LED灯初始态:灭
// 设置PD6为输出
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD); // 使能 GPIO D模块
GPIOPinTypeGPIOOutput(GPIO_PORTD_BASE, GPIO_PIN_6); // PD6设置为输出
GPIOPinWrite(GPIO_PORTD_BASE,GPIO_PIN_6,1<<6); // 红LED灯初始态:灭
//
while(1) // 死循环,main函数没有结束
{
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_0, 0 << 0); // 蓝色LED灯:亮
for(i = m; i > 0; i--) for(j = m; j > 0; j--); // 软件延时
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_0, 1 << 0); // 蓝色LED灯:灭
for(i = q - m; i > 0; i--) for(j = q - m; j > 0; j--); // 软件延时
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4, 0 << 4); // 绿色LED灯:亮
for(i = m; i > 0; i--) for(j = m; j > 0; j--); // 软件延时
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4, 1 << 4); // 绿色LED灯:灭
for(i = n - m; i > 0; i--) for(j = n - m; j > 0; j--); // 软件延时
GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_6, 0 << 6); // 红色LED灯:亮
for(i = m; i > 0; i--) for(j = m; j > 0; j--); // 软件延时
GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_6, 1 << 6); // 红色LED灯:灭
for(i = t - m; i > 0; i--) for(j = t - m; j > 0; j--); // 软件延时
if((m == 0) && (flag == 0))
flag = 1;
if(!flag)
m--;
else
{
if(m < n)
m++;
else
flag = 0;
}
}