正文

【033】直控按键控制led循环方向2007-05-02 19:42:00

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

分享到:

;**************************************************************************    ; 标题: 直控按键控制led循环方向(汇编)    ; 作者: wentao     http://blog.liuwentao.net    ;                  http://wentao.programfan.com    ; 日期: 2007.2.21    ; 软件: Keil A51 V8.00     ; 芯片: AT89X51    ; 说明: 实验板实测通过    ; 声明: 自用存档!另仅供需要的朋友参考,请勿用做不道德转载及商业用途!     ;**************************************************************************       k1 bit p1.4  ;K1按键与P1.4口相连    k2 bit p1.5  ;K2按键与P1.5口相接                  org   0000h              ajmp  start               org   0030h   start:     mov   p0,#0xfe      ;初始点亮P0.0               mov   p1,#0xff      ;P1口准双向,作为输入先写入1               mov   30h,#0x03     ;30单元存储键状态,初始为00000011               mov   31h,#0x00     ;31单元检测键值时临时存储键状态    wait_key:  lcall scan_key      ;扫描按键(键值存于a中)               mov   31h,a         ;键值送31单元               xrl   a,30h         ;检测键是否改变               jz    wait_key      ;未改变则继续扫描               lcall delay10ms     ;延时10ms去抖               lcall scan_key      ;继续扫描键值               mov   31h,a         ;键值送31单元               xrl   a,30h         ;检测键是否改变               jz    wait_key      ;未改变则继续扫描                              mov   30h,31h       ;将读到的键值存入30单元               lcall key           ;处理按键               ajmp  wait_key      ;循环扫描按键                   scan_key:                      ;按键扫描子程序[liuwentao]               clr   a             ;a清零               mov   c,k1          ;将位变量K1送入c               mov   acc.0,c       ;将c中的K1值送入a中(第0位)               mov   c,k2          ;将位变量K2送入c               mov   acc.1,c       ;将c中的K2值送入a中(第1位)               ret                  key:                           ;按键处理子程序               mov   a,30h         ;将30单元中的键值送入a               cjne  a,#0x02,goon  ;键值不为00000010(K1)转而检测是否为K2               ajmp  key_k1        ;为K1键值则转K1处理部分    goon:      cjne  a,#0x01,back  ;键值也不为00000001(K2)则结束               ajmp  key_k2        ;为K2键值则转K2处理部分    back:      ret   key_k1:                        ;K1键处理子程序               mov   a,p0          ;当前p0口显示状态送入a               rl    a             ;循环左移               mov   p0,a          ;送入p0显示               ret   key_k2:                        ;k2键处理子程序               mov   a,p0          ;当前p0口显示状态送入a               rr    a             ;循环右移               mov   p0,a          ;送入p0显示               ret      delay10ms: mov   r5,#20        ;1+(1+2*255)*20+2*20=10.261ms@12M    temp:      mov   r6,#255       ;1+2*255               djnz  r6,$               djnz  r5,temp               ret      end   /**************************************************************************   * 标题: 直控按键控制led循环方向(C51)   * 作者: wentao     http://blog.liuwentao.net                      http://wentao.programfan.com   * 日期: 2007.2.21   * 软件: Keil C51 V8.02   * 芯片: AT89X51   * 说明: 实验板实测通过   * 声明: 自用存档!另仅供需要的朋友参考,请勿用做不道德转载及商业用途!    **************************************************************************/      #include <reg51.h>    #include <intrins.h>       #define uchar unsigned char       sbit K1 = P1^4;          // K1按键与P1.4口相连    sbit K2 = P1^5;          // K2按键与P1.5口相接       uchar scan_key();        // 按键扫描子程序    void key(uchar key_s);   // 按键处理子程序    void delay_ms(uchar ms); // 延时毫秒@12M,ms最大值255       void main()    {      uchar data key_s = 0x03; // key_s存储键状态,初始为00000011      uchar data key_t = 0x00; // key_t检测键值时临时存储键状态            P0 = 0xfe;               // 初始点亮P0.0        P1 = 0xff;               // P1口为准双向口,作输入时先写入1,使之为高电平        while(1)        {            key_t = scan_key();     // 扫描按键            if(key_t != key_s)      // 键值发生改变            {              delay_ms(10);       // 延时10ms去抖              key_t = scan_key(); // 再次扫描              if(key_t != key_s); // 键值改变              {                key_s = key_t;  // 存储键状态                key(key_s);     // 按键处理              }            }        }    }    uchar scan_key()                // 按键扫描子程序    {      uchar data key_m = 0x00;    // 键值临时变量      key_m |= K2;                // 读K2值到key_m      key_m <<= 1;                // K2值存和key_m第1位      key_m |= K1;                // 读K1值到key_m第0位      return key_m;               // 送回键值    }    void key(uchar key_s)           // 按键处理子程序    {      if(key_s == 0x02)           // 键值为00000010(K1)        P0 = _crol_(P0,1);      // P0口左移一位显示      else     {          if(key_s == 0x01)       // 键值为00000001(K2)              P0 = _cror_(P0,1);  // P0口右移一位显示        }    }    void delay_ms(uchar ms)         // 延时毫秒@12M,ms最大值255    {        uchar i;        while(ms--)            for(i = 0; i < 124; i++);    }

阅读(9903) | 评论(1)


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

评论

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