各位大神!!懂指针的进

2020-02-04 09:13发布

    首先在51中P1的物理地址是90H,如果我不通过用《reg51.h》或者sfr之类的直接用指针,应该
也是可以对P1口进行操作的。
代码如下
void main()
{   
   unsigned char*p;
   p=( volatile unsigned char *)(0x90);
   *p=0xf0;
   while(1);
}
如果上面的代码正确的话,那么8个led是一半亮一半不亮啊,纳闷的是这个程序运行的时候没一点反应,望各位大侠多多指教!!十分感谢
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
34条回答
jingyong
1楼-- · 2020-02-04 12:38
不是很懂指针 但是我觉得*P是数据指针吧 不是程序指针 用汇编去理解
NemoGu
2楼-- · 2020-02-04 16:53
典型的没事找事
0x90只是SFR地址 SFR定义到SRAM中地址不一定是0x90
bangbangji
3楼-- · 2020-02-04 21:38
 精彩回答 2  元偷偷看……
NemoGu
4楼-- · 2020-02-04 23:13
bangbangji 发表于 2012-4-13 13:12
先确定硬件没问题,再确定你的程序确实下进去了
另外51是哈佛结构的,程序和数据是分开编址的,这里是不是 ...

51是冯诺依曼结构的 AVR才是哈佛结构
y574924080
5楼-- · 2020-02-05 00:42
  1. ; . est.SRC generated from: test.c
  2. ; COMPILER INVOKED BY:
  3. ;        C:KeilC51BINC51.EXE test.c BROWSE DEBUG OBJECTEXTEND SRC(. est.SRC)


  4. NAME        TEST

  5. ?PR?main?TEST        SEGMENT CODE
  6.         EXTRN        CODE (?C_STARTUP)
  7.         EXTRN        CODE (?C?CSTPTR)
  8.         PUBLIC        main
  9. ; void main()

  10.         RSEG  ?PR?main?TEST
  11. main:
  12.         USING        0
  13.                         ; SOURCE LINE # 1
  14. ; {   
  15.                         ; SOURCE LINE # 2
  16. ;    unsigned char *p;
  17. ;    p=( volatile unsigned char *)(0x90);
  18.                         ; SOURCE LINE # 4
  19.         MOV          R3,#00H
  20.         MOV          R2,#00H
  21.         MOV          R1,#090H
  22. ;---- Variable 'p?040' assigned to Register 'R1/R2/R3' ----
  23. ;    *p=0xf0;
  24.                         ; SOURCE LINE # 5
  25.         MOV          A,#0F0H
  26.         LCALL        ?C?CSTPTR
  27. ?C0001:
  28. ;    while(1);
  29.                         ; SOURCE LINE # 6
  30.         SJMP         ?C0001
  31. ; END OF main

  32.         END
复制代码
y574924080
6楼-- · 2020-02-05 01:01
这是我用at89c51在keil里把程序转换为汇编的代码

一周热门 更多>