C51单片机编程用KEIL,难道不能在子函数中定义sbit?

voidkeyEvent(){for(i=0;i<4;i++){P3=0xff;sbitb=P3^i;//报错。。。b=0;for(j=4;j<8;j++)if(!P3^... void keyEvent()
{
for (i=0; i<4; i++) {
P3 = 0xff;
sbit b = P3^i; //报错。。。
b = 0;
for (j=4; j<8; j++)
if (!P3^j) {
sleep(10);
if (!P3^j) {
key = i * 4 + j - 4;
while (!P3^j);
break;
}
}
}
}

代码如上,到底是什么问题?
i改成常数是一样的

另报错如下:

error C141: syntax error near 'sbit'
error C202: 'b': undefined identifier
展开
 我来答
时之默言
2015-02-09 · 超过39用户采纳过TA的回答
知道小有建树答主
回答量:55
采纳率:100%
帮助的人:51.5万
展开全部
你可以将提示错的信息发出来,sbit声明的是可位寻址的RAM块,你可以先将sbit b=P3^i中i改成一个常数扒顷试下启源。

这个我也试了,好像不能在函数里定义sbit 变量,主函数春旁陆也不行。另请高明吧。
追问
那请问一下如果想动态修改寄存器某一位的值怎么做比较方便呢?
追答
其实在reg51.h、reg52.h等头文件中有许多特殊功能寄存器的声明,
比如P3是。sfr P3=0xB0;
sbit P3_0=P3^0;

当然也可以这样:sbit P3_0=0xB0;
sbit P3_1=0xB1;

这样的声明你可以放在函数外,在函数里直接给P3_0、P3_1这样的变量赋值即可。

在51单片机中有一块可以位寻址的RAM区(20H----7FH)。
你可以通过关键字bdata来声明(关于bdata,KEIL编译器help中有)。
比如:
unsigned char bdata VA=0x20; //20是VA的地址
sbit VA0=VA^0;
sbit VA1=VA^1;
sbit VA2=VA^2;
sbit VA3=VA^3;
sbit VA4=VA^4;
sbit VA5=VA^5;
sbit VA6=VA^6;
sbit VA7=VA^7;
这样你就可以在某一位存储自己的变量。
仑阿老1966
2015-02-09 · TA获得超过2.7万个赞
知道大有可为答主
回答量:3549
采纳率:75%
帮助的人:1051万
展开全部
没试过在子函数里定义过,不过看到你那个是i不是1
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
rubstone2013
2017-11-17
知道答主
回答量:2
采纳率:0%
帮助的人:1759
展开全部
好像有资料说bdata和sbit声明的变量,必须为全局变量。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式