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

树莓派进阶之路 (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 = http://www.mamicode.com/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 }

 

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