打印

C51高手帮我看看这个怎么处理

[复制链接]
2701|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jack.king|  楼主 | 2007-7-8 10:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面是对89S8252单片机内部的EEPROM写操作
mov dptr,#7fe  //要写的地址
mov a,18h
orl 96h,a     //96就是wmcon的地址
mov a,#7h    //要写的内容
movx @dptr,a
here:mov a,96h
jnb acc.1 here
mov a,#0e7h
 anl 96h,a
以上的操作用效果并且是正确的
但是我改成C写后就没有效果了
c程如下
//i是代表要写地址 j是代表要写的内容
    void ee_write(uchar i, uchar j)
{    
     uchar xdata *addr;
     addr=i;
    WMCON=WMCON|0x18;    //orl 96h,a 
   *addr=j;
    while(1)
{   if(WMCON^1==1)//here:mov a,96hjnb acc.1 here

   {  break;
       else;
      }
   WMCON=WMCON&0xe7;     //anl 96h,a

    }
    
    

相关帖子

沙发
jack.king|  楼主 | 2007-7-8 10:10 | 只看该作者

怎么没有高手来看看啊

使用特权

评论回复
板凳
jack.king|  楼主 | 2007-7-8 13:39 | 只看该作者

求教啊!

使用特权

评论回复
地板
maychang| | 2007-7-8 13:50 | 只看该作者

自己看看C的汇编代码

使用特权

评论回复
5
gyt| | 2007-7-8 17:36 | 只看该作者

对啊

把C编译出来的代码和原来你的汇编代码比较一下,就清楚了。

使用特权

评论回复
6
jack.king|  楼主 | 2007-7-8 17:48 | 只看该作者

明白知道了

使用特权

评论回复
7
doob| | 2007-7-8 18:26 | 只看该作者

呵呵

  知道了就说一下原因吧,大家都在关注啊

使用特权

评论回复
8
jack.king|  楼主 | 2007-7-8 19:38 | 只看该作者

看了编译出来的代码

看了C编译出来的代码和原来你的汇编代码比较没有什么区别
  但是不知道为什么用汇编编写的程序可以读单片机内部的EEPROM而C语言写的就不可以搞不大清楚
  请问内部的eeprom应该是用data code 还是xdata来定义指针呢?

使用特权

评论回复
9
lenglx| | 2007-7-8 20:25 | 只看该作者

......

mov a,18h
orl 96h,a     //96就是wmcon的地址
并不等同:
WMCON=WMCON|0x18;    //orl 96h,a 
应当等同:
WMCOM=WMCOM | *((unsigned char *)0x18);

使用特权

评论回复
10
jack.king|  楼主 | 2007-7-9 00:07 | 只看该作者

问题解决了

问题解决了TO:LENGLX  不需要WMCON=WMCON | *((uchar *)0x18);
WMCON=WMCON|0x18;是正确的
   谢谢你们正确的程序为这样:
       #include<at898252.h>
   #include<math.h>
   #define  uchar unsigned char
void ee_write(uchar i, uchar j)
{    
     uchar xdata *addr;
     addr=i;
 WMCON=WMCON|0x18;
   *addr=j;
   ACC=WMCON;

    while(1)
{  
     if (ACC^1==0)
   ;    else
   {    WMCON=WMCON&0xe7;
      break;    
        }
}
 }
    void main(void)
   {
   ee_write(0x010, 0x02);
    }

使用特权

评论回复
11
hotpower| | 2007-7-9 00:22 | 只看该作者

看来是A人玩C脑子里总离不开A的影子~~~

使用特权

评论回复
12
jack.king|  楼主 | 2007-7-9 07:56 | 只看该作者

玩C脑子里怎么才能离开A的影子呢?

                      

使用特权

评论回复
13
gyt| | 2007-7-9 10:06 | 只看该作者

祝贺一下:)

使用特权

评论回复
14
jack.king|  楼主 | 2007-7-9 11:29 | 只看该作者

谢谢我会努力的

谢谢我会努力的还希望各位大哥多多提点

使用特权

评论回复
15
ptt1234| | 2007-7-9 14:37 | 只看该作者

有错误

IF(ACC^1==1)表示ACC.1是错误的,其为XRL ACC,1,应在外面定义:sbit ACC_1=ACC^1;然后用if(ACC_1)就行

使用特权

评论回复
16
jack.king|  楼主 | 2007-7-9 15:17 | 只看该作者

TO:ptt1234真的没有错



  IF(ACC^1==1)表示ACC.1不是错误的
 程序已经烧出来了可以用了啊!
  可能是因为加了AT898252.H原因吧?


 

使用特权

评论回复
17
hotpower| | 2007-7-9 20:46 | 只看该作者

A人应该转变的观念

首先要忘记ACC,DPTR,PSW,SP,CY...等等辛酸的往事,应该"认为"C是不能访问到它们的.
其次要放弃多年迷恋的"A人效率",因为一个时钟周期并不可能提高A程序整体的工作效率.
从10楼的程序来看,A人的烙记太深远...牢固...

首先是uchar xdata *addr;
此句可能要用到movx a,@rx或movx a,@dptr或movx @dptr,a或movx @rx,a
取uchar可以看出A人是很注重"字节效率"的~~~

再ACC=WMCON;...if (ACC^1==0)
此句是在倒塌C人~~~

C人一般会
uchar temp;
temp = WMCON;
if (!(temp & 2))或if ((temp & 2) == 0)

或直接用
if ((WMCON & 2) == 0)

...........

即使移植A到C,也没必要一句一句地"对照"
只要流程合理,同样的功能也会一样地实现~~~

可能没A人的效率"高尚"吧,但慢上3个uS又能得到什么"喜悦"呢???

对于C,裸奔和OS就如同A人对C人~~~

现在明白了为什么裸奔的人"满地都是"~~~~

使用特权

评论回复
18
turmary| | 2007-7-10 00:47 | 只看该作者

ACC^1==0

是说把ACC跟1异或结果是否为0
语法上是没错.

使用特权

评论回复
19
jack.king|  楼主 | 2007-7-10 21:42 | 只看该作者

TO:hotpowe AND turmary

   TO :hotpower
      谢谢您的提醒。我会加快忘记A 去更好的去学习成为C人
    真诚你的感谢您
  TO:turmary
     同样也谢谢你让我找到了一个错误
    同时谢谢所有21IC 中关心新一代成长的人们

使用特权

评论回复
20
gyt| | 2007-7-11 06:14 | 只看该作者

热心人真多啊:)

确实是个好地方!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

488

主题

2158

帖子

1

粉丝