【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");
}


版权声明:本文博客原创文章,博客,未经同意,不得转载。

转载于:https://www.cnblogs.com/hrhguanli/p/4628532.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值