【Arduino】8位LED数码管(3461BS)

淘宝买了一块3461BS的8位LED数码管,宝贝一到就迫不急待的想试试,结果一看文档,好家伙没有Arduino的测试程序。莫急~莫急~反正是串口操作,大不了瞎蒙呗!

以下两点是瞎蒙过程中比较有趣的两点:

1、需要了解什么是“上升沿”、“下降沿”,否则看参考代码(文档只提供51单片机的DEMO)会觉得很迷糊

2、如何显示小数点?这个文档中提都没提到,经研究发现每个字符(如0用0xC0表示)的最高位(即左数第一位)都是1(两进制表示),于是我试探性的将其与上0x7f(即0xC0 & 0X7F),结果惊喜的发现苦苦寻觅的小数点出现啦!

其它应该问题不大,直接贴出代码:

#include <string.h>

int DIO = 2;
int RCLK = 3;
int SCLK = 4;

unsigned char CHAR_MAP[] = { 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x8C, 0xBF, 0xC6, 0xA1, 0x86, 0xFF, 0xbf };
char CHAR_INDEX_MAP[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', '-' };

void ledout(unsigned char chr)
{
	unsigned char i;
	for (i = 8; i >= 1; i--)
	{
		if (chr & 0x80) digitalWrite(DIO, 1); else digitalWrite(DIO, 0);
		chr <<= 1;
		digitalWrite(SCLK, 0);
		digitalWrite(SCLK, 1);
	}
}

void ledshow(const char* str)
{
	int len = strlen(str);
	int hasDot = 0;
	for (int i = len - 1, m = 0; i >= 0; i--) {
		char chr = str[i];
		if (chr == '.') {
			hasDot = 1;
			continue;
		}
		int n = 0;
		for (; n < 17; n++) {
			if (chr == CHAR_INDEX_MAP[n])
				break;
		}
		if (n != 17) {
			unsigned char chr1 = CHAR_MAP[n];
			if (hasDot)
				chr1 &= 0x7f; // 所有字符的最高位(左数第一位)都是1,代表小数点为暗
							// 因此只要将最高位改为0小数点就可以点亮啦
			ledout(chr1); // 显示字符
			ledout((int)ceil(pow(2, m))); // 位置
			digitalWrite(RCLK, 0);
			digitalWrite(RCLK, 1);
		}

		m++;
		hasDot = 0;
	}
}

void setup()
{
	pinMode(DIO, OUTPUT);
	pinMode(RCLK, OUTPUT);
	pinMode(SCLK, OUTPUT);
}

void loop()
{
	ledshow("3.1415926");
}
时间: 2024-10-08 22:39:35

【Arduino】8位LED数码管(3461BS)的相关文章

【Arduino】8地点LED数码管(3461BS)

淘宝买了一块3461BS的8地点LED数码管,婴儿就迫不及待地尝试,结果看到了文件,好家伙无Arduino测试程序. 莫急~莫急~无论如何串行操作,大不了呗瞎蒙! 以下几点是在更有趣的点瞎蒙: 1.须要了解什么是"上升沿"."下降沿".否则看參考代码(文档仅仅提供51单片机的DEMO)会认为非常迷糊 2.怎样显示小数点?这个文档中提都没提到,经研究发现每一个字符(如0用0xC0表示)的最高位(即左数第一位)都是1(两进制表示).于是我试探性的将其与上0x7f(即0x

Arduino 翻译系列 - LED 灯闪烁

原文地址 - https://www.arduino.cc/en/Tutorial/Blink 闪烁 这个例子展示了你能拿 Arduino / Genuino 板子来干的最简单的事:使开发板上的 LED 灯闪烁. 硬件需求 Arduino 开发板 LED (非必要) 220欧电阻(非必要) 电路 这例程使用了大部分 Arduino / Genuino 开发板上都有的 LED 指示灯.这 LED 灯是连接到数字引脚的,而它在不同型号的开发板上的引脚号都不一样.为了方便大家,我们已经每种开发板的描述

单片机编程:让led数码管显示数字0到9

led数码管在单片机系统中应用非常普遍,是由发光二极管构成的.数码管由7个发光二极管组成的一个"日"字形,如果需要显示小数点,那么就再加上一个点,就是8段数码管. 数码管显示亮度高,相应速度快,分共阴极和共阳极两种形式,常用的有单个的和4联的,还有两联的和专门用来显示时间的. /*************************************************** *程序功能:点亮一个led数码管,让它显示数字从0到9 * *日期:2015.5.11 * *******

树莓派进阶之路 (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 un

arduino红外控制led(发射与接收)

网上有关红外接收的帖子不少,但是关于使用arduino自制红外发射器的帖子却很少,经过网上搜索和自己摸索,给大家发个有arduino自制红外发射器控制led亮灭的例子.关于本例我使用了两块arduino板,一块用于发射,一块用于接收. 一.红外发射(开发板一) 1 /* 2 * 发射红外线讯号 3 * 注意! 红外线发射器(IR LED)必须接到 pin 3, 不能接其它脚位,头文件已经定义,所以下面不用设置pin3口的状态 4 */ 5 #include <IRremote.h> // 引用

VK1650 LED数码显示驱动IC

VK1650 是一种带键盘扫描电路接口的 LED 驱动控制专用电路.内部集成有 MCU 输入输出控制数字 接口.数据锁存器.LED 驱动.键盘扫描.辉度调节等电路.本芯片性能稳定.质量可靠.抗干扰能力 强,可适应于 24 小时长期连续工作的应用场合. 功能特点 1.显示模式:8 段×4 位 2. 段驱动电流不小于 25mA,字驱动电流不小于 150mA 3. 提供 8 级亮度控制 4. 键盘扫描:7×4bit 5. 高速两线式串行接口 6. 内置时钟振荡电路 7. 内置上电复位电路 8. 支持

ATmega8仿真——LED 数码管的学习

1.I/O 口的结构及特点 Atmega8 有23 个I/O 引脚,分成3 个8 位的端口B.C 和D,其中C 口只有7 位 Atmega8 采用3个8位寄存器来控制I/O端口,它们分别是:方向寄存器DDRx.数据寄存器PORTx.输入引脚寄存器PINx x为B或C 或D,分别代表B口.C口或D 口: n为0~7,代表寄存器中的位置: 其中DDRx 和PORTx 是可读写寄存器,而PINx 为只读寄存器: 每个I/O引脚内部都有独立的上拉电阻电路,可通过程序设置内部上拉电阻是否有效. 方向寄存器

单片机裸奔框架1

侃侃单片机的裸奔程序的框架!以下是我总结的一些东西,不合乎之处来请大家指点呀,本人第二次在21ic发帖,希望大家鼓励鼓励呀!! 从07年参加全国大学生电子设计大赛初次接触单片机开发至今已经有4年了,初学单片机时,都会纠结于其各个模块功能的应用,如串口(232,485)对各种功能IC的控制,电机控制PWM,中断应用,定时器应用,人机界面应用,CAN总线等. 这是一个学习过程中必需的阶段,是基本功.很庆幸,在参加电子设计大赛赛前培训时,MCU周围的控制都训练的很扎实.经过这个阶段后,后来接触不同的M

单片机C语言的程序架构

初学单片机时,都会纠结于其各个模块功能的应用,如串口(232,485)对各种功能IC的控制,电机控制PWM,中断应用,定时器应用,人机界面应用,CAN总线等. 这是一个学习过程中必需的阶段,是基本功.很庆幸,在参加电子设计大赛赛前培训时,MCU周围的控制都训练的很扎实.经过这个阶段后,后来接触不同的MCU就会发现,都大同小异,各有各的优势而已,学任何一种新的MCU都很容易入手包括一些复杂的处理器.而且对MCU的编程控制会提升一个高度概况--就是对各种外围进行控制(如果是对复杂算法的运算就会 用D