正文

【042】四位数码管对外部中断0响应计数2007-05-05 16:29:00

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

分享到:

  • ;**************************************************************************   
  • ; 标题: 四位数码管对外部中断0响应计数(汇编)   
  • ; 作者: wentao     http://blog.liuwentao.net   
  • ;                  http://wentao.programfan.com   
  • ; 日期: 2007.2.28   
  • ; 软件: Keil A51 V8.00    
  • ; 芯片: AT89X51   
  • ; 说明: 实验板实测通过,数码管为8位共阳   
  • ; 声明: 自用存档!另仅供需要的朋友参考,请勿用做不道德转载及商业用途!    
  • ;**************************************************************************   
  •   
  •          org   0000h  
  •          ajmp  start   
  •          org   0003h        ;外部中断0入口   
  •          ljmp  int_0        ;跳到外部中断0的中断服务程序处   
  •          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   
  •             
  •          setb  it0          ;外部中断0下降沿触发   
  •          setb  ea           ;开总中断   
  •          setb  ex0          ;开外部中断0   
  •             
  • lop:     lcall display      ;调用显示子程序   
  •          ajmp  lop          ;循环等待中断发生   
  •   
  • int_0:                      ;外部中断0的中断服务程序   
  •          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:    reti               ;中断返回   
  •   
  • 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 


  • /**************************************************************************  
  • * 标题: 四位数码管对外部中断0响应计数(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;           // 关所有数码管   
  •        
  •     IT0 = 1;             // 外部中断0下降沿触发   
  •     EA = 1;              // 开总中断   
  •     EX0 = 1;             // 开外部中断0   
  •        
  •     while(1)   
  •     {   
  •         display();       // 调用显示子程序等待中断   
  •     }   
  • }   
  •   
  • void int_0() interrupt 0             // 外部中断0中断服务程序   
  • {   
  •         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清零   
  •                 }   
  •             }   
  •         }   
  • }   
  •   
  • 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++);   
  • }  


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


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

    评论

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