10825|36

41

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

关于51单片机位定义的问题 [复制链接]

下面是我在自己买的51开发板上编写的一个程序,程序实现的功能比较简单,就是在数码管上显示矩阵键盘(4X4键盘,依次编码为1~16)上按下的键值的平方值。其中P2^4~P2^7为8段数码管的位选,P0口为8段数码管的段选,P1^0~P1^3为键盘的列线,P1^4~P1^7为键盘的行线。用定时器0来刷新4位8段数码管的显示。

#include<reg52.h>
#include<intrins.h>

#define uchar unsigned char
#define uint unsigned int

uchar table[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x84,0x8e};
uchar j=0,k=0x7f,m=0,b=0xef,a[4]={0};
uint i=0;
sbit line1=P1^0;
sbit line2=P1^1;
sbit line3=P1^2;
sbit line4=P1^3;

void delay(uchar z)
{
 uchar x,y;
 for(x=z;x>0;x--)
  for(y=250;y>0;y--);
}

void time0_initial()
{
 TMOD=0x01;
 TH0=(65535-1000)/256;
 TL0=(65535-1000)%256;
 EA=1;
 ET0=1;
 TR0=1;
}

void main()
{
 time0_initial();
 AC=1;
 i=0;
 while(1)
 {
  for(m=0;m<4;m++)
  {
   P1=_crol_(b,m);
   if(line1==0)
   {
    delay(2);
    if(line1==0)
    {
     i=m*4+1;
     i=i*i;
     while(!line1);
     delay(2);
    }
   }
   if(line2==0)
   {
    delay(2);
    if(line2==0)
    {
     i=m*4+2;
     i=i*i;
     while(!line2);
     delay(2);
    }
   } 
   if(line3==0)
   {
    delay(2);
    if(line3==0)
    {
     i=m*4+3;
     i=i*i;
     while(!line3);
     delay(2);
    }
   }
   if(line4==0)
   {
    delay(2);
    if(line4==0)
    {
     i=m*4+4;
     i=i*i;
     while(!line4);
     delay(2);
    }
   }
  }
 }
}

void time0() interrupt 1
{
 TH0=(65535-1000)/256;
 TL0=(65535-1000)%256;
 a[0]=i/1000;
 a[1]=i/100%10;
 a[2]=i/10%10;
 a[3]=i%10;
 j++;
 if(j==4)
  j=0;
 P2=_cror_(k,j);
 P0=table[a[j]];  
}

此时的程序是正确的。

编程过程中遇到的问题就是没有进行以下所示的位定义

sbit line1=P1^0;
sbit line2=P1^1;
sbit line3=P1^2;
sbit line4=P1^3;

而是直接在程序中使用P1^0~P1^3,结果程序就运行不正常,苦思良久,未果,望请各位前辈高手们指点指点。

 

[ 本帖最后由 若如 于 2011-11-9 20:03 编辑 ]
此帖出自51单片机论坛

最新回复

C变量命名规则:就指明不能用 “^”。 字母 数字 下划线  详情 回复 发表于 2011-11-12 20:46
点赞 关注
 

回复
举报

236

帖子

0

TA的资源

纯净的硅(初级)

沙发
 
把位定义提到宏定义下面试试。程序中不能P1^0这样用吧?
此帖出自51单片机论坛
 
个人签名历经挫折才能站的更稳。来学习了
 
 

回复

41

帖子

0

TA的资源

一粒金砂(中级)

板凳
 

回复 沙发 谢谢分享 的帖子

我发上来的程序是正确的,我编写的过程中直接用P1^0这种形式的时程序的运行就不正常了,我不知道是什么原因。为什么不能直接用P1^0而非得在主程序前进行类似sbit line1=P1^0;的位定义,再在程序中使用line1才能使程序工作正常?
此帖出自51单片机论坛
 
 
 

回复

236

帖子

0

TA的资源

纯净的硅(初级)

4
 

回复 板凳 若如 的帖子

哦,你说为什么不能直接在程序中使用P1^0这样啊 。很简单,语法定义。。。。。
此帖出自51单片机论坛
 
个人签名历经挫折才能站的更稳。来学习了
 
 

回复

79

帖子

0

TA的资源

一粒金砂(高级)

5
 
试试加个括号(P1^1)==0,优先级问题
此帖出自51单片机论坛
 
 
 

回复

31

帖子

0

TA的资源

一粒金砂(中级)

6
 
倒三角可以用吗?标识符不是只能由下划线和字符组成吗?我们都是用regx52.h这个头文件,里面已经用sbit 定义了io口,使用时用下划线替代倒三角,寻址的时候倒是使用倒三角,,即使不使用这个头文件,通常也会先定义的,,我觉得问题出在倒三角上,,因为没有人会直接使用,所以,它肯定是有问题。。太片面了,就当我再这扯着玩好了。
此帖出自51单片机论坛
 
 
 

回复

41

帖子

0

TA的资源

一粒金砂(中级)

7
 

回复 5楼 lalahu 的帖子

刚才试了一下,就算加上括号也不行,非得在前面进行位定义之后再使用才正常。
此帖出自51单片机论坛
 
 
 

回复

236

帖子

0

TA的资源

纯净的硅(初级)

8
 

回复 5楼 lalahu 的帖子

试试。 没这样用过也不知道。学习了。
此帖出自51单片机论坛
 
个人签名历经挫折才能站的更稳。来学习了
 
 

回复

236

帖子

0

TA的资源

纯净的硅(初级)

9
 

回复 7楼 若如 的帖子

编译能通过不 ?
此帖出自51单片机论坛
 
个人签名历经挫折才能站的更稳。来学习了
 
 

回复

41

帖子

0

TA的资源

一粒金砂(中级)

10
 

回复 6楼 j1a2s3o4n 的帖子

我也不知道倒三角符号能不能用,不过我打开的reg52.h文件里定义了P1^0的,我就直接用了,不过程序工作不正常,还是得进行一次位定义后才能使用。不过你说为什么关于定时器的位如TR0,关于中断的位如EA,ET0,EX0这些就可以直接使用呢?

[ 本帖最后由 若如 于 2011-11-9 21:46 编辑 ]
此帖出自51单片机论坛
 
 
 

回复

236

帖子

0

TA的资源

纯净的硅(初级)

11
 
我把你程序复制进去我的keil里 没问题啊。  没有警告哦。
此帖出自51单片机论坛
 
个人签名历经挫折才能站的更稳。来学习了
 
 

回复

236

帖子

0

TA的资源

纯净的硅(初级)

12
 

回复 10楼 若如 的帖子

因为那些可以位寻址。、
此帖出自51单片机论坛
 
个人签名历经挫折才能站的更稳。来学习了
 
 

回复

41

帖子

0

TA的资源

一粒金砂(中级)

13
 

回复 9楼 谢谢分享 的帖子

编译当然可以通过啊,连个warning都没有。
此帖出自51单片机论坛
 
 
 

回复

41

帖子

0

TA的资源

一粒金砂(中级)

14
 

回复 11楼 谢谢分享 的帖子

我传上来的这个程序是经过我改正后的,是正确的程序,可是如果把关于P1^0~P1^3的位定义去掉,直接在程序中使用P1^0这种形式程序就不能正常工作了(编译的时候还是不会提示错误)。
此帖出自51单片机论坛
 
 
 

回复

41

帖子

0

TA的资源

一粒金砂(中级)

15
 

回复 12楼 谢谢分享 的帖子

你的这个解释应该是最合理的,谢了!
此帖出自51单片机论坛
 
 
 

回复

236

帖子

0

TA的资源

纯净的硅(初级)

16
 
我都不好意思了。 现在才明白你问的是什么。第一次回答问题。  没挨骂  哈哈。  
此帖出自51单片机论坛
 
个人签名历经挫折才能站的更稳。来学习了
 
 

回复

31

帖子

0

TA的资源

一粒金砂(中级)

17
 
不能是语法错误,语法错误编译时会出错的
此帖出自51单片机论坛
 
 
 

回复

41

帖子

0

TA的资源

一粒金砂(中级)

18
 

回复 16楼 谢谢分享 的帖子

那你还那么多的芯币,羡慕啊。
此帖出自51单片机论坛
 
 
 

回复

41

帖子

0

TA的资源

一粒金砂(中级)

19
 

回复 17楼 j1a2s3o4n 的帖子

的确不是语法错误。
此帖出自51单片机论坛
 
 
 

回复

236

帖子

0

TA的资源

纯净的硅(初级)

20
 

回复 17楼 j1a2s3o4n 的帖子

不是。你那样用的意思好像就不是那个意思了。^是或的逻辑。这样用和你根本的用意不符合  P1已经定义可以应用。 你试试观察下过完那条程序P1的值。
此帖出自51单片机论坛
 
个人签名历经挫折才能站的更稳。来学习了
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表