一、电路原理图
从图中可知,各LED是逢GPIO口为0,即低电平时亮,为1,即高电平时灭,呈反逻辑。由于四灯接至引脚号连续的GPIOA口的PIN2~PIN5,因此,可以方便地一次性控制四灯的工作状态。因此,首先定义LEDs为四个引脚的组合,代码如下:
#define LEDs GPIO_PIN_5 | GPIO_PIN_4 | GPIO_PIN_3 | GPIO_PIN_2
控制代码如下:
GPIOPinWrite(GPIO_PORTA_BASE, LEDs, temp<<2);
此处,temp左移2位,是使得temp的低四位可以对齐至PIN5,PIN4,PIN3,PIN2。
二、功能要求
(1)闪灭时间1s;
(2)起始状态LED3、LED4、LED5、LED6全灭;
(3)走马灯流程。
a.LED3亮(其他三灯灭)->LED4亮(其他三灯灭)->
LED5亮(其他三灯灭)->LED6亮(其他三灯灭)
b.四灯由灭到亮,由亮到灭闪烁4次
c.LED6亮(其他三灯灭)->LED5亮(其他三灯灭)->
LED4亮(其他三灯灭)->LED3亮(其他三灯灭)
d.继续流程b
如若定义状态编码如下:
LED6 |
LED5 |
LED4 |
LED3 |
MSB(0,灭;1,亮) |
(0,灭;1,亮) |
(0,灭;1,亮) |
(0,灭;1,亮)LSB |
例如:状态——LED6灭,LED5灭,LED灭,LED3亮,对应编码0001。
则每秒的状态如下所示:
三、功能实现
3.1 使用查询方式
从功能要求中,可以看到,此走马灯可以分为三种基本状态:
-
LED点亮顺序由小到大(即LED3->LED4->…………)
-
四灯同闪4次
-
LED点亮顺序由大到小(即LED6->LED5->…………)
因此设计三个函数完成以上3项功能:
3.1.1 ShiftUp
void ShiftUp()
{
int i = 0;
unsigned char temp = 0;
for(i = 0; i <=3; i++){
GPIOPinWrite(GPIO_PORTA_BASE, LEDs, temp<<2);
SysCtlDelay(1000* (TheSysClock / 3000)); // 延时约1s
}
}
3.1.2 ShiftDown
void ShiftDown()
{
int i = 0; </