关于while循环内嵌套switch的几个问题,请热心人帮忙解答!

程序中共有2个while循环,并且在其内的if语句下都内嵌有switch,P0口读取8位不断变化值,P2口查表输出LED显示端口状态;(1):要求第一个while循环在满... 程序中共有2个while循环,并且在其内的if语句下都内嵌有switch,P0口读取8位不断变化值,P2口查表输出LED显示端口状态;
(1):要求第一个while循环在满足if条件下进入switch找到相应的case后直接跳出第一个while循环,并且不再进入(除非?出现或在以后的程序中出现default所列的情况),同时将P0口第一次正确取到的P0!=0xff数据保留至后面用,P2口保持相应输出。
(2):第二个while内的程序要求不断循环,直到出现指定情况才跳回到第一个while处从新开始。
其内的if满足条件P0新数据!=P0老数据,才进入执行switch;在此之前,P2口保持P0口老数据输出。
构想框架如下:(初学,自学,有错误请指正,见笑了!)
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table1[]={0x67,0x9b,……};
uchar code table2[]={0x9e,0x6d,……};
uchar x,key_1,key_2;
void main()
{
P0=0xff; // 输入口,置1
P2=0xff; //P2口输出,LED显示无数据状态
key_1=P0; //查表用

while(1) //此处需要改为查表成功则跳出循环,进入下一个循环,并
且不再进入;else的状态下返回循环再次读取P0口数据(因为
这个原因才选择while循环,如果其他循环形式可以满足次条件,可更换)
{
if(P0!=0xff) //有输入则进入查表
{
switch (key_1)
{
case 0x67 :P2=table2[0]; break;//查表成功则跳出循环,进入下一个循环,并
且不再进入该while循环
case 0x9b :P2=table2[1]; break;
……
default :P2=0xff; break;
}
}
else P2=0xff; break; //else的状态下返回循环再次读取P0口数据

}
while(1) //查表成功则跳入该循环,除非else,否则不跳出循环,不断检测P0口变化
{

//P2口输出状态保持在上一个循环的状态不变,直到P0口数据变化才对应变化……
if(P0!=P0) //新数据!=老数据(P0口数据出现变化)
{
switch (key_1)
{
case 0x67 :P2=table2[0]; break; //此处不跳出循环,保证反复查表
case 0x9b :P2=table2[1]; break;
……
default :P2=0xff; break;
}
}
else P2=0xff; break; //else的状态下返回第一个循环再次读取P0口数据
}
}
展开
 我来答
haohaizi0077
推荐于2016-08-29 · TA获得超过285个赞
知道小有建树答主
回答量:242
采纳率:0%
帮助的人:133万
展开全部

你不就是想要把P0的输入转码在P2输出吗!!何必这么麻烦呢?

以下代码少一个while,性能更好,采纳了吧。。。。。

#define uchar unsigned char
#define uint unsigned int
uchar code table1[]={0x67,0x9b,……};
uchar code table2[]={0x9e,0x6d,……};
 void main()
{
    uchar old_data = P0;
    uint index = 0;
    while(1)
    {
        if(old_data != P0)     //新数据!=老数据(P0口数据出现变化)
        {
            old_data = P0;    //重新赋值
            switch(old_data)    //查询输入数据对应的转码后在table2[]中的位置
            {
                case table1[0]:index=0;break;
                case table1[1]:index=1;break;
                ...............
                case table1[15]:index=15;break;
                default   :index=0; break; 
            }
        }
        else
        {
            P2 = table2[index];          //输出转码后的值
        }
    }
}
更多追问追答
追问
首先谢谢你的回答!但是你可能没完全理解我的意思,和P0口输入对应的是P2口,但是P2口的数据table2总共有15组,两个循环当中都会出现15组的情况,第一个循环我都要用,
追答
我问你,你要实现的功能是否是:P0输入为table1时,P2输出table2对应的值。
金山毒霸
2024-10-31 广告
大部分系统错误,是因为某些DLL文件丢失造成的,比如未安装DirectX9或DirectX 9.0组件已损坏、缺少Visual C ++库、未安装.net库。解决方法如下:一、 手动解决方法1、先确定电脑操作系统是多少位的,现在的电脑一般都... 点击进入详情页
本回答由金山毒霸提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式