了解为STM32编写的函数

时间:2017-06-01 17:58:05

标签: c stm32 led

我是嵌入式编程的新手。我和其他朋友做了一个例子,所以他们写了一些我不理解的部分。在这个例子中,我们必须在led矩阵16x16

上编程游戏'太空入侵者'
enum command_e{
    LED_STAY = 0x00,
    LED_ON   = 0x01,
    LED_OFF  = 0x02,
    LED_TOGGLE = 0x03
};

之前我们在标题中定义:

void TIM2_IRQHandler(void){
static int count = 1;
static int line=0;
static int collumn=0;
panel_t send;
send.led0 = 0;
send.led1 = 0;
send.led2 = 0;
send.led3 = 0;

if(count == 1)
    GPIOA->ODR = 1<<15;
else if(count == 2){
    GPIOA->ODR = 0<<15;
    busyFlag = 0;
} else if(count == 50){
    send.led0 = (field[line+8][collumn].counterMAX > 0) ? setLED(line, collumn, LED_ON) : setLED(line, collumn, LED_OFF);
    send.led1 = (field[line][collumn].counterMAX > 0) ? setLED(line, collumn, LED_ON) : setLED(line, collumn, LED_OFF);
    if(line != 0)
        send.led2 = (field[line][collumn+8].counterMAX > 0) ? setLED(line, collumn, LED_ON) : setLED(line, collumn, LED_OFF);
    else{
        send.led2 = (leben < (8 - collumn)) ? setLED(line, collumn, LED_OFF) : setLED(line, collumn, LED_ON);
    }

    send.led3 = (field[line+8][collumn+8].counterMAX > 0) ? setLED(line, collumn, LED_ON) : setLED(line, collumn, LED_OFF);
    received = sendData(send); //recieved global variable to update field in main
    if(collumn < 7){
        collumn++;
    }
    else{
        collumn=0;
        (line < 7) ? (line++) : (line = 0);
    }
}

if(count == 120)
    count = 0;
count++;

TIM_ClearITPendingBit(TIM2, TIM_IT_Update);

欢迎任何帮助。

谢谢。

编辑:这是在main中使用此功能。

transform: scale()

}

2 个答案:

答案 0 :(得分:0)

这个函数只是返回一个int,其中二进制组合的值向左旋转了5次,collumn旋转了2次到左边,命令(在枚举中定义了值)

所以,如果你这样做:

test = setLED(3,2,LED_TOGGLE)

测试将等于:((00000011&lt;&lt; 5)|(00000010&lt;&lt; 2)| 00000011)

将给出:

01100000 OR
00001000 OR
00000011
--------
01101011

其余逻辑依赖于代码的其余部分

答案 1 :(得分:0)

基于此处发布的少量代码:

settLED()没有做任何实际设置LED的事情。在我看来,它用于创建一个值,它是地址(行/列)和所需状态的组合。这可能会被写入控制寄存器。

如果您对return (line<<5)|(collumn<<2)|cmd;感到疑惑,将它拆开可能会有所帮助,这样您就可以逐步了解发生的情况:

int setLED(int line, int collumn, enum command_e cmd)
{
   int result = (line << 5);
   result = result | (collumn << 2);
   result = result | cmd;

   return result;
}

setLED(1, 1, LED_ON);

的结果
result = (line << 5);              // result -> 0x20
result = result | (collumn << 2);  // result -> 0x24
result = result | cmd;             // result -> 0x25

修改: 可能的寄存器位定义基于给定的值(状态0-3和16x16矩阵)

// Bits:  15 14 13 12 11 10  9  8  7  6  5  4  3  2  1  0
// Field:                    RRRRRRRRRR  CCCCCCCCCC  SSSS
// Range of Values:          0-15        0-15        0-3

修改: 好的,基于6位地址,以及您将行和列限制为最大值为7的事实:

if(collumn < 7){
    collumn++;
}
else{
    collumn=0;
    (line < 7) ? (line++) : (line = 0);
}

看起来您正在使用8x8 LED矩阵,可以使用6位寻址(3个用于行,3个用于列)。我已经更新了我的“注册说明”,它应该清楚地说明2和5的转变来自哪里。

// Bits:    7  6  5  4  3  2  1  0
// Field:   RRRRRRR  CCCCCCC  SSSS
// Range:   0-7      0-7      0-3

16x16矩阵的每个象限是使用以下命令写入的这些8x8矩阵之一:

send.led0 = ...;
send.led1 = ...;
send.led2 = ...;
send.led3 = ...;