;************************************************************************** ; 标题: 直控按键低电平触发未处理(汇编) ; 作者: wentao http://blog.liuwentao.net ; http://wentao.programfan.com ; 日期: 2007.3.1 ; 软件: Keil A51 V8.00 ; 芯片: AT89X51 ; 说明: 低电平处发不做处理,键按住时会始终满足满足查询条件执行循环体,所以 ; 松开键时输出状态也不定,实测按住时P0.0口LED常亮,但有些暗,实际上是 ; 在快速执行取反造成的视觉暂留。 ; 声明: 自用存档!另仅供需要的朋友参考,请勿用做不道德转载及商业用途! ;************************************************************************** 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口 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 * 说明: 低电平处发不做处理,键按住时会始终满足满足查询条件执行循环体,所以 * 松开键时输出状态也不定,实测按住时P0.0口LED常亮,但有些暗,实际上是 * 在快速执行取反造成的视觉暂留。 * 声明: 自用存档!另仅供需要的朋友参考,请勿用做不道德转载及商业用途! **************************************************************************/ #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口 } } void delay_ms(uchar ms) // 延时毫秒@12M,ms最大值255 { uchar i; while(ms--) for(i = 0; i < 124; i++); }

评论