材料:树莓派2 b
面包板
跳线
4位共阳数码管
4位共阳数码管的引脚图:
(主要关注数字编号1-12的顺序,以及数字编号对应的字母编号的位置,即哪段led亮哪段灭搞清楚,DP就是小数点啦);
派2的40pin引脚图:
(使用 gpio readall 命令获得,依赖wiringPi库,安装方法查百度,主要看的是wPi的引脚编号)
软件方面我采用的是wiringPi C库(下文有完整源码);
根据以上的两张截图就可以连接硬件了:
数码管和树莓派的连线对应关系如下:
数码管段数字编号 -》数码管段字母编号 -》小派wPi引脚编号
1 ——》E——》21
2——》D——》22
3——》DP——》23
4——》C——》24
5——》G——》25
7——》B——》0
10——》F——》2
11——》A——》3
(共阳端口的链接)
数码管数字编号 -》wPi引脚编号
6——》26
8——》27
9——》28
12——》29
连接完上图一张,凑合着看吧:
连完所有的线,启动树莓派,写程序:
首先你要安装wiringPi开发库环境,百度一搜就会了,这里略过。
下面是源码:
居然不能回复可见,还是算了 (⊙o⊙)…
- // 4位共阳数码管驱动程序
- // 文件:led4display.c
- // 作者:Jason
- // Q1165175299 欢迎交流学习
- #include <wiringPi.h>
- #include <stdlib.h>
- #include <stdio.h>
- #include <time.h>
- // 数值0-9对应的7段控制信号
- // 由于共阳,1表示熄灭该段,0表示点亮该段
- // 数组第二维0-6分别表示7段的A-G
- const int value[10][7] = {
- { 0,0,0,0,0,0,1 }, //0
- { 1,0,0,1,1,1,1 }, //1
- { 0,0,1,0,0,1,0 }, //2
- { 0,0,0,0,1,1,0 }, //3
- { 1,0,0,1,1,0,0 }, //4
- { 0,1,0,0,1,0,0 }, //5
- { 0,1,0,0,0,0,0 }, //6
- { 0,0,0,1,1,1,1 }, //7
- { 0,0,0,0,0,0,0 }, //8
- { 0,0,0,0,1,0,0 } //9
- };
- // 7个段的wPi GPIO引脚映射
- // 下标0-6表示段A-G,元素分别表示A-G的wPi引脚编号
- // 实际硬件连线就按这个关系连接
- const int pin[7] = { 3,0,24,22,21,2,25 };
- // 4个共阳端的引脚映射
- // 0-3分别表示从左往右4个数字位
- // 数码管引脚6,8,9,12分别对应wPi引脚26,27,28,29
- const int com[4] = { 29,28,27,26 };
- // 数码管的小数点wPi引脚号
- const int pin_dot = 23;
- // 函数头定义
- char *get_system_time(void);
- // usage: led4display [number] [dots]
- // example: led4display 1234 1011
- // 主函数无错误检测,参数1、2必须都是4位数字
- int main(int argc, char *argv[])
- {
- char *num = NULL, dots[] = "1011";
- int i = 0, init = 0, seg = 0; // seg为7个段
- int count = 0, delay_time = 5;
- /*
- if (argc != 3) {
- printf("usage: led4display [4 nums] [4 dots]\n");
- printf("4 nums like 1234 to display number 1234\n");
- printf("4 dots like 1011, dot form left to right means off-on-off-off\n");
- exit(1);
- }
- */
- if (wiringPiSetup() == -1) {
- printf("wPi init fail\n");
- exit(2);
- }
- /*
- num = argv[1];
- dots = argv[2];
- */
- num = get_system_time();
- //dots = "1011"
- // initalize for all pins OUTPUT
- for (init = 0; init < 7; init++) {
- pinMode(pin[init], OUTPUT);
- }
- for (init = 0; init < 4; init++) {
- pinMode(com[init], OUTPUT);
- }
- pinMode(pin_dot, OUTPUT);
- while (1){
- // display
- for (i = 0; i < 4; i++) {
- // every 20s to get sys time
- if (count % (20000/delay_time) == 0){
- num = get_system_time();
- count = 0;
- }
- // firstly, empty 4 numbers
- for (seg = 0; seg < 7; seg++) {
- digitalWrite(pin[seg], HIGH);
- }
- digitalWrite(pin_dot, dots[i] - 48);
- // 打开第i个数码管的共阳端
- digitalWrite(com[i], HIGH);
- for (seg = 0; seg < 7; seg++) {
- // 打开数码管的段, 减48,把字符转换成数值(ASCII编码)
- digitalWrite(pin[seg], value[num[i] - 48][seg]);
- }
- // 打开数码管的小数点
- digitalWrite(pin_dot, dots[i] - 48);
- // 显示完一个数字后关闭显示
- delay(delay_time);
- count++;
- digitalWrite(com[i], LOW);
- }
- }
- return 0;
- }
- // get time
- char *get_system_time(void)
- {
- static char timestr[20];
- time_t t;
- struct tm *nowtime;
- time(&t);
- nowtime = localtime(&t);
- strftime(timestr, sizeof(timestr), "%H%M", nowtime);
- return timestr;
- }
复制代码
源码写好保存,开始编译,一条命令搞定了:
gcc -Wall -I/usr/local/include -L/usr/local/lib -lwiringPi -o led4display led4display.c
// 编译参数你可以 man 去查看,简单说下,-Wall显示所有警告,-I、-L分别指定了包含文件和库,-lwiringPi 这个很重要一定要加
运行啦:
看了下运行起来不会闪,程序cpu负载小于1%,应该可以了。
|