我在尝试使用 3 个变量进行 XOR 时遇到问题

问题描述 投票:0回答:1

我正在使用 C 语言对微型计算机(ATmega328p)进行编程,这只是一个学校项目。问题是我试图代表这个真实的表(A、B 和 C 只是输入,更具体地说是按钮),EXOR 是 LED 的输出,还有其他 3 个 LED,但它们正在执行不同的门,并且它们正在工作好的。

True table

我对这个特定部分有问题,因为 exor 不起作用,当按下 2 个按钮时它应该关闭,但事实并非如此。只有当所有按钮都没有按下时才会关闭

         if ( ((BTS & _BV(BT1)) ^ (BTS & _BV(BT2))) || ((BTS & _BV(BT2)) ^ (BTS & _BV(BT3)))) //EXOR
        {
            
            LEDS |= _BV(LED2); //Set 1 on LED2
        }
        else
        {
             LEDS &= ~_BV(LED2); //Set 0 on LED2
        }`
        

我将完整的代码放在这里仅供参考。

type he#include <avr/io.h>
#define F_CPU 16000000UL 
#include <util/delay.h> 
#define delay 500

//--Tags
//-Inputs
#define BTS PINB
#define BT1 PINB0
#define BT2 PINB1
#define BT3 PINB2

//-Outputs
#define LEDS PORTD
#define LED0 PORTD2
#define LED1 PORTD3
#define LED2 PORTD4
#define LED3 PORTD5

void init_ports(void);

int main(void)
{
    init_ports();
    
    while (1) 
    {
        //Output 1
        if ((BTS & _BV(BT1)) && (BTS & _BV(BT2)) && (BTS & _BV(BT3))) // AND 
        {
            
            LEDS |= _BV(LED0); //Set 1 on LED0
        }
        else
        {
            LEDS &= ~ _BV(LED0); //Set 0 on LED0
        }
        
        //Output 2
        if ((BTS & _BV(BT1)) || (BTS & _BV(BT2)) || (BTS & _BV(BT3))) // OR 
        {
            LEDS |= _BV(LED1); //Set 1 on LED1
        }
        else
        {
            LEDS &= ~ _BV(LED1); //Set 0 on LED1
        }
        
        `//Output 3
        
         if ( ((BTS & _BV(BT1)) ^ (BTS & _BV(BT2))) || ((BTS & _BV(BT2)) ^ (BTS & _BV(BT3)))) //EXOR
        {
            
            LEDS |= _BV(LED2); //Set 1 on LED2
        }
        else
        {
             LEDS &= ~_BV(LED2); //Set 0 on LED2
        }`
        
        
        //Output 4
        
         if (!((BTS & _BV(BT1)) && (BTS & _BV(BT2)) && (BTS & _BV(BT3)))) // NOR 
        {
            
        LEDS |= _BV(LED3); //Set 1 on LED3
        }
        else
        {
         LEDS &= ~_BV(LED3); //Set 0 on LED3

        }
        
    }
}

void init_ports (void)
{

//--Inputs
DDRB  &= ~(_BV(BT1) | _BV(BT2) | _BV(BT3));
//-PULL-UP 
PORTB &= ~(_BV(BT1) | _BV(BT2) | _BV(BT3));
//--Outputs
DDRD  |=  (_BV(LED0) | _BV(LED1) | _BV(LED2) | _BV(LED3));
//-Off
PORTD &= ~(_BV(LED0) | _BV(LED1) | _BV(LED2) | _BV(LED3));
    
}
re

有什么可能出问题的想法吗?泰! :D

我尝试使用这个布尔表达式 y = A'B'C + A'BC' + AB'C' + ABC

c avr atmega microchip atmelstudio
1个回答
0
投票

编写一些代码,使用布尔表达式构建真值表,并将其与作业中给出的表进行比较。他们匹配吗?如果没有,请仔细考虑给定的真值表并构造一个匹配的布尔表达式。您还可以在 Google 中搜索一种称为卡诺图的东西,它可以帮助您从真值表构建表达式。

#include <stdio.h>

int main()
{
   printf(" A   B   C   EXOR\n");
   printf("------------------\n");

   for (int a = 0; a <=1; a++) {
      for (int b = 0; b <=1; b++) {
         for (int c = 0; c <=1; c++) {
            int exor = (a ^ b) || (b ^ c);
            printf(" %i   %i   %i   %i\n", a, b, c, exor);
         }
      }
   }
}
© www.soinside.com 2019 - 2024. All rights reserved.