树莓派进阶之路 (016) - 通过595驱动4位LED显示系统时间

模块图片,4位共阳极数码管.

我们使用树莓派wiringPi的库来通过74HC595驱动4位数码管:

C 代码如下:

 1 #include <wiringPi.h>
 2 #include <stdio.h>
 3 #include <stdlib.h>
 4 #include <stdint.h>
 5 #include <time.h>
 6 #define SCLK 12
 7 #define RCLK 13
 8 #define DIO 14
 9 unsigned int code_char[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
10 unsigned char code_segbit[]={0x01,0x02,0x04,0x08};
11 int pins[3]={SCLK,RCLK,DIO};
12 int init(){
13     int i=0;
14     for(i=0;i<3;i++){
15     pinMode(pins[i],OUTPUT);
16     digitalWrite(pins[i],LOW);
17     }
18 }
19
20 int destroy(){
21     int i=0;
22     for(i=0;i<3;i++){
23     digitalWrite(pins[i],LOW);
24     pinMode(pins[i],INPUT);
25     }
26 }
27
28 void loop(){
29     time_t rawtime;
30     time(&rawtime);
31     struct tm *timeinfo;
32     timeinfo=localtime(&rawtime);
33     digitalWrite(RCLK,LOW);
34     if(timeinfo->tm_min>=10)shiftOut(DIO,SCLK,1,code_char[timeinfo->tm_min%10]);//character
35     else shiftOut(DIO,SCLK,1,code_char[timeinfo->tm_min]);
36     shiftOut(DIO,SCLK,1,code_segbit[0]);//bit
37     digitalWrite(RCLK,HIGH);
38     digitalWrite(RCLK,LOW);
39     if(timeinfo->tm_min>=10)shiftOut(DIO,SCLK,1,code_char[timeinfo->tm_min/10]);//character
40     else shiftOut(DIO,SCLK,1,code_char[0]);
41     shiftOut(DIO,SCLK,1,code_segbit[1]);//bit
42     digitalWrite(RCLK,HIGH);
43     digitalWrite(RCLK,LOW);
44     if(timeinfo->tm_hour>=10)shiftOut(DIO,SCLK,1,code_char[timeinfo->tm_hour%10]);//character
45     else shiftOut(DIO,SCLK,1,code_char[timeinfo->tm_hour]);
46     shiftOut(DIO,SCLK,1,code_segbit[2]);//bit
47     digitalWrite(RCLK,HIGH);
48     digitalWrite(RCLK,LOW);
49     if(timeinfo->tm_hour>=10)shiftOut(DIO,SCLK,1,code_char[timeinfo->tm_hour/10]);//character
50     else shiftOut(DIO,SCLK,1,code_char[0]);
51     shiftOut(DIO,SCLK,1,code_segbit[3]);//bit
52     digitalWrite(RCLK,HIGH);
53     //printf("%d %d\t%d %d %d %d\n",
54     // timeinfo->tm_hour,timeinfo->tm_min,
55     // timeinfo->tm_hour/10,timeinfo->tm_hour%10,
56     // timeinfo->tm_min/10,timeinfo->tm_min%10);
57     delayMicroseconds(10);
58 }
59
60 int main(void){
61     if(wiringPiSetup()==-1) //wiringPiSetupGpio==BCM
62         exit(1);
63     init();
64     while(1) {
65         loop();
66     }
67     destroy();
68     return 0;
69 }

74HC595.h

 1 /*
 2  * wiringShift.h:
 3  *    Emulate some of the Arduino wiring functionality.
 4  *
 5  * Copyright (c) 2009-2012 Gordon Henderson.
 6  ***********************************************************************
 7  * This file is part of wiringPi:
 8  *    https://projects.drogon.net/raspberry-pi/wiringpi/
 9  *
10  *    wiringPi is free software: you can redistribute it and/or modify
11  *    it under the terms of the GNU Lesser General Public License as published by
12  *    the Free Software Foundation, either version 3 of the License, or
13  *    (at your option) any later version.
14  *
15  *    wiringPi is distributed in the hope that it will be useful,
16  *    but WITHOUT ANY WARRANTY; without even the implied warranty of
17  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  *    GNU Lesser General Public License for more details.
19  *
20  *    You should have received a copy of the GNU Lesser General Public License
21  *    along with wiringPi.  If not, see <http://www.gnu.org/licenses/>.
22  ***********************************************************************
23  */
24
25 #define    LSBFIRST    0
26 #define    MSBFIRST    1
27
28 #ifndef    _STDINT_H
29 # include <stdint.h>
30 #endif
31
32 #ifdef __cplusplus
33 extern "C" {
34 #endif
35
36 extern uint8_t shiftIn      (uint8_t dPin, uint8_t cPin, uint8_t order) ;
37 extern void    shiftOut     (uint8_t dPin, uint8_t cPin, uint8_t order, uint8_t val) ;
38
39 #ifdef __cplusplus
40 }
41 #endif

74HC595.C

 1 /*
 2  * wiringShift.c:
 3  *    Emulate some of the Arduino wiring functionality.
 4  *
 5  * Copyright (c) 2009-2012 Gordon Henderson.
 6  ***********************************************************************
 7  * This file is part of wiringPi:
 8  *    https://projects.drogon.net/raspberry-pi/wiringpi/
 9  *
10  *    wiringPi is free software: you can redistribute it and/or modify
11  *    it under the terms of the GNU Lesser General Public License as published by
12  *    the Free Software Foundation, either version 3 of the License, or
13  *    (at your option) any later version.
14  *
15  *    wiringPi is distributed in the hope that it will be useful,
16  *    but WITHOUT ANY WARRANTY; without even the implied warranty of
17  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  *    GNU Lesser General Public License for more details.
19  *
20  *    You should have received a copy of the GNU Lesser General Public License
21  *    along with wiringPi.  If not, see <http://www.gnu.org/licenses/>.
22  ***********************************************************************
23  */
24
25 #include <stdint.h>
26 #include "wiringPi.h"
27 #include "wiringShift.h"
28
29 /*
30  * shiftIn:
31  *    Shift data in from a clocked source
32  *********************************************************************************
33  */
34
35 uint8_t shiftIn (uint8_t dPin, uint8_t cPin, uint8_t order)
36 {
37   uint8_t value = 0 ;
38   int8_t  i ;
39
40   if (order == MSBFIRST)
41     for (i = 7 ; i >= 0 ; --i)
42     {
43       digitalWrite (cPin, HIGH) ;
44       value |= digitalRead (dPin) << i ;
45       digitalWrite (cPin, LOW) ;
46     }
47   else
48     for (i = 0 ; i < 8 ; ++i)
49     {
50       digitalWrite (cPin, HIGH) ;
51       value |= digitalRead (dPin) << i ;
52       digitalWrite (cPin, LOW) ;
53     }
54
55   return value;
56 }
57
58 /*
59  * shiftOut:
60  *    Shift data out to a clocked source
61  *********************************************************************************
62  */
63 void shiftOut (uint8_t dPin, uint8_t cPin, uint8_t order, uint8_t val)
64 {
65   int8_t i;
66   if (order == MSBFIRST)
67     for (i = 7 ; i >= 0 ; --i)
68     {
69       digitalWrite (dPin, val & (1 << i)) ;
70       digitalWrite (cPin, HIGH) ;
71       digitalWrite (cPin, LOW) ;
72     }
73   else
74     for (i = 0 ; i < 8 ; ++i)
75     {
76       digitalWrite (dPin, val & (1 << i)) ;
77       digitalWrite (cPin, HIGH) ;
78       digitalWrite (cPin, LOW) ;
79     }
80 }
时间: 2024-12-24 16:27:00

树莓派进阶之路 (016) - 通过595驱动4位LED显示系统时间的相关文章

树莓派进阶之路 (023) - Windows下用串行连接控制树莓派(转)

转载:http://shumeipai.nxez.com/2014/05/04/under-windows-serial-connection-control-raspberry-pi.html 在没有键盘鼠标显示器,没有任何网络设备,甚至连电源和 micro USB 数据线都没有的情况下.如何对树莓派进行操作,甚至安装配置树莓派呢? 如果你有一根USB转TTL串行的数据线,和一台电脑,那这一切都不是问题. 关于USB转TTL串行数据线 通常被称为刷机版.刷机线.中九升级线(一种卫星天线的升级线

树莓派进阶之路 (030) -Picustom.h(原创)

写代码的时候敢接每次查wiringPi库函数挺麻烦的,自己wiringPi库封装了一下: 1 #ifndef __PICUSTOM_H__ 2 #define __PICUSTOM_H__ 3 /**********************************头文件部分************************************/ 4 #include <stdlib.h> 5 #include <stdio.h> 6 #include <string.h&g

树莓派进阶之路 (028) - 树莓派SQLite3的安装

MySQL占用内存太大,而SQLite是一款轻量级零配置数据库,非常适合在树莓派和其他嵌入式系统中使用.SQLite文档详细资料丰富,本文不会详细解释SQLite数据库操作的方方面面,只能结合具体场景按需说明.本文介绍的SQLite技巧也可以在其他平台使用,并不局限于树莓派. 安装 SQLite 1 sudo apt-get update 2 sudo apt-get install sqlite sqlite3 3 #如果需要的话还可以顺便安装 PHP 相关组件 4 sudo apt-get

树莓派进阶之路 (024) - windows远程桌面连接树莓派通过xrdp服务(转)

本文转载:http://www.cnblogs.com/edgexie/p/6527992.html 在网上看到很多关于windows远程桌面连接树莓派的教程.我也按照教程试过了,遇到了几个坑.特意记录在这. 先说正确的步骤. 1. 必须先安装tightvncserver!!! sudo apt-get install tightvncserver 2. 再安装xrdp服务. sudo apt-get install xrdp 3. 如果开着防火墙ufw , 那么打开服务器上的远程桌面访问端口

树莓派进阶之路 (018) - 树莓派通过filezilla,samba与PC文件共享(转)

虽然我们可以很方便的通过ssh譬如putty或者vnc连接操控树莓派,但是毕竟树莓派资源没那么高,在上面编程,调试要吃力的多.所以还是想在pc上编程上传到树莓派或者最好,文件共享,可以直接读写共同的文件那就perfect! 一.filezilla 1,安装vsftpd服务器 (约400KB)sudo apt-get install vsftpd 2,启动ftp服务sudo service vsftpd start 3,编辑vsftdp的配置文件 sudo nano /etc/vsftpd.con

树莓派进阶之路 (017) - 基于树莓派的专用摄像头实时监控

环境: 硬件:树莓派三代B型, 5MP Camera Board Module 软件:Raspbian 安装树莓派摄像头模块 1.找到 CSI 接口(CSI接口在以太网接口旁边),掀起深色胶带. 2.拉起 CSI 接口挡板. 3.拿起你的摄像头模块,将贴在镜头上的塑料保护膜撕掉.确保黄色部分的PCB(有字的一面)是安装完美的(可以轻轻按一下黄色的部分来保证安装完美). 4.将排线插入CSI接口.记住,有蓝色胶带的一面应该面向以太网接口方向.同样,这时也确认一下排线安装好了之后,将挡板拉下. 在树

树莓派进阶之路 (012) - 关于Raspberry Pi树莓派无线网卡配置

Raspberry Pi树莓派无线网卡配置[多重方法备选] 要想让树莓派方便操作,肯定需要配置无线网卡,这样可以大大增强树莓派的移动性和便利性,其实配置无线网卡基本就是和普通linux平台下配置无线网卡一样,几种方法大同小异,具体如下: 一.第一种方法:通过配置 /etc/network/interfaces 文件实现sudo nano /etc/network/interfaces修改后文件内容如下:auto lo iface lo inet loopbackiface eth0 inet d

树莓派进阶之路 (031) -字符问题(1) - GBK汉字编码表(转)

转载:http://blog.sina.com.cn/s/blog_8184e033010109ug.html 基本简介 GB码,全称是GB2312-80<信息交换用汉字编码字符集基本集>,1980年发布,是中文信息处理的国家标准,在大陆及海外使用简体中文的地区(如新加坡等)是强制使用的唯一中文编码.P-Windows3.2和苹果OS就是以GB2312为基本汉字编码, Windows 95/98则以GBK为基本汉字编码.但兼容支持GB2312.GB码共收录6763个简体汉字.682个符号,其中

树莓派进阶之路 (033) - 开机启动自定义脚本

因为需求需要,树莓派开机需要自动运行一些代码和脚本,并且需要对网络是否正常进行监测,所以需要做带网络监测的自启动服务. 参考了一下文档: Linux开机启动程序详解 Linux中设置服务自启动的三种方式,linux服务的开机启动和运行级别,linux系统的7种运行级别,ubuntu下设置开机启动服务, Ubuntu15.x /CentOS 7.x 以后 设置开机启动,添加自定义系统服务,自定义开机启动, Ubuntu14.04设置开机启动脚本,如何添加自定义脚本到开机自启动,linux添加开机自