标题: 单片机如何用双位数码管显示计数?目前程序总是一闪而过 [打印本页]

作者: kongxingzhu    时间: 2019-10-15 16:02
标题: 单片机如何用双位数码管显示计数?目前程序总是一闪而过
如题 ,求大神帮忙修改,原想法是从1到60计数,现在个位数能正常,但十位数就是一闪而过,从闪过的数字看是想要的,但是现在怎么修改一下,不要闪,能停留到下个数更新


单片机源程序如下:
  1. #include "stc15.h"
  2. #define  uchar unsigned char
  3. #define  uint unsigned int
  4. #define  SECOND 100
  5. uchar  tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};   //定义共阳极字段码表(1-9-0)
  6. uint count=0;
  7. uint jishu=0;
  8. uint shiwei;
  9. uint gewei;
  10. sbit L1=P3^5;
  11. sbit L2=P3^6;
  12. sbit L3=P3^7;
  13. sbit miao1=P4^0;
  14. sbit miao2=P4^1;
  15. sbit fen1=P4^2;
  16. sbit fen2=P4^3;
  17. sbit shi1=P4^4;
  18. sbit shi2=P4^5;
  19. struct time{
  20.   uchar hour;
  21.         uchar min;
  22.         uchar sec;

  23. };
  24. struct time clocktime _at_ 0x30;
  25. /***********************************延时函数*********************************************/
  26. void delay(uchar s){
  27. uchar k,z;
  28.         for(k=0;k<s;k++)
  29.         for(z=110;z>0;z--);
  30. }
  31. /************************************T0中断函数*****************************************/
  32. timer0() interrupt 1 using 2{
  33. TH0=0xd8;
  34.         TL0=0xf0;
  35.         if(++count == SECOND){
  36.         shiwei=jishu/10;
  37.                 gewei=jishu%10;
  38.                 if(shiwei>=1){
  39.                   miao1=1;
  40.                         miao2=0;
  41.                         P2=tab[shiwei];
  42.                         delay(1000);
  43.                         miao2=1;
  44.                         miao1=0;
  45.                         P2=tab[gewei];
  46.                         delay(1000);
  47.                 }
  48.                 else{
  49.                 miao1=0;
  50.                         P2=tab[gewei];
  51. //                        delay(10);
  52.                 }

  53.                 jishu=jishu+1;
  54.                
  55.                 count=0;
  56.                 L1=~L1;

  57.                

  58.                 if(++clocktime.sec == 60){
  59.                 clocktime.sec=0;L2=~L2;
  60.                         if(++clocktime.min==60){
  61.                         clocktime.min=0;L3=~L3;
  62.                                 if(++clocktime.hour==24){
  63.                                 clocktime.hour=0;P3=0x00;
  64.                                 }
  65.                         }
  66.                 }
  67.         }
  68. }
  69. /************************************主函数*********************************************/
  70. void main(){
  71.   TMOD=0x01;
  72.         TH0=0xd8;TL0=0xf0;
  73.         IE=0x82;TR0=1;

  74.         while(1)
  75.         {

  76.         }
  77.       

  78. }
复制代码



作者: devcang    时间: 2019-10-15 20:20
十位显示后,延时一下。。。。。。。。。另外,不应该在中断中写较多的逻辑代码


~~~~~~~~~~~~~~~~~~~~~~~
作者: 883    时间: 2019-10-15 22:36
delay()延时不应放在中断内,显示会受中断打断
作者: 18819771528    时间: 2019-10-16 00:12
调试的时候按Ctrl+f5
作者: e2407    时间: 2019-10-16 00:29
P2=tab[shiwei];
delay(1000);
miao2=1;
miao1=0;
P2=tab[gewei];
你这里P2先赋值十位,延时一阵子就赋值个位,个位把十位覆盖了
作者: yzwzfyz    时间: 2019-10-16 23:15
能画出流程图吗?估计你画不出来。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1