正文

【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++);    }

阅读(9114) | 评论(0)


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

评论

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