c - 汇编零错误——switch语句

标签 c assembly 8051

我应该使用 Dallas 8051 芯片制作多路复用器。 p1.0、p1.1 和 p1.2 是输入。 P1.3 为使能线,输出为P2.0 至p2.3。除了所有输入均为零且启用为 1 时之外,调试时所有输出都工作正常。 (Keil 调试器 View 的输出中应该只有零,但事实并非如此)。

#include<reg51.h>

sbit input0 = p1^0;
sbit input1 = p1^1;
sbit input2 = p1^2;
sbit enable = p1^3;
sbit output0 = p2^0;
sbit output1= p2^1;
sbit output2 = p2^2;
sbit output3 = p2^3;
sbit output4 = p2^4;
sbit output4 = p2^5;
sbit output6 = p2^6;
sbit output7 = p2^7;

void main (void) {
    P2 = 0x00;

    if (enable==1)
    {
        P1&=0x07;
        switch(P1)

        {
            case 1: output1=1; break;
            case 2: output2=1; break;
            case 3: output3=1; break;
            case 4: output4=1; break;
            case 5: output5=1; break;
            case 6: output6=1; break;
            case 7: output7=1; break;
            default: output0 =1; break;
        }

    }

    else {P2&=0x07;}

}

最佳答案


你问为什么当所有输入都为零且启用为 1 时不起作用。 抱歉,我在您的代码中看不到这种行为的原因,但我有一些问题和建议。

在哪里停止调试器来读取输出?您确定设置output0的语句之前已经执行过吗?

P2&=0x07;是什么原因?在其他部分?

你想用P1&=0x07做什么;切换之前?
如果您想屏蔽位 4..7,最好直接在 switch 语句中执行此操作。 您现在要做的事情取决于 P1 的位 0..3 输入中的信号。如果其中一个为0,则在P1的该位上写入0。
8051 的端口可以双向使用。如果写入 1,则该引脚仅由弱电阻驱动为 1。但如果你写一个 0,它将被一个可以驱动几毫安的输出晶体管驱动为 0。 0 将强制 8051 的引脚成为输出。

因此我建议更换

P1&=0x07;
switch(P1)

switch(P1 & 0x07)

致以最诚挚的问候,祝你好运。

赫尔穆特

关于c - 汇编零错误——switch语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37235337/

相关文章:

c - 进入main之前的四个执行步骤是什么?

c++ - 内联汇编语言是否比 native C++ 代码慢?

c - 8051F340 微 Controller 中的闪存被删除

c - 如何在8051中将单个特定引脚设置为输入或输出?

c++11 - C11 和 C++11 原子 : acquire-release semantics and memory barriers

c - 8位单片机生成伪随机数最快的方法是什么?

c - 总是(可移植地)释放并为进程保留内存或返回操作系统

c - 在基于 C 的语言中,EOF 是如何生成和解释的?

C结构字段分配覆盖另一个字段

c - GCC默认参数(-Werror -Wall..)