arduino使用74HC595控制1位共阳数码管

本文介绍了一种使用74HC595移位寄存器芯片驱动共阳极数码管的方法,并提供了一个Arduino代码示例。该程序能够通过串口接收0至9的数字指令,并在数码管上显示相应的数字。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

74HC595的Q0~Q7依次接上数码管的dp,a,b,c,d,e,f,g

数码管的GND和OE接地,Vcc接5V,共阳数码管公共脚接了个1K电阻。

以下代码实现从串口监视器中输入0至9的数字,让数码管显示出对应的数字。
unsigned char number[10] = {  //共阳
  B10000000, // 0
  B11110010, // 1
  B01001000, // 2
  B01100000, // 3
  B00110010, // 4
  B00100100, // 5
  B00000100, // 6
  B11110000, // 7
  B00000000, // 8
  B00100000 // 9
};
const byte Pin_DS = 11;   //data
const byte Pin_ST_CP = 12;  //latch
const byte Pin_SH_CP = 13; //clock
char Buff[1];

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);

  pinMode(Pin_ST_CP, OUTPUT);//ST_CP
  pinMode(Pin_DS, OUTPUT);//DS
  pinMode(Pin_SH_CP, OUTPUT);//SH_CP
  digitalWrite(Pin_DS, LOW);
}

void loop() {
  // put your main code here, to run repeatedly:

  if (Serial.available())
  {
    Serial.readBytes(Buff, sizeof(Buff));
    int comInt = charToInt();
    digitalWrite(Pin_ST_CP, LOW); //将ST_CP口上面加低电平让芯片准备好接收数据
    shiftOut(Pin_DS, Pin_SH_CP, MSBFIRST, number[comInt]);//串行数据输出,高位在先 MSBFIRST  LSBFIRST
    digitalWrite(Pin_ST_CP, HIGH); //将ST_CP这个针脚恢复到高电平
    delay(1000);
  }
}


int charToInt() //charToInt()(定义)
{
  int tmp = 0;
  for (int i = 0; i < 1; i++)
  {
    tmp = tmp * 10 + (Buff[i] - 48);
  }
  return tmp;
}

<think>我们根据用户需求查找使用Arduino74HC595驱动数码管显示数字1-9的示例代码。参考了站内引用[2]和[3]的相关内容,特别是引用[2]提供了74HC595引脚设置和串口初始化的代码,引用[3]则提供了74HC595驱动8个数码管的原理和资源链接。我们将给出一个简单的示例,用于驱动一数码管(或通过适当的连接驱动多中的一)循环显示数字1-9。注意:如果使用数码管,则只需要一个74HC595(或使用多个但只控制),如果是多则需要考虑动态扫描,但用户只要求显示1-9,我们可以默认使用数码管或者控制中的一(固定一)。由于用户没有指定数码管阴还是,我们这里以数码管为例。注意:如果实际使用数码管不同,段码(即显示每个数字对应的字节)需要调整。74HC595引脚连接:-DS(数据输入)连接到Arduino的某个数字引脚(例如11)-SH_CP(移寄存器时钟输入)连接到Arduino的某个数字引脚(例如12)-ST_CP(存储寄存器时钟输入)连接到Arduino的某个数字引脚(例如10)数码管段选连接:-数码管:公端接地,74HC595的输出通过限流电阻连接到数码管的各个段(a~g,dp)。我们预先定义显示数字0-9的段码(数码管)。注意:这里我们使用一个字节(8)来表示段码,其中每一对应74HC595的一个输出引脚(通常顺序是Q0到Q7),而数码管的段一般连接顺序可能不同,这里假设我们连接的顺序是Q0~Q7分别对应段a,b,c,d,e,f,g,dp(注意:实际硬件连接可能不同,请根据实际接线调整段码表)。常见数码管段码表(按照上述连接顺序:a=Q0,b=Q1,...g=Q6,dp=Q7):0:0x3F//00111111->abcdef亮,g和dp灭1:0x06//00000110->bc亮,其他灭2:0x5B//010110113:0x4F//010011114:0x66//011001105:0x6D//011011016:0x7D//011111017:0x07//000001118:0x7F//011111119:0x6F//01101111注意:如果实际硬件连接顺序不同,需要重新排列这个表。代码步骤:1.定义连接引脚。2.在setup中初始化引脚为输出。3.定义0-9的段码数组。4.在loop中循环将1-9的段码发送到74HC595,并设置一定的延时。示例代码:```arduino//引脚定义constintlatchPin=10;//ST_CP连接到Arduino10constintclkPin=12;//SH_CP连接到Arduino12constintdataPin=11;//DS连接到Arduino11//数码管段码(0-9),这里按照连接Q0~Q7分别对应数码管的a,b,c,d,e,f,g,dpbytesegmentDigits[10]={0x3F,//00x06,//10x5B,//20x4F,//30x66,//40x6D,//50x7D,//60x07,//70x7F,//80x6F//9};voidsetup(){//设置控制引脚为输出pinMode(latchPin,OUTPUT);pinMode(clkPin,OUTPUT);pinMode(dataPin,OUTPUT);}voidloop(){for(intdigit=1;digit<=9;digit++){//循环显示1-9//输出段码digitalWrite(latchPin,LOW);//将锁存引脚拉低,准备传输数据shiftOut(dataPin,clkPin,MSBFIRST,segmentDigits[digit]);//发送段码(注意:这里发送一,所以只用了segmentDigits[digit])digitalWrite(latchPin,HIGH);//锁存引脚拉高,更新输出delay(1000);//延时1秒}}```注意:以上代码只适用于驱动一数码管。如果使用数码管,通常需要控制控制哪一亮),但用户要求比较简单,这里只考虑一。另外,如果使用74HC595连接的是多数码管的段选(多阴极或数码管),而选由另一个74HC595或者直接由Arduino控制,那么代码会更复杂。但是用户要求是显示1-9,我们可以认为用户可能只需要一显示。如果用户需要驱动多数码管并且动态扫描,请参考引用[3]中的资源(包含原理图和程序),但用户要求只是示例代码显示1-9,所以提供一的简单示例。引用说明:-引脚定义和初始化参考了引用[2]中的设置,但将引脚设置为10,11,12(引用2中并未给出具体数字,所以我们按照常见方式定义)。-关于74HC595的驱动,我们使用Arduino内置的shiftOut函数,该函数一次可以发送一个字节(8)数据到移寄存器。[^1]:参考了引用[1]中的仿真验证思想,可以在Proteus中仿真此代码。[^2]:引用[2]提供了74HC595控制引脚的初始化方法,我们参考了该设置。[^3]:引用[3]提供了74HC595驱动多数码管的资源链接,可用于进一步学习多驱动。如果用户需要更详细的多数码管驱动,可以查看引用[3]中提供的项目地址。§§相关问题§§1.如何修改代码以驱动数码管?2.如何同时驱动多数码管显示不同数字?3.如何使用Proteus进行Arduino74HC595的仿真?</think> 以下是使用Arduino74HC595驱动数码管显示数字1-9的示例代码,结合引用资料进行了关键点优化: ```arduino // 引脚定义(引用[2]) const int latchPin = 8; // ST_CP (存储寄存器时钟) const int clkPin = 12; // SH_CP (移寄存器时钟) const int dtPin = 11; // DS (串行数据输入) // 数码管段码 (0-9) byte digits[10] = { B00111111, // 0 B00000110, // 1 B01011011, // 2 B01001111, // 3 B01100110, // 4 B01101101, // 5 B01111101, // 6 B00000111, // 7 B01111111, // 8 B01101111 // 9 }; void setup() { // 引脚初始化 (引用[2]) pinMode(latchPin, OUTPUT); pinMode(clkPin, OUTPUT); pinMode(dtPin, OUTPUT); } void loop() { for(int num = 1; num <= 9; num++) { // 显示1-9 // 锁存引脚拉低(准备接收数据) digitalWrite(latchPin, LOW); // 发送段码数据 shiftOut(dtPin, clkPin, MSBFIRST, digits[num]); // 锁存引脚拉高(输出数据到数码管) digitalWrite(latchPin, HIGH); // 每个数字显示1秒 delay(1000); } } ``` ### 关键说明: 1. **硬件连接要求**: - 74HC595的DS(Q7) → 数码管段引脚(需加限流电阻) - 数码管端接地(阴极)[^3] - VCC接5V电源,GND接地 2. **工作原理**: - 通过`shiftOut()`函数串行发送段码数据 - 每个数字对应7段码+1小数点(Bxxxxxxxx格式) - 每发送完一个段码,锁存信号更新显示[^2] 3. **定制建议**: ```arduino // 若使用数码管,反转段码: byte digits = { B11000000, B11111001... }; // 动态扫描多数码管时添加控制 ``` > 提示:参考[^3]中的原理图资源(https://gitcode.com/open-source-toolkit/25dc3)可获取更详细的电路连接图。使用Proteus仿真时需注意电源和接地配置[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

源码资源下载

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值