C - 用于显示的字节操作

问题描述

这是一个有硬件限制的编程问题。我正在研究“智能”恒温器的逆向工程/黑客项目。 (这不是很聪明,但它可以处理 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:

enter image description here

这不是您在设计东西时通常想要做的事情,至少我尽量将其保持为 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 

瞧,它的工作原理: enter image description here

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