正文

【030】直控按键低电平触发未处理2007-05-02 18:24:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/wentao/25476.html

分享到:

  • ;**************************************************************************   
  • ; 标题: 直控按键低电平触发未处理(汇编)   
  • ; 作者: 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++);   
  • }

  • 阅读(3680) | 评论(0)


    版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

    评论

    暂无评论
    您需要登录后才能评论,请 登录 或者 注册