;************************************************************************** ; 标题: 直控按键低电平触发处理(汇编) ; 作者: wentao http://blog.liuwentao.net ; http://wentao.programfan.com ; 日期: 2007.3.1 ; 软件: Keil A51 V8.00 ; 芯片: AT89X51 ; 说明: 实验板实测通过,通过"jnb p1.4,$ ;等待键松开"处理低电平触发 ; 声明: 自用存档!另仅供需要的朋友参考,请勿用做不道德转载及商业用途! ;************************************************************************** org 0000h ajmp start start: mov p1,#0xff ;P1口为准双向口,作输入时写入1,使之为高电平 mov p0,#0xff ;关P0口LED key: ;键扫描 jb p1.4,$ ;P1.4为高即键未按下则重新查询 lcall d_10ms ;有键按下则延时10ms消抖 jb p1.4,key ;再次查P1.4若为高则为抖动,返回重新查询 cpl p0.0 ;确定有键按下后取反P0.0口 jnb p1.4,$ ;等待键松开(直到P1.4变为高电平) ajmp key ;循环 d_10ms: mov r5,#20 ;1+(1+2*255)*20+2*20=10.261ms@12M temp1: mov r6,#255 ;1+2*255 djnz r6,$ djnz r5,temp1 ret end /************************************************************************** * 标题: 直控按键低电平触发处理(C51) * 作者: wentao http://blog.liuwentao.net http://wentao.programfan.com * 日期: 2007.3.1 * 软件: Keil C51 V8.02 * 芯片: AT89X51 * 说明: 实验板实测通过 * 声明: 自用存档!另仅供需要的朋友参考,请勿用做不道德转载及商业用途! **************************************************************************/ #include <reg51.h> #define uchar unsigned char void delay_ms(uchar ms); // 延时毫秒@12M,ms最大值255 sbit P14 = P1^4; // 位变量P14为P1.4 sbit P00 = P0^0; // 位变量P00为P0.0 void main() { P1 = 0xff; // P1口为准双向口,作输入时先写入1,使之为高电平 P2 = 0xff; // 关P0口LED while(1) // 循环扫描按键 { if(P14 == 1) // P1.4为高即键未按下则结束此次循环重新查询 continue; delay_ms(10); // 有键按下则延时10ms消抖 if(P14 == 1) // 再次查P1.4若为高则为抖动,结束此次循环返回重新查询 continue; P00 = !P00; // 确定有键按下后取反P0.0口 while(P14 != 1); // 等待键松开(直到P1.4变为高电平) } } void delay_ms(uchar ms) // 延时毫秒@12M,ms最大值255 { uchar i; while(ms--) for(i = 0; i < 124; i++); }

评论