INT1下降沿触发怎么写

1.51单片机INT1中断电平触发方式和跳变沿触发方式有什么区别INT1的边沿触发只有下降沿有效,换句话说,只要出现了下降沿那肯定出现了低电平,所以对于单个中断来说,电平与边沿没区别 。真正的区别在于:
电平触发方式时,中断标志寄存器不锁存中断请求信号 。也就是说,单片机把每个机器周期的S5P2采样到的外部中断源口线的电平逻辑直接赋值到中断标志寄存器 。标志寄存器对于请求信号来说是透明的 。这样当中断请求被阻塞而没有得到及时响应时,将被丢失 。换句话说,要使电平触发的中断被CPU响应并执行,必须保证外部中断源口线的低电平维持到中断被执行为止 。因此当CPU正在执行同级中断或更高级中断期间,产生的外部中断源(产生低电平)如果在该中断执行完毕之前撤销(变为高电平)了,那么将得不到响应,就如同没发生一样 。同样,当CPU在执行不可被中断的指令(如RETI)时,产生的电平触发中断如果时间太短,也得不到执行 。
边沿触发方式时,中断标志寄存器锁存了中断请求 。中断口线上一个从高到低的跳变将记录在标志寄存器中,直到CPU响应并转向该中断服务程序时,由硬件自动清除 。因此当CPU正在执行同级中断(甚至是外部中断本身)或高级中断时,产生的外部中断(负跳变)同样将被记录在中断标志寄存器中 。在该中断退出后,将被响应执行 。如果不希望这样,必须在中断退出之前,手工清除外部中断标志 。
2.请写出 INT0非 为下降沿触发方式的中断初始化程序入口参数 出口参数 AX=0001显示光标 无 无 AX=0003取光标位置与状态钮 BX(b=0;左键,b=2右键 。
) ------------ 显示鼠标: r.x.ax=1int86(0x33,&x,&x) 检测鼠标 r.x.ax=3int86(0x33,&x,&x) if(r.x.bx=1) {当左键按下时完成的程序 。..} if(r.x.bx=2)。
.. 事实上就这么简单!任何一个中断的调用者是这么简单 。下面的程序是比较规范的经典的鼠标函数 。
就不一一界绍了 。#include #include "dos.h" union REGS r; typedef struct {unsigned int shape[32]; char hotx; char hoty; }Shape; Shape hand= {{ 0xe7ff,0xc3ff,0xc3ff,0xc07f,0xc00f,0xc001,0xc001,0xc001, 0x8001,0x8001,0x8001,0xc003,0xc003,0xe007,0xe007,0xe007, 0x1800,0x2400,0x2400,0x2580,0x26b0,0x26d6,0x2232,0x2222, 0x4222,0x4002,0x4002,0x2004,0x2004,0x1ff8,0x1008,0x1ff8},0,0}; void mouseshape(Shape sp) {_BX=sp.hotx; _CX=sp.hoty; _ES=FP_SEG(&sp.shape); _DX=FP_OFF(&sp.shape); _AX=0x09; geninterrupt(0x33); } void mouse_IQR(int *num,int *bx,int *cx,int *dx) /*33H鼠标中断核心函数*/ { r.x.ax=*num; /*寄存器初始化*/ r.x.bx=*bx; r.x.cx=*cx; r.x.dx=*dx; int86(0x33,&r,&r); /*中断调用*/ *bx=r.x.bx; *cx=r.x.cx; *dx=r.x.dx; *num=r.x.ax; } void init_mouse() /*鼠标初始化,检验是否安装鼠标驱动程序*/ { int num=0; mouse_IQR(&num,&num,&num,&num); if(num!=-1) { printf("Mouse not installed!"); exit(1); } } void show_mouse() /*鼠标显示函数*/ { int num=1; mouse_IQR(&num,&num,&num,&num); } void off_mouse() /*鼠标关闭函数*/ { int num=2; mouse_IQR(&num,&num,&num,&num); } void home(int *x,int *y) /*鼠标状态检验函数*/ { int button=0,num; num=3; mouse_IQR(&num,&button,x,y); } int left_press() /*鼠标左键状态检验函数,按下则返回1*/ { int bx=0,num=3; mouse_IQR(&num,&bx,&num,&num); return bx&1; } int right_press() /*鼠标左键状态检验函数,按下则返回1*/ { int bx=0,num=3; mouse_IQR(&num,&bx,&num,&num); return bx&2; } /*main() { int gd=DETECT,gm; initgraph(&gd,&gm,""); init_mouse(); show_mouse(); mouseshape(hand_2); for(;;) { if(left_press()==1) break; } mouseshape(hand); getch(); off_mouse(); closegraph(); exit(1); }*/ main()中你可以测试一下 。
在程序中有这样的段代码 Shape hand= {{ 0xe7ff,0xc3ff,0xc3ff,0xc07f,0xc00f,0xc001,0xc001,0xc001, 0x8001,0x8001,0x8001,0xc003,0xc003,0xe007,0xe007,0xe007, 0x1800,0x2400,0x2400,0x2580,0x26b0,0x26d6,0x2232,0x2222, 0x4222,0x4002,0x4002,0x2004,0x2004,0x1ff8,0x1008,0x1ff8},0,0}; 。