原创 伪本征函数库HotIns.h演示程序

2009-1-11 17:03 3422 1 1 分类: MCU/ 嵌入式
 

伪本征函数库HotIns.h演示程序——InsDemo.c(hotpower)

伪本征函数库HotIns.h演示程序——InsDemo.c(hotpower)

/*-------------------------------------------------------
伪本征函数库文件HotIns.H应用演示程序
根据HotPower的“同名小说《Keil C51红杏出墙记》”改编
HotPower 2004.6.8 于西安大雁塔村大队部
INSDEMO.C
-------------------------------------------------------*/
#include <AT89X52.h>
#include <stdio.h>
#include <absacc.h>
#include <intrins.h>
#include <HotIns.h>//伪本征函数库文件

void sub(unsigned char x, unsigned char y);

void Key0(void);
void Key1(void);
void Key2(void);
void Key3(void);
void Key4(void);
void Key5(void);
void Key6(void);
void Key7(void);

void Key00(void);
void Key01(void);
void Key02(void);
void Key03(void);
void Key10(void);
void Key11(void);
void Key12(void);
void Key13(void);
void Key20(void);
void Key21(void);
void Key22(void);
void Key23(void);

code void *KeyArray[3][4] = {//二维函数数组指针阵列表(散转命令地址表)
{Key00, Key01, Key02, Key03},
{Key10, Key11, Key12, Key13},
{Key20, Key21, Key22, Key23}
};

code void *KeyTab[] = {//一维函数数组指针表(散转命令地址表)
Key0, Key1, Key2, Key3, Key4, Key5, Key6, Key7,
};

code unsigned char RestCodes[] = {//汇编代码集合
0xe4,0xc0,0xe0,0xc0,0xe0,0x32
};

_db_(RestCode, "\xe4\xc0\xe0\xc0\xe0\x32");//汇编代码集合

void main(void)
{
unsigned char i, j;
goto xyz;//调试中断隐身函数_intjmp_();
_daa_();
i = 0x15;
j = 0x69;
i = _swapr_(i);
j = _swapr_(j);
_lcall_(Key6);
_ljmp_(Key12);
// _ljmp_(0x100);
_reset_();//软复位函数
/*
“伪本征函数_db_(TABNAME, TAB)”的应用
例:在51汇编中,常用以下汇编代码进行软复位
RestCode: //代码
clr a; //0xe4
push acc; //0xc0 0xe0
push acc; //0xe4 0xe0
reti; //0x32
而在C51中若不想嵌入汇编,可以通过在代码段内放置数组即可
code unsigned char RestCodes[] = {
0xe4,0xc0,0xe0,0xc0,0xe0,0x32
};
*/
/*--------------------------------------------
伪本征函数_icall_()的几种非典应用
注意:不需理睬告警信息,其他伪本征函数的应用自学吧!!!
---------------------------------------------*/
/*--------------------------------------------
1.实现中断函数不能被主程序外部直接调用的问题
达到中断函数复用的目的
---------------------------------------------*/
_icall_((IE0_VECTOR * 8) 3);//INT0_VECTOR();
_icall_((TF1_VECTOR * 8) 3);//T1_VECTOR();
_icall_(0x0013); //INT1_VECTOR();
/*--------------------------------------------
2.实现等价的函数直接调用
---------------------------------------------*/
_icall_(Key6); //Key6();
_icall_(Key10); //Key10();
/*--------------------------------------------
3.实现等价的函数的内部直接调用
---------------------------------------------*/
_icall_(Key1 1); //实现Key1Start();
_icall_(Key1 2); //实现Key1Quit();
/*--------------------------------------------
4.实现函数数组的的间接调用
主要是实现汇编中的散转命令,替代switch命令
例如:PS2键盘的“海量键码等时识别”技术
消除case 0到case n的识别“时间差”
---------------------------------------------*/
_icall_(KeyTab[3]); //实现Key3();
_icall_(KeyArray[2][1]); //实现Key21();
i = 3;
_icall_(KeyTab); //实现Key3();
i = 2; j = 1;
_icall_(KeyArray[j]); //实现Key21();
/*--------------------------------------------
5.实现任意地址的直接调用(可能不是程序区)
可以模拟干扰时程序飞后看门狗是否管用
---------------------------------------------*/
_icall_(0x0038); //icall 0x0038;
_icall_(0x0000); //icall 0x0000;
_icall_(RestCode); //icall RestCode
_icall_(RestCodes); //icall RestCodes

// x = 5;
// y = 6;
// _icall_(sub);
xyz:
IT0 = 1;
EX0 = 1;//调试中断隐身函数_intjmp_();
EA = 1;
while(1)
{
P3_2 = ~ P3_2;//自动翻转引发INT0中断,以便调试
_nop_();
_nop_();
}
}

void Key0(void)
{
}
void Key1(void)
{
_nop_();
Key1Start:
_nop_();
Key1Quit:
_nop_();
}
void Key2(void)
{
}
void Key3(void)
{
}
void Key4(void)
{
}
void Key5(void)
{
}
void Key6(void)
{
unsigned char i, j;
i = 0x15;
j = 0x69;
i = _swapr_(i);
j = _swapr_(j);

}
void Key7(void)
{
_icall_(Key6); //实现Key6();
_icall_(KeyTab[1]); //实现Key1();
_icall_(KeyArray[1][2]); //实现Key12();
}
void Key00(void)
{
}
void Key01(void)
{
}
void Key02(void)
{
}
void Key03(void)
{
}
void Key10(void)
{
}
void Key11(void)
{
}
void Key12(void)
{
}
void Key13(void)
{
}
void Key20(void)
{
}
void Key21(void)
{
}
void Key22(void)
{
}
void Key23(void)
{
_icall_(Key7); //实现Key7();
_icall_(KeyTab[3]); //实现Key3();
_icall_(KeyArray[2][1]); //实现Key21();
P1_0 = 1;//允许INT0中断重入Key23()
}


/*------------------------------------
外部INT0中断服务程序
中断隐身函数演示
------------------------------------*/
void INT0_VECTOR() interrupt IE0_VECTOR
{
if (P1_0) {//可在此处设断点对本文进行调试及学习
P1_0 = 0;//禁止INT0中断重入Key23(),在此后主中断只计数,等开放后再继续做详细
处理
_intjmp_(Key23);//中断隐身函数,将原在此处执行的任务“移入”到Key23()进行后台
工作
}
}

/*------------------------------------
定时器T1中断服务程序
------------------------------------*/
void T1_VECTOR() interrupt TF1_VECTOR// using 1
{
}

/*------------------------------------
外部INT1中断服务程序
------------------------------------*/
void INT1_VECTOR() interrupt IE1_VECTOR using 2
{
}

void sub(unsigned char x, unsigned char y)
{
P1 = x;
P2 = y;
}

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
1
关闭 站长推荐上一条 /3 下一条