0

这是一个有硬件限制的编程问题。我正在从事“智能”恒温器的逆向工程/黑客项目。(它不是那么聪明,但它能够处理 MQTT 流量。)

我的问题是内置 LED 矩阵显示器。有 5 个 7 段,其中两个也有 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,0,0,0,0,0,1,1), // 0
  MAKE_BINARY (1,0,0,1,1,1,1,1), // 1
  MAKE_BINARY (0,0,1,0,0,1,0,1), // 2
  MAKE_BINARY (0,0,0,0,1,1,0,1), // 3
  MAKE_BINARY (1,0,0,1,1,0,0,1), // 4
  MAKE_BINARY (0,1,0,0,1,0,0,1), // 5
  MAKE_BINARY (0,1,0,0,0,0,0,1), // 6
  MAKE_BINARY (0,0,0,1,1,1,1,1), // 7
  MAKE_BINARY (0,0,0,0,0,0,0,1), // 8
  MAKE_BINARY (0,0,0,0,1,0,0,1), // 9

但是,这有一个小问题。板上有五个 74HC595 移位寄存器,它们与 LED 相连,如下所示: 在此处输入图像描述

这不是您在设计东西时通常想要做的事情,至少我尝试将其保持为 8 位(1 SR)/ 7 段,并在最后处理其余部分。

正如我已经提到的,这是纯粹的黑客行为,我没有原始代码或原理图。我想就如何操作 7 个字节以将其分解为以下内容寻求一些帮助:

  • 5 个字符
  • 21个布尔变量来设置其他一切

我已经开始考虑一个 56 位长的变量和一个巨大的 switch-case 结构来设置每个字符,但是应该有其他更好的解决方案。

谢谢您阅读此篇!

欢迎所有建议。

4

1 回答 1

0

首先感谢大家的评论,在此期间我已经弄清楚了。所以搬出去只是简单的敲打,这就是为什么我把它贴在这里而不是电子部分。

所以我做了以下几点:

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_7,no_6,no_4,no_3,logo,no_2,c2[3])); //0
        GPIO_ResetBits(GPIOE, GPIO_Pin_3); //OE 

瞧,它的工作原理: 在此处输入图像描述

现在我可以专注于与板载 ESP8266EX 的通信

于 2021-02-14T20:40:16.773 回答