访问电脑版页面

导航:老古开发网手机版51单片机51单片机Keil C51编程

指针实例(C51)

导读:
关键字:
#pragma src

#i nclude <reg51.H>


f(){}
f1(){}
f2(){}

main()
{
    {
        int x;
        int *px;

        //下面这些表示虽然很烦,但是生成的代码却及其简洁:(黑体部分实际使用过)

        //将 xdata 型指针 0x4000 赋给 px
        px=(int xdata *)0x4000;

        //表示从 xdata 0x4000处取一个 char 给x
        x=*((char xdata *)0x4000); (可以将0X4000处,改成一个整形变量,方便进行操作。)

        或者*((char xdata *)0x4000)=X;//表示给存在xdata中,地址为0x4000的空间赋值。

        // 表示从 code 0x4000处取一个 word 作为 xdata 型的指针 给
px
        px=*((int xdata * xdata *)0x4000);

        //表示从 code 0x4000处取一个 word 作为 xdata 型的指针,
        //再把这个指针指向的char数据赋给x
        x=**((char xdata * code *)0x4000);

        //表示把函数f()入口地址当作xdata型指针,再把指向的xdata
        //中的int型数据作为code型指针,把指向的code字节
        //赋给x(晕,这样有意义吗?)
        x=**(int code * xdata *)f;

        //把f()入口地址处的ROM中两个code型字节,
        //赋给堆栈指针SP指向的字节(想干什么?编操作系统?)
        *(unsigned int idata *)SP=*(unsigned int code *)&f;

        //表示把f()入口地址处的ROM中两个code型字节,
        //作为一个xdata指针寻址,
        //把指向的数据作为pdata指针寻址,
        //再把把指向的数据作为idata指针寻址,
        //把该地址处的一个字节赋给x (我靠,累死了)
        x= ****(unsigned int data * idata * pdata * xdata * code
*)&f;
       
        //总之,一个括号里面外面的"*"一样多就表示指向的是数据。
    }

    {
        //数组函数
        code void (*ArrFn[])(void) =
        {    &f1,
            &f2,
        };
        //可以像引用数组一样调用函数啦:
        (*ArrFn[0])();
        (*ArrFn[1])();
    }

    {
        //这样将使函数调用0000H处:
        void (*reset) (void);
        reset=0x0;
        (*reset)();
        reset();

        //或者直接这样,仅仅生成一条指令LCALL 1234H
        ((void (code *)(void))0x1234)();
    }

    {
        //这样可以调用RETI指令:
        #define  INT_NUM  30    //空闲中断号
        ((void (code *)(void))(INT_NUM*8+3))();
        //当然需要在外面声明   int_rpt()interrupt INT_NUM {}
    }
    {
        //这样调用RETI指令太变态:
        code unsigned char ret_i=0x32;
        ((void (code *)(void))(&ret_i))();
    }
}
int_rpt()interrupt INT_NUM {}

来源:   作者:  2006/9/25 16:50:53
栏目: [ 51单片机Keil C51编程]

相关阅读

几种码制转换 BCD TO HEX,HEX TO BCD ,BIN TO HEX

让Ultra Edit和Keil结合的更紧密

在KEIL C51上仿真完了,怎样生成HEX文件去烧写??

在Keil c51调试中,如何查看外部存储器XDATA?

Keil C51中如何实现代码优化?

C51中 INT 转换为 2个CHAR?

proteus与keil的完美结合(没有开发板,让你也学的爽!)

[转载]C51中断处理过程

Keil C51编译错误总结

C51 的重入问题 WARNING L15: MULTIPLE CALL TO SEGMENT(转)

keil 7.0编译出现:error C316: unterminated conditionals

51单片机CO2检测显示程序解析

Keil C51单片机中变量的使用方法解析

MCS51单片机程序设计时堆栈的计算方法解析

那位大虾能告诉我C51 的printf()函数有什么用?

C51单片机的几种常用延时程序设计

在Keil c51调试中,如何查看特殊寄存器?

volatile的用法

一文知道keil编译程序的过程

SBUF=0x65,c=SBUF结果为c=0???