各位大神!!懂指针的进

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条回答
728196
1楼-- · 2020-02-08 02:52
51  或者52的寄存器地址 和 RAM 地址是有重复的貌似  访问他们是要用不同的指令区别的  指针 是访问不到的 !
takashiki
2楼-- · 2020-02-08 03:00
51的架构比较怪异,SFR区寄存器只能直接访问,不能通过指针间接访问的。

另外,51是哈佛结构。是哈佛结构的原因并不仅仅因为他不是统一编址的,而主要是程序和内存在内部是采用分开的总线实现的。
更高级的单片机比如ARM,外部表现全部都是统一编址,但CM0就是冯诺依曼结构,CM3就是哈佛结构。
xizi
3楼-- · 2020-02-08 03:29
 精彩回答 2  元偷偷看……
wye11083
4楼-- · 2020-02-08 04:24
访问SFR时,使用sfr关键字标识变量,如
sfr IOA = 0x80;
如果要使用SFR位寻址,则为
sbit IOA0 = 0x80+0;
或者
sbit IOA0 = IOA ^ 0;
这是Keil的定义,只要你这样声明,Keil会自动用SFR寻址。
能不用汇编尽量不要使用汇编,有大炮了何必再换鸟枪?怀旧?而且你能保证你的所有函数的调用和返回都符合Keil定义?

一周热门 更多>