问题描述
这是一个有硬件限制的编程问题。我正在研究“智能”恒温器的逆向工程/黑客项目。 (这不是很聪明,但它可以处理 MQTT 流量。)
我的问题是内置的 LED 矩阵显示器。有 5 个七段,其中两个也有 DP,显示屏周围有 19 个图标。
通常我会像这样解析显示:
#define MAKE_BINARY(a,b,c,d,e,f,g,h) (((a)<<7)|(b)<<6)|((c)<<5)|((d)<<4)|((e)<<3|((f)<<2)|((g<<1)|h))
static unsigned char int_to_7leds [] = {
MAKE_BINARY (0,1,1),// 0
MAKE_BINARY (1,// 1
MAKE_BINARY (0,// 2
MAKE_BINARY (0,// 3
MAKE_BINARY (1,// 4
MAKE_BINARY (0,// 5
MAKE_BINARY (0,// 6
MAKE_BINARY (0,// 7
MAKE_BINARY (0,// 8
MAKE_BINARY (0,// 9
但是,这有一个小问题。板上有五个 74HC595 移位寄存器,它们像这样连接到 LED:
这不是您在设计东西时通常想要做的事情,至少我尽量将其保持为 8 位(1 SR)/ 7 段,最后处理其余部分。
正如我已经提到的,这是纯粹的黑客行为,我没有原始代码或原理图。我想就如何操作 7 个字节将其分解为以下内容寻求帮助:
- 5 个字符
- 21 个布尔变量用于设置其他所有内容
我已经开始考虑一个 56 位长的变量和一个巨大的 switch-case 结构来设置每个字符,但应该有其他更好的解决方案。
感谢您阅读本文!
欢迎所有建议。
解决方法
首先感谢你们所有的评论,我已经想通了。所以移出只是简单的敲击,这就是为什么我把这个贴在这里而不是放到电子部分。
所以我做了以下:
int * resolve_chars(char input,int *ch){
switch (input)
{
case 0:
// statements
ch[0] = 1;
ch[1] = 1;
ch[2] = 1;
ch[3] = 1;
ch[4] = 1;
ch[5] = 1;
ch[6] = 0;
break;
case 1:
.
.
.
这是一个很长的 switch-case 函数,最后返回 ch。
我已经为每个字符的图标和数组准备了变量(+一个帮助器,因为 C 无法返回数组,因为结果......)
c1 = resolve_chars( - SINLE CHAR TO BE RESOLVED -,c1h);
这给了我位图,为此我只需要移出 7 个字节来更新整个显示。
GPIO_SetBits(GPIOE,GPIO_Pin_3); //OE
SetDisplayState(0,MAKE_BINARY (c4_dp,back,hand,no_7,power,settings,no_1,c1[3])); //6
SetDisplayState(0,MAKE_BINARY (rect,c5[2],c5[1],c5[6],c5[0],c5[3],c5[5],c5[4])); //5
SetDisplayState(0,MAKE_BINARY (kor,c4[2],c4[1],c4[6],c4[0],c4[3],c4[5],c4[4])); //4
SetDisplayState(0,MAKE_BINARY (c3_dp,c3[2],c3[1],c3[6],c3[0],lock,c3[5],c3[4])); //3
SetDisplayState(0,MAKE_BINARY (fan,c2[2],c2[1],c2[6],c2[0],lang,c2[5],c2[4])); //2
SetDisplayState(0,MAKE_BINARY (ora,c1[2],c1[1],c1[6],c1[0],akku,c1[5],c1[4])); //1
SetDisplayState(0,MAKE_BINARY (c3[3],no_6,no_4,no_3,logo,no_2,c2[3])); //0
GPIO_ResetBits(GPIOE,GPIO_Pin_3); //OE
现在我可以专注于与板载 ESP8266EX 的通信