mbed OS编译级联74HC595控制4位数码管(STM32L432KC)含显示0~3和计时器

一、数码管种类

数码管一般分为共阴极和共阳极。

共阴极数码管在引脚处于高电平时显示,而共阳极反之。

对于单个数码管,共有abcdefg以及dp  8个引脚,若直接连接到微控制器上就会占用大量端口

而对于4个数码管来说,就需要32个引脚,这对于微控制器来说是不现实的。

所以这个时候就需要减少引脚的需求,用一个引脚来控制多个引脚。

74HC595就很好的满足了这一要求。

二、74HC595的结构

此次研究的是两个74HC595芯片级联下控制4个数码管。

图中第一个74HC595有五个外接端口,分别为VCC、SCLK、RCLK、DIO、GND。

VCC和GND分别连接到STM32L432KC的3V3和GND位置,而另外三个端口自由选择微控制器上的三个GPIO端口,也是此次单片机上的Digital pin

SCLK是移位寄存器时钟,在上升沿移位,可以看作在数据输入时,每给一个端口输入数据后,SCLK处上升沿移位至下一个端口,然后继续传输数据,相当于改变数据输入的端口;

RCLK是所存寄存器时钟,处于高电平时存储数据;

DIO是串行数据输入端,负责将数据输入至Q7~Q0,从高位到低位,Q7~Q0属于并行数据输入端;

第一个74HC595的QH‘将数据传至第二个74HC595的SER端口,继续将新的数据输入至第二个中的Q7~Q0;而第二个的QH’端口还可以继续级联第三个74HC595,这里就不详细讲述了。

三、如何控制4位数码管

要用两个芯片控制4个数码管,需要实现三个功能:

1、传输数据至正确端口,显示正常数字或字母;

2、选择正确的数码管;

3、存储数据;

  1. 由于我们已经知道数据是从高位到低位Q7~Q0依次输入的,因此使用8位二进制数进行位运算的操作便可将数据传入对应端口,这里需要注意的是这里的数码管是共阳极的,因此0是正常显示,1是不显示;
  2. 通过第一个芯片的内部结构可知,Q0~Q3对应着4个数码管. 通过位选,可以选择对应序列的数码管;
  3. 存储数据的操作可以直接构建函数用RCLK进行存储;

、代码展示

1. 显示0~3

在mbed OS中编码

#include "mbed.h"

DigitalOut dataPin(D5); // DIO
DigitalOut clockPin(D6); // SCLK
DigitalOut latchPin(D9); // RCLK

const uint8_t digits[10] = {
    0b11000000, // 0
    0b11111001, // 1
    0b10100100, // 2
    0b10110000, // 3
};

void senddata(uint8_t digit){   // input the data to Q7~Q0
    for(int i = 0;i<8;i++){
        dataPin=(digit & ( 1<<(7-i) )) ? 1:0;
        clockPin=1;
        clockPin=0;
    }
}


void storedata(uint8_t choice,uint8_t digit){ // store the data in the Nixie tube
    latchPin=0;
    senddata(digit);  //show the number on the tube
    senddata(1<<(choice)); //select the Nixie tube
    latchPin=1;
}
int main()
{
    while (true) {
        for(int n=0;n<4;n++){
            storedata(n,digits[3-n]);
            ThisThread::sleep_for(1ms);
        }
    }
}

2.计时器

#include "mbed.h"
#include <cstdint>
#include <cstdlib>
#include <stdlib.h>
#include <time.h>

DigitalOut dataPin(D5); // DIO
DigitalOut clockPin(D6); // SCLK
DigitalOut latchPin(D9); // RCLK


const uint8_t mychoice[4] = {
    0b00000001, // G 1
    0b00000010, // G 2
    0b00000100, // G 3
    0b00001000, // G 4
};
const uint8_t digits[10] = {
    0b11000000, // 0
    0b11111001, // 1
    0b10100100, // 2
    0b10110000, // 3
    0b10011001, // 4
    0b10010010, // 5
    0b10000010, // 6
    0b11111000, // 7 
    0b10000000, // 8
    0b10010000, // 9
};

void senddata(uint8_t digit,uint8_t choice){
    for(int i = 0;i<8;i++){
        dataPin=(digit & ( 1<<(7-i) )) ? 1:0;
        if(choice==mychoice[2]){
            if(i==0){
                dataPin=0;
            }
        }
        clockPin=1;
        clockPin=0;
    }
}
void storedata(uint8_t choice,uint8_t digit){
    latchPin=0;
    senddata(digit,choice);
    senddata(choice,choice);
    latchPin=1;
}
int main() {
    int second=0,minute=0;
    while (1) {
        time_t now;
        now = time(NULL);
        long int a;
        int sec1=second % 10;
        int sec2=second / 10;
        int min1=minute % 10;
        int min2=minute / 10;
        storedata(mychoice[0],digits[sec1]);
        wait_us(300);
        storedata(mychoice[1],digits[sec2]);
        wait_us(300);
        storedata(mychoice[2],digits[min1]);
        wait_us(300);
        storedata(mychoice[3],digits[min2]);
        wait_us(300);
        if(now == (a+1)){
            second++;
            if(second==60){
                second=0;
                minute++;
            }
            if(minute==60){
                minute=0;
            }
        }
        a=now;
    }
}

PS:这是小编在做实验时借鉴了各种前人的经验然后自行钻研出的有关mbed OS上如何使用这种4位数码管的心得,想让各位跟小编一样新接触mbed的新人能快速上手一个器件,不像自己曾经一样耗费几个夜晚才弄懂.

小编是第一次发布文章,如有错误还请指出,还望多多包涵,感谢各位的支持,希望能对各位有所帮助!

  • 21
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
接线: 首先将Arduino的VCC引脚连接到两个74HC595芯片的VCC引脚,并将GND引脚连接到两个74HC595芯片的GND引脚。 然后将Arduino的数字引脚2、3、4分别连接到74HC595芯片的SER、SRCLK、RCLK引脚,将74HC595芯片的Q0引脚连接到一个LED正极,LED负极连接到GND。将74HC595芯片的Q1引脚连接到另一个LED正极,LED负极连接到GND。 编程: 下面是一个简单的示例代码,用于控制两个74HC595级的LED灯。代码通过移位操作将数据从Arduino输出到74HC595,然后通过锁存操作将数据输出到LED灯。代码中使用了shiftOut()函数和digitalWrite()函数来控制74HC595芯片和LED灯。 ``` int latchPin = 4; // RCLK引脚 int clockPin = 3; // SRCLK引脚 int dataPin = 2; // SER引脚 void setup() { pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); } void loop() { // 将数据写入74HC595芯片 shiftOut(dataPin, clockPin, MSBFIRST, 0x01); // 控制第一个LED灯 shiftOut(dataPin, clockPin, MSBFIRST, 0x02); // 控制第二个LED灯 // 锁存数据到LED灯 digitalWrite(latchPin, HIGH); digitalWrite(latchPin, LOW); delay(1000); // 延迟1秒 } ``` 在上面的代码中,我们使用shiftOut()函数将数据从Arduino输出到74HC595芯片。shiftOut()函数的第一个参数是数据引脚,第二个参数是时钟引脚,第三个参数是比特序列中最高位的位数,第四个参数是要输出的数据。我们将0x01和0x02分别输出到两个74HC595芯片,以控制两个LED灯的状态。 然后,我们使用digitalWrite()函数将锁存引脚设置为高电平,将数据从74HC595芯片输出到LED灯。然后我们再将锁存引脚设置为低电平,以准备下一次数据的输出。 最后,我们使用delay()函数延迟1秒,以使LED灯的状态保持不变。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值