我是嵌入式编程的新手。我和其他朋友做了一个例子,所以他们写了一些我不理解的部分。在这个例子中,我们必须在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()
}
答案 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 = ...;