关于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口数据
}
} 展开
(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口数据
}
} 展开
展开全部
你不就是想要把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 广告
2024-10-31 广告
大部分系统错误,是因为某些DLL文件丢失造成的,比如未安装DirectX9或DirectX 9.0组件已损坏、缺少Visual C ++库、未安装.net库。解决方法如下:一、 手动解决方法1、先确定电脑操作系统是多少位的,现在的电脑一般都...
点击进入详情页
本回答由金山毒霸提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |