伪本征函数库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; } |
文章评论(0条评论)
登录后参与讨论