正文

【041】四位数码管计数演示2007-05-05 16:28:00

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

分享到:

;**************************************************************************    ; 标题: 四位数码管计数演示(汇编)    ; 作者: wentao     http://blog.liuwentao.net    ;                  http://wentao.programfan.com    ; 日期: 2007.3.2    ; 软件: Keil A51 V8.00     ; 芯片: AT89X51    ; 说明: 实验板实测通过,数码管为8位共阳    ; 声明: 自用存档!另仅供需要的朋友参考,请勿用做不道德转载及商业用途!     ;**************************************************************************                org   0000h            ajmp  start             org   0030h   start:   mov   30h,#0       ;30单元存储个位值             mov   31h,#0       ;31单元存储十位值             mov   32h,#0       ;32单元存储百位值             mov   33h,#0       ;33单元存储千位值             mov   p2,#0xff     ;关所有数码管             mov   dptr,#table  ;数码管段码表首址送入dptr                 lop:     lcall display      ;调用显示子程序                inc   30h          ;个位值加1             mov   a,30h        ;个位值送入a             cjne  a,#10,over   ;个位未到10则结束此次循环             mov   30h,#0       ;个位到10清零                          inc   31h          ;十位值加1(个位到10的进位)             mov   a,31h        ;十位值送入a             cjne  a,#10,over   ;十位未到10则结束此次循环             mov   31h,#0       ;十位到10清零                          inc   32h          ;百位值加1(十位到10的进位)             mov   a,32h        ;百位值送入a             cjne  a,#10,over   ;百位未到10则结束此次循环             mov   32h,#0       ;百位到10清零                          inc   33h          ;千位值加1(百位到10的进位)             mov   a,33h        ;千位值送入a             cjne  a,#10,over   ;千位未到10则结束此次循环             mov   33h,#0       ;千位到10清零       over:    ajmp  lop          ;循环       display:                    ;显示子程序                      mov   r0,#50       ;用于延长四位数的显示时间    d_lop:                mov   a,30h        ;取个位值             movc  a,@a+dptr    ;个位数对应的段码送入a中             mov   p0,a         ;段码送入P0口             mov   p2,#0x7f     ;开个位显示(P2.7口控制个位数码管)             lcall d_1ms        ;延时1ms使四位数码管动态显示时能看清                          mov   a,31h        ;取十位值             movc  a,@a+dptr    ;十位数对应的段码送入a中             mov   p0,a         ;段码送入P0口             mov   p2,#0xbf     ;开十位显示(P2.6口控制十位数码管)             lcall d_1ms        ;延时1ms作用同上                          mov   a,32h        ;取百位值             movc  a,@a+dptr    ;百位数对应的段码送入a中             mov   p0,a         ;段码送入P0口             mov   p2,#0xdf     ;开百位显示(P2.5口控制十位数码管)             lcall d_1ms        ;延时1ms作用同上                          mov   a,33h        ;取千位值             movc  a,@a+dptr    ;千位数对应的段码送入a中             mov   p0,a         ;段码送入P0口             mov   p2,#0xef     ;开千位显示(P2.4口控制十位数码管)             lcall d_1ms        ;延时1ms作用同上                          djnz  r0,d_lop     ;延长每个四位数的显示时间             ret      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,0x80,0x90  ;段码表             ;   0    1    2    3    4    5    6    7    8    9    对应内容       end  /**************************************************************************   * 标题: 四位数码管计数演示(C51)   * 作者: wentao     http://blog.liuwentao.net                      http://wentao.programfan.com   * 日期: 2007.3.2   * 软件: Keil C51 V8.02   * 芯片: AT89X51   * 说明: 实验板实测通过,数码管为8位共阳   * 声明: 自用存档!另仅供需要的朋友参考,请勿用做不道德转载及商业用途!    **************************************************************************/      #include <reg51.h>       #define uchar unsigned char       void delay_ms(uchar ms);  // 延时毫秒@12M,ms最大值255    void display();           // 显示子程序       uchar code dis_code[10] = {0xc0,0xf9,0xa4,0xb0,0x99,  //段码表                              // 0    1    2    3    4      对应内容                               0x92,0x82,0xf8,0x80,0x90};                              // 5    6    7    8    9       uchar data dis_0 = 0;     // 个位值    uchar data dis_1 = 0;     // 十位值    uchar data dis_2 = 0;     // 百位值    uchar data dis_3 = 0;     // 千位值       void main()    {        P2 = 0xff;           // 关所有数码管           while(1)        {            display();       // 调用显示子程序                        dis_0++;         // 个位值加1            if(dis_0 != 10)  // 个位未到10则结束此次循环                continue;               dis_0 = 0;       // 个位到10清零                    dis_1++;         // 十位值加1(个位到10的进位)            if(dis_1 != 10)  // 十位未到10则结束此次循环                continue;               dis_1 = 0;       // 十位到10清零                    dis_2++;         // 百位值加1(十位到10的进位)            if(dis_2 != 10)  // 百位未到10则结束此次循环                continue;               dis_2 = 0;       // 百位到10清零                    dis_3++;         // 千位值加1(百位到10的进位)            if(dis_3 != 10)  // 千位未到10则结束此次循环                continue;               dis_3 = 0;       // 千位到10清零        }    }    void display()                // 显示子程序    {        uchar data i = 50;        // 用于延长每四位数的显示时间        while(i--)                // 直到i减为0        {            P0 = dis_code[dis_0]; // 取个位的段码            P2 = 0x7f;            // 开个位显示(P2.7口控制个位数码管)            delay_ms(1);          // 延时1ms使四位数码管动态显示时能看清                        P0 = dis_code[dis_1]; // 取十位的段码            P2 = 0xbf;            // 开十位显示(P2.6口控制十位数码管)            delay_ms(1);          // 延时1ms作用同上                        P0 = dis_code[dis_2]; // 取百位的段码            P2 = 0xdf;            // 开百位显示(P2.5口控制十位数码管)            delay_ms(1);          // 延时1ms作用同上                        P0 = dis_code[dis_3]; // 取千位的段码            P2 = 0xef;            // 开千位显示(P2.4口控制十位数码管)            delay_ms(1);          // 延时1ms作用同上        }    }    void delay_ms(uchar ms)       // 延时毫秒@12M,ms最大值255    {        uchar i;        while(ms--)            for(i = 0; i < 124; i++);    }       /* 计数部分还可用如下方式实现             dis_0++;                     // 个位值加1           if(dis_0 == 10)              // 个位未到10则结束           {               dis_0 = 0;               // 个位到10清零                       dis_1++;                 // 十位值加1(个位到10的进位)               if(dis_1 == 10)          // 十位未到10则结束               {                   dis_1 = 0;           // 十位到10清零                           dis_2++;             // 百位值加1(十位到10的进位)                   if(dis_2 == 10)      // 百位未到10则结束                   {                       dis_2 = 0;       // 百位到10清零                               dis_3++;         // 千位值加1(百位到10的进位)                       if(dis_3 == 10)  // 千位未到10则结束                           dis_3 = 0;   // 千位到10清零                   }               }           }   */ 

阅读(13034) | 评论(3)


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

评论

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