【问题标题】:Assembly zero error - switch statement [closed]组装零错误 - switch 语句 [关闭]
【发布时间】:2016-05-15 06:45:39
【问题描述】:

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

#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;}

}

【问题讨论】:

    标签: c assembly 8051


    【解决方案1】:


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

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

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

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

    所以我建议更换

    P1&=0x07;
    switch(P1)
    

    switch(P1 & 0x07)
    

    最好的问候和好运。

    赫尔穆特

    【讨论】:

    • 这实际上修复了错误,谢谢。 P2&=0x07; 的原因是什么?在其他部分?这实际上是一个错字。 P2 应该设置为 0x00。
    猜你喜欢
    • 1970-01-01
    • 2013-06-13
    • 1970-01-01
    • 2014-11-25
    • 1970-01-01
    • 2021-04-11
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多