发光二极管
这一类的程序主要是学习 BF592 的 IO 输出功能。
硬件原理图
RP2:排阻 10K,J18:8pin 的排针,R57~R64:限流电阻 1K,用于连接 BF592 的 GPIO 口,LED 所有的例子程序,都需要将该插针通过杜邦线连接到 BF592 的 PG0~PG7 端口上。
J18 端低电平时 LED 点亮,高电平时 LED 熄灭。
此实验之前首先需要了解 BF592 GPIO 端口原理。
GPIO 接口功能介绍:
BF592 处理器上有 32 个 General Purpose Input Output 接口,简称 GPIO 接口,这些接口就是通常
的 IO 接口,通过寄存器配置,可以配置成特殊功能脚,也可以配置成输出电平和感知接口电平,每一个 GPIO 接口都可以作为外部中断接口。
在单片机上,通常如果设置一个 IO 接口输出时,直接将输出信号值赋给该接口,如果作为输入时,直接通过该接口读取即可。BF592 处理器的 IO 接口使用与单片机不同,在使用前必须通过程序对该接口进行初始化,初始化接口的功能、方向,初始化完成后,才能使用 IO 接口。如配置为输出接口,则直接配置输出接口电平信号(控制灯亮灭、继电器吸合释放、喇叭发声等),如配置为输入接口,需打开输入使能开关,配置输出信号触发方式,是否中断触发,是否双极性触发等等(如按键信号输入、红外波形输入、开关信号输入等)。
GPIO 接口寄存器说明:
PORTG 接口主要寄存器功能与使用方法:
PORTF 接口主要寄存器功能与使用方法:
IO 输出点亮 1 个 LED 灯方法一
程序功能:
这个例子程序主要是学习,如何将 BF592 管脚配置成 GPIO 口,然后如何将 GPIO 口配置成输出口,如何使用 IO 的数据寄存器(PORTGIO)让对应的 IO 口输出高低电平。
下载程序后,可以看到连接在 PG0 口的 LED 灯不停的闪烁,其它 LED 熄灭。
知识要点及提问:
-
#define LED0 PG0,这是一个宏定义,以后只要使用到PG0的地方都可以用LED0替换,这样增
强了程序的可读性,PG0是在头文件defBF59x_base.h中定义的,PG0 = 0x0001。 -
该程序对 IO 口操作使用的是直接对这个 IO 对应的数据寄存器进行操作的。
-
程序中对 IO 口操作一般都是用与非(&~)或者或(| )操作,这样的好处是在对一个寄存器某一位操作的时候不会影响到其它的位,在以后的程序集成中有很大的用处,如:
*pPORTGIO &= ~LED0; 只让 PORTG 端口的 PG0 变低,其它的位保持不变
*pPORTGIO |= LED0; 只让 PORTG 端口的 PG0 变高,其它的位保持不变
-
在这个工程中,我们看到有三个程序文件“cpu.c,cpu.h,main.c”,当然,我们也可以把这三个文件合并成一个文件,但是那样会让程序变的很乱,所以我们一般将同一类的函数都放到一个文件中,然后建立一个相同文件名的.h的头文件,把函数都在头文件里声明一下,然后在需要使用的地方把这个头文件包含进去,就比如图中#include “cpu.h”,在同一个工程下,#include之后包含的文件只要加双引号就可以了。
-
学习者可以修改成让其它LED灯闪烁的程序。
IO 输出点亮 1 个 LED 灯方法二
这个例子程序主要是学习,如何将 BF592 管脚配置成 GPIO 口,然后如何将 GPIO 口配置成输出口,如何使用 IO 的 PORTGIO_SET 和 PORTGIO_CLEAR 寄存器让对应的 IO 口输出高低电平。
下载程序后,可以看到连接在 PG0 口的 LED 灯不停的闪烁,其它 LED 熄灭。
知识要点及提问:
- 该程序对 IO 口操作使用的是 PORTGIO_SET 和 PORTGIO_CLEAR 寄存器进行操作的,这两个
寄存器都是只写的,不可读,所以不可以用“与非”或者“或”对 IO 进行操作。
PORTGIO_SET 这个寄存器是对哪一个 IO 位写 1,哪个 IO 口输出 1,写 0 没有效果,即对应的IO 口还是保留原来的状态。
PORTGIO_CLEAR 这个寄存器是对哪一个 IO 位写 1,哪个 IO 口输出 0,写 0 没有效果,即对应的 IO 口还是保留原来的状态。
*pPORTGIO_CLEAR = LED0; 只让 PORTG 端口的 PG0 变低,其它的位保持不变
*pPORTGIO_SET = LED0; 只让 PORTG 端口的 PG0 变高,其它的位保持不变
- 学习者可以修改成让其它LED灯闪烁的程序。
IO 输出点亮多个 LED 灯方法一
这个例子程序主要是学习,如何将 BF592 的多个管脚配置成 GPIO 口,然后如何将这些 GPIO口配置成输出口,如何使用 IO 的数据寄存器(PORTGIO)让对应的 IO 口输出高低电平。
下载程序后,可以看到连接在 PG0,PG2,PG4,PG6 口的 LED 灯不停的闪烁,其它 LED 熄灭。
知识要点及提问:
-
要想对应的哪个灯亮,只需要将相应的 IO 对应位并进去然后做“与非”或者“或”操作就行了。
-
还有一种方法也可以实现相同的功能
*pPORTGIO &= ~(LED0 | LED2 | LED4 | LED6 );更换成
*pPORTGIO |=0xFF; *pPORTGIO &= 0xaa;
pPORTGIO |= LED0 | LED2 | LED4 | LED6 ;更换成pPORTGIO |= 0x55;
- 学习者可以修改成让第2、4、4、6、8个LED灯闪烁的程序
IO 输出点亮多个 LED 灯方法二
这个例子程序主要是学习,如何将 BF592 的多个管脚配置成 GPIO 口,然后如何将这些 GPIO 口配置成输出口,如何使用 IO 的 PORTGIO_SET 和 PORTGIO_CLEAR 寄存器让对应的 IO 口输出高低电平。
下载程序后,可以看到连接在 PG0,PG2,PG4,PG6 口的 LED 灯不停的闪烁,其它 LED 熄灭
知识要点及提问:
1.还有一种方法也可以实现相同的功能
*pPORTGIO_CLEAR = LED0 | LED2 | LED4 | LED6;更换成
*pPORTGIO_CLEAR = 0x55;
*pPORTGIO_SET = LED0 | LED2 | LED4 | LED6 ;更换成
*pPORTGIO_SET = 0x55;
2.学习者可以修改成让第 2、4、4、6、8 个 LED 灯闪烁的程序
LED 灯循环左右移显示
这个例子程序主要是学习,如何将 BF592 的多个管脚配置成 GPIO 口,然后如何将这些 GPIO 口配置成输出口,如何使用 IO 的 PORTGIO_SET 和 PORTGIO_CLEAR 寄存器让对应的 IO 口输出高低电平,实现左右移位操作
下载程序后,可以看到连接在 PG0~PG7 口的 LED 灯不停的左右循环显示。
知识要点及提问:
-
前面我们学习了使用 IO 的数据寄存器(PORTGIO)让对应的 IO 口输出高低电平,学习者可以根据上面的例子,修改成通过数据寄存器(PORTGIO)操作来实现同样的功能
-
学习者可以修改成一个 LED 灯亮的左右循环程序。
LED 灯花样显示
这个例子程序主要是学习,如何将 BF592 的多个管脚配置成 GPIO 口,然后如何将这些 GPIO口配置成输出口,使用 IO 的数据寄存器(PORTGIO)让对应的 IO 口输出高低电平,寄存器移位操作,如何把指定的数据送到 IO 端口中输出。
下载程序后,可以看到连接在 PG0~PG7 口的 LED 灯花样显示。
知识要点及提问:
学习者使用 IO 的 PORTGIO_SET 和 PORTGIO_CLEAR 寄存器来实现同样的功能的程序。
LED 灯 PWN 调光
这个例子程序主要是学习,如何将 BF592 的多个管脚配置成 GPIO 口,然后如何将这些 GPIO口配置成输出口,使用 IO 的数据寄存器(PORTGIO)让对应的 IO 口输出高低电平,学习如何实现IO 口控制。
下载程序后,可以看到连接在 PG0~PG7 口的 LED 灯渐亮渐灭。
知识要点及提问:
学习者可以修改程序,实现前面四个灯和后面四个灯亮灭相反。