淘宝买了一块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");
}