正文

【036】多位数码管动态显示软延时实现2007-05-05 16:22:00

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

分享到:

;**************************************************************************    ; 标题: 多位数码管动态显示软延时实现(汇编)    ; 作者: wentao     http://blog.liuwentao.net    ;                  http://wentao.programfan.com    ; 日期: 2007.2.21    ; 软件: Keil A51 V8.00     ; 芯片: AT89X51    ; 说明: 实验板实测通过,数码管为8位共阳    ;       anl 30h,#07h起如下作用    ;                   mov   a,30h        ;取循环控制变量    ;                   cjne  a,#8,lop     ;未到8则继续    ;                   mov   30h,#0       ;到8后清0    ; 声明: 自用存档!另仅供需要的朋友参考,请勿用做不道德转载及商业用途!     ;**************************************************************************               org   0000h           ajmp  start            org   0030h   start:  mov   30h,#0       ;30单元为显示值(查段码表时的偏址)兼循环控制,初始为0            mov   31h,#0xfe    ;31单元为位码(选通各位数码管),初值为11111110            mov   dptr,#table  ;段码表首址    lop:    mov   a,30h        ;取欲显示值            movc  a,@a+dptr    ;对应段码表中码值送入a            mov   p0,a         ;段码送入P0口            mov   p2,31h       ;位码(在31h单元中)送入P2口            lcall d_1ms        ;动态显示各位间隔为1ms            mov   a,31h        ;取位码到a            rl    a            ;位码循环左移以选通下一个数码管            mov   31h,a        ;更改后的位码送回31h单元            inc   30h          ;30单元加1以显示下一个数(循环控制加1)            anl   30h,#0x07    ;使30单元增到8时自动归0(控制30单元在0~7之间)            ajmp  lop          ;循环       d_1ms:                     ;延时1ms子程序@12M(1.001ms)            mov   r7,#250     ;1+(1+1+2)*250=1001    temp:   nop           nop           djnz  r7,temp            ret      table:  db 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8  ;段码表             ;   0    1    2    3    4    5    6    7    对应内容            db 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e            ;   8    9    a    b    c    d    e    f       end  /**************************************************************************   * 标题: 多位数码管动态显示软延时实现(C51)   * 作者: wentao     http://blog.liuwentao.net                      http://wentao.programfan.com   * 日期: 2007.2.21   * 软件: Keil C51 V8.02   * 芯片: AT89X51   * 说明: 实验板实测通过,数码管为8位共阳,循环用while   * 声明: 自用存档!另仅供需要的朋友参考,请勿用做不道德转载及商业用途!    **************************************************************************/      #include <reg51.h>    #include <intrins.h>       #define uchar unsigned char       void delay_ms(uchar ms);  // 延时毫秒@12M,ms最大值255       uchar code dis_code[16] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, //段码表                              // 0    1    2    3    4    5    6    7   //对应内容                               0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};                              // 8    9    a    b    c    d    e    f    void main()    {      uchar data i = 0x00;  // 循环控制变量兼偏移量,初值为0      uchar data j = 0xfe;  // 位码(选通各位数码管),初值为11111110         while(1)      {            P2 = j;            // 位码送入P2口显示            P0 = dis_code[i];  // 段码表中取值送P0口            delay_ms(1);       // 动态显示各位间隔为1ms            j = _crol_(j,1);   // 位码循环左移1位选通下一数码管            i++;               // 偏移量加1取下一段码(循环控制加1)            i &= 0x07;         // 偏量增到8时自动归0(控制在0~7之间循环)      }    }    void delay_ms(uchar ms)    // 延时毫秒@12M,ms最大值255    {        uchar i;        while(ms--)            for(i = 0; i < 124; i++);    } /**************************************************************************   * 标题: 多位数码管动态显示软延时实现(C51)   * 作者: wentao     http://blog.liuwentao.net                      http://wentao.programfan.com   * 日期: 2007.2.21   * 软件: Keil C51 V8.02   * 芯片: AT89X51   * 说明: 实验板实测通过,数码管为8位共阳,循环用for   * 声明: 自用存档!另仅供需要的朋友参考,请勿用做不道德转载及商业用途!    **************************************************************************/      #include <reg51.h>    #include <intrins.h>       #define uchar unsigned char       void delay_ms(uchar ms);  // 延时毫秒@12M,ms最大值255       uchar code dis_code[16] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, //段码表                              // 0    1    2    3    4    5    6    7   //对应内容                               0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};                              // 8    9    a    b    c    d    e    f    void main()    {      uchar data i = 0x00;  // 循环控制变量兼偏移量,初值为0      uchar data j = 0xfe;  // 位码(选通各位数码管),初值为11111110         while(1)      {        for(i = 0; i < 8; i++)        {              P2 = j;            // 位码送入P2口显示              P0 = dis_code[i];  // 段码表中取值送P0口              delay_ms(1);       // 动态显示各位间隔为1ms              j = _crol_(j,1);   // 位码循环左移1位选通下一数码管        }      }    }    void delay_ms(uchar ms)    // 延时毫秒@12M,ms最大值255    {        uchar i;        while(ms--)            for(i = 0; i < 124; i++);    }

阅读(11428) | 评论(1)


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

评论

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