Arduino 驱动4位数码管

从淘宝买了个4位数码管模块核心部件是两片74HC595做了级联, 宝贝特点: 1.采用2片595驱动数码管,需要单片机3路IO口,根据数码管动态扫描原理进行显示; 2.宽工作电压3.3V到5V; 3.PCB板尺寸:40mm*22mm 4.数码管型号:0.36 4位共阳

虽然卖家给了一个Arduino的实验例程,查看源代码发现商家写的程序有点笨重,所以自己研究了一个写法 过程就不多说了,直接上结论。在某个位置上显示某个值的代码为:

digitalWrite(RCLK, LOW);
shiftOut(DIO, SCLK, MSBFIRST, 数字);
shiftOut(DIO, SCLK, MSBFIRST, 位置);
digitalWrite(RCLK, HIGH);

因为是两片74HC595做级联,所以相当于变成了16位的移位寄存。其中,前8位用来显示7段码(和小数点),后8位用来指示由哪个位置上的数码单元显示。

DIO相当于位输入,RCLK相当于各位输入确认的时钟,SCLK相当于整体输入确认的时钟。

对于每个数码单元,a-g的排列是:8字中间那一横是a,然后从左上那一竖开始顺时针画圈数,分别是b-g。DIO输入次序是:第一位是小数点,第二位到第八位是a-g。需要亮的段写0,反之则写1(因为是共阳极)。 所以0-F,-,. 18个数字的值是:

byte num[] = {
  // 0   1     2      3     4     5    6      7     8     9    A     b     C     d     E     F     -    .
  0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x8C, 0xBF, 0xC6, 0xA1, 0x86, 0xFF, 0xbf, 0x7f
};

对于位选,规律是:从左到右,选中第一位的代码是 B00000001,第二位是B00000010,以此类推。所以位置代码为:

byte pos[4] = {0x01, 0x2, 0x4, 0x8};

有了这些基础,剩下的就好办了,顺便写了个数字显示函数:

#define SCLK 2 //串行时钟引脚定义
#define RCLK 3 //接收时钟引脚定义
#define DIO 4 //数据引脚定义

byte num[] = {
  // 0   1     2      3     4     5    6      7     8     9    A     b     C     d     E     F     -    .
  0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x8C, 0xBF, 0xC6, 0xA1, 0x86, 0xFF, 0xbf, 0x7f
};

byte pos[4] = {0x01, 0x2, 0x4, 0x8};
unsigned int thousand_bit, hundred_bit, ten_bit, singal_bit;

void setup() {
  // put your setup code here, to run once:
  pinMode(RCLK, OUTPUT);
  pinMode(SCLK, OUTPUT);
  pinMode(DIO, OUTPUT);

}

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

void displayNumber(unsigned int number)
{
  thousand_bit = number / 1000;
  hundred_bit = (number % 1000) / 100;
  ten_bit = (number % 1000 % 100) / 10;
  singal_bit = number % 10;
  digitalWrite(RCLK, LOW);
  shiftOut(DIO, SCLK, MSBFIRST, num[thousand_bit]);
  shiftOut(DIO, SCLK, MSBFIRST, pos[3]);
  digitalWrite(RCLK, HIGH);

  digitalWrite(RCLK, LOW);
  shiftOut(DIO, SCLK, MSBFIRST, num[hundred_bit]);
  shiftOut(DIO, SCLK, MSBFIRST, pos[2]);
  digitalWrite(RCLK, HIGH);

  digitalWrite(RCLK, LOW);
  shiftOut(DIO, SCLK, MSBFIRST, num[ten_bit]);
  shiftOut(DIO, SCLK, MSBFIRST, pos[1]);
  digitalWrite(RCLK, HIGH);

  digitalWrite(RCLK, LOW);
  shiftOut(DIO, SCLK, MSBFIRST, num[singal_bit]);
  shiftOut(DIO, SCLK, MSBFIRST, pos[0]);
  digitalWrite(RCLK, HIGH);
}

上传显示效果:

文档信息

版权声明:可自由转载(请注明转载出处)-非商用-非衍生

发表时间:2021年12月29日 17:15