求助,,,仿照stm32写的51程序

[复制链接]
2050|6
 楼主| qczzyjdxx 发表于 2013-1-20 22:43 | 显示全部楼层 |阅读模式
仿照stm32写的51程序,,,但是不能控制P0口,,,不知道原因,,是不是51不支持这种方式对寄存器操作,,
谁有这方面的经验,,,给讲一下,,,   谢谢了

#define P0   ((unsigned char) 0x80)    //映射P0的地址
typedef struct //定义一个结构体是表示io口
{
    volatile unsigned char IO0;
    // volatile unsigned char IO1;
    // volatile unsigned char IO2;
    // volatile unsigned char IO3;
} IOx;

#define p ((IOx*)P0) //宏定义p的地址是P0

void delay()
{
    int i;
    for(i=0;i<500;i++);
}
void main()
{
    IOx * xxx;//定义一个io口的指针
    xxx=p;//把io口的地址给io口的指针
    while(1)
    {
        xxx->IO0=0x00;
       delay();
        xxx->IO0=0xff;
        delay();
    }
}

ayb_ice 发表于 2013-1-21 08:01 | 显示全部楼层
差之毫厘,失之千里

51的SFR只支持直接寻址
gx_huang 发表于 2013-1-21 08:42 | 显示全部楼层
搞得我做了这么多年51的都看不懂!
qingx 发表于 2013-1-21 08:46 | 显示全部楼层
nbsmaps 发表于 2013-1-21 09:32 | 显示全部楼层
51的C51编译器不支持这个语法啊,你用的是ARM的编译器了,反汇编看一下,根本不对的啊
lzqxs89 发表于 2013-1-21 09:40 | 显示全部楼层
ayb_ice 发表于 2013-1-21 08:01
差之毫厘,失之千里

51的SFR只支持直接寻址

这个应该是问题的本质所在。。
ayb_ice 发表于 2013-1-21 10:08 | 显示全部楼层
本帖最后由 ayb_ice 于 2013-1-21 10:10 编辑

通过指针操作是间接寻址,访问的是IDATA空间

其实通过明确的指针也可以访问SFR DATA空间,但编译器需要扩展一些关键字,定义指针时加上关键字说明一下,比如IAR就是那样做的,C51不行的,因为C51已经扩展了sfr关键字,专门用于定义SFR

评分

参与人数 1威望 +1 收起 理由
qczzyjdxx + 1 学习了

查看全部评分

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

本版积分规则

2

主题

7

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部