#include<reg51.h> #include<intrins.h> #define u8 unsigned char sbit key8=P3^3; u8 x; void Delay10ms() //@12.000MHz { unsigned char i, j; i = 20; j = 113; do { while (--j); } while (--i); } void main() { INT1=1; EX1=1; EA=1; while(1); } void INT1() interrupt 2 //看自己板子外部中断1的中断向量号 { Delay10ms(); if(!key8) { x=P1; //读取P1端口值,不要直接对端口操作 x>>=4; //将端口值的高四位右移到低四位 x|=0xf0; //将端口数值的高四位置一,为下一次读取做准备 P1=x; //将端口数值赋给端口 } while(!key8); //如果你要按着按键,灯是不会亮的,解决方法就是将这句程序规定时间退出。 } 刚学,只会用C编写,如果不需要看思路就行了。 |
上面程序其思路就是:首先要设置外部中断1能产生中断,还要考虑中断触发方式,然后产生中断时要读出P1口高4位的编码开关状态(接通时状态为0),因LED与开关接在同一端口,所以考虑高4位与低4位交换即可,而且开关导通时状态为0,可直接输出至P1口控制LED |
ORG 0000H JMP MAIN ORG 0013H ;中断入口地址 JMP ZHDU ORG 0050H MOV IE,#84H ;设置外部中断1允许 SETB IE1 ;下降沿触发 JMP $ ZHDU: MOV A,P1 ;读P1口开关状态 SWAP A ;交换 MOV P1,A ;根据开关状态点亮LED RETI END |
下载一个STCISP软件,里面有例程。 |
首先要设置EX1=1,EA=1,然后0013H处调用中断子程序。 中断子程序中,读入P1口,屏蔽低四位,然后高低字节交换,再送回P1口,然后返回。 这样描述不知道清楚吗? |