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