找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2220|回复: 12
打印 上一主题 下一主题
收起左侧

单片机驱动8位数码管怎么让其中2位闪烁,求助大佬

[复制链接]
跳转到指定楼层
楼主
ID:884325 发表于 2021-2-15 20:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
现在情况是只能整体闪烁不知道怎么控制其中2位闪烁
代码如下
  1. #include  "reg52.h"
  2. sbit  a=P2^2;
  3. sbit  b=P2^3;
  4. sbit  c=P2^4;
  5. sbit  k1=P3^0;
  6. sbit  k2=P3^1;
  7. sbit  k4=P3^3;
  8. sbit  k8=P3^7;

  9.    unsigned  char  i=0;
  10.    unsigned  int   l=0;
  11.    unsigned   int  flag=0;
  12.    unsigned   int  cishu=1;
  13.    unsigned    ssec=0,sec=5,min=0;
  14.    unsigned   DisplayData[8];
  15.    unsigned code  dongtai[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  16.                                0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
  17.      void  delay(unsigned  int  i)
  18.      {
  19.         while(i--);
  20.      }

  21.             void Timer0Init()
  22.           {
  23.             
  24.                          TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
  25.             TH0=0Xd8;        //给定时器赋初值,定时10ms
  26.                 TL0=0Xf0;        
  27.                 ET0=1;//打开定时器0中断允许
  28.                 EA=1;//打开总中断
  29.                 TR0=1;//打开定时器                        
  30.           }

  31.                      void Timer1Init()
  32.             {
  33.                     TMOD|=0X10;//选择为定时器1模式,工作方式1,仅用TR1打开启动。
  34.                     TH1=0XFC;        //给定时器赋初值,定时1ms
  35.                     TL1=0X18;        
  36.                     ET1=1;//打开定时器1中断允许
  37.                     EA=1;//打开总中断
  38.                     TR1=1;//打开定时器                        
  39.             }

  40.   void  aaa()
  41. {

  42.         DisplayData[4]=dongtai[min/10];
  43.         DisplayData[5]=dongtai[min%10]+0x80;
  44.         DisplayData[6]=dongtai[sec/10];
  45.         DisplayData[7]=dongtai[sec%10];

  46.          
  47.             DisplayData[0]=dongtai[cishu];        
  48.             DisplayData[1]=0x80;
  49.             DisplayData[2]=0x80;
  50.             DisplayData[3]=0x80;
  51.          
  52.          
  53.            if(min==0&&sec==0)
  54.             {
  55.                    DisplayData[4]= 0x3f;
  56.                    DisplayData[5]= 0x3f+0x80;
  57.                    DisplayData[6]= 0x3f;
  58.                    DisplayData[7]= 0x3f;
  59.             }
  60. }
  61.   void  abc()
  62. {
  63.         for(i=0;i<8;i++)
  64.         { switch(i)
  65.           { case(0): a=0;b=0;c=0; break;
  66.             case(1): a=1;b=0;c=0; break;
  67.             case(2): a=0;b=1;c=0; break;
  68.                 case(3): a=1;b=1;c=0; break;
  69.                 case(4): a=0;b=0;c=1; break;
  70.                 case(5): a=1;b=0;c=1; break;
  71.                 case(6): a=0;b=1;c=1; break;
  72.                 case(7): a=1;b=1;c=1; break;
  73.           }
  74.            if(l==1&&(i==0||i==1))
  75.            {
  76.                   Timer1Init();
  77.                            
  78.            }            
  79.           P0=DisplayData[i];
  80.                   
  81.                 delay(100);  
  82.                 P0=0x00;
  83.         
  84.     }                 
  85. }
  86.   void  main()
  87. {
  88.              P0=0x00;
  89.          while(1)
  90.        {  
  91.                    if(k1!=0xFF)
  92.                    delay(1000);
  93.                    if(k1!=0xFF)
  94.                   {                        
  95.                       flag++;
  96.                       if(flag==1)
  97.                         {
  98.                                        
  99.                     }
  100.                    else  if(flag>1)
  101.                   {
  102.                           flag=1;
  103.                           cishu++;
  104.                           if(cishu>=9)
  105.                         {
  106.                             cishu=1;
  107.                     }
  108.                   }
  109.                           Timer0Init();
  110.                                  sec=5;
  111.                             min=0;
  112.                  }  
  113.                  while(!k1);
  114.                              
  115.                   
  116.                    if(k2!=0xFF)
  117.                    delay(30000);
  118.                    if(k2!=0xFF)
  119.                   {                 
  120.                          l++;
  121.                          while(!k2);
  122.                           if(l>=5)
  123.                           {
  124.                            l=0;
  125.                           }
  126.                   }
  127.                   
  128.                   
  129.                   abc();        
  130.                   aaa();
  131.            }                                 
  132. }         

  133.    void Timer0() interrupt 1
  134. {
  135.         TH0=0Xd8;        //给定时器赋初值,定时10ms
  136.         TL0=0Xf0;
  137.         
  138.         ssec++;
  139.         if(ssec>=100)  //1s
  140.         {
  141.           ssec=0;
  142.           sec--;        
  143.           if(sec<=0)
  144.          {
  145.             if(min>0)
  146.            {
  147.                  sec=60;
  148.              min--;
  149.            }
  150.                 if(min<=0)
  151.            {         
  152.                    if(sec==0)
  153.                   {
  154.                       TR0=0;
  155.                   }
  156.            }
  157.          }
  158.         }
  159. }

  160.   void Timer1() interrupt 3
  161. {
  162.         static unsigned  int  j=0;
  163.         TH1=0XFC;        //给定时器赋初值,定时1ms
  164.         TL1=0X18;         
  165.         j++;  
  166.         if(j>=500)         
  167.         {
  168.                 j=0;
  169.           P0=0x00;
  170.           delay(20000);
  171.                   
  172.         }        
  173. }   
复制代码
   

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:332444 发表于 2021-2-16 07:50 | 只看该作者
回复

使用道具 举报

板凳
ID:884325 发表于 2021-2-16 20:12 | 只看该作者
xianfajushi 发表于 2021-2-16 07:50
可参https://blog.csdn.net/xianfajushi/article/details/94927172

多谢大佬我去看看
回复

使用道具 举报

地板
ID:884325 发表于 2021-2-16 20:49 | 只看该作者
xianfajushi 发表于 2021-2-16 07:50
可参https://blog.csdn.net/xianfajushi/article/details/94927172

sbit duan = P2^6;//数码段
sbit wei = P2^7;//数码位

不太明白为什么一个引脚就能控制数码管的位和段显示
我写的是8位数码管呀
真想不明白
回复

使用道具 举报

5#
ID:213173 发表于 2021-2-16 22:23 | 只看该作者
你这程序写得问题不少,难以达到预期效果,给你改了,仿真正常。


  1. #include  "reg52.h"
  2. //sbit  a=P2^2;
  3. //sbit  b=P2^3;
  4. //sbit  c=P2^4;
  5. sbit  k1=P3^0;
  6. sbit  k2=P3^1;
  7. sbit  k4=P3^3;
  8. //sbit  k8=P3^7;

  9. unsigned char num,cishu=0;
  10. //unsigned int   l=0;
  11. bit flag=0;
  12. unsigned int ssec=0;
  13. char sec=0,min=0;
  14. bit sign=0;
  15. bit flash;
  16. unsigned char DisplayData[8];
  17. unsigned char code dongtai[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  18.                                                                 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

  19. void  delay(unsigned int i)
  20. {
  21.         while(i--);
  22. }

  23. void Timer0Init()
  24. {
  25.         TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。      
  26.         TH0 = 0xFC;                //设置定时初值定时1ms
  27.         TL0 = 0x18;                //设置定时初值
  28.         ET0=1;//打开定时器0中断允许
  29.         EA=1;//打开总中断
  30.         TR0=1;//打开定时器                        
  31. }
  32. /*
  33. void Timer1Init()
  34. {
  35.         TMOD|=0X10;//选择为定时器1模式,工作方式1,仅用TR1打开启动。
  36.         TH1=0XFC;        //给定时器赋初值,定时1ms
  37.         TL1=0X18;        
  38.         ET1=1;//打开定时器1中断允许
  39.         EA=1;//打开总中断
  40.         TR1=1;//打开定时器                        
  41. }*/

  42. void  aaa()
  43. {
  44.         DisplayData[0]=dongtai[cishu];        
  45.         DisplayData[1]=0x40;
  46.         DisplayData[2]=0x40;
  47.         DisplayData[3]=0x40;
  48.         if(cishu==0)
  49.         {
  50.                 DisplayData[4]=dongtai[min/10];
  51.                 DisplayData[5]=dongtai[min%10]+0x80;
  52.                 DisplayData[6]=dongtai[sec/10];
  53.                 DisplayData[7]=dongtai[sec%10];
  54.         }
  55.         else
  56.         {
  57.                 if(cishu==1&&flash==1)
  58.                         DisplayData[4]=0;
  59.                 else
  60.                         DisplayData[4]=dongtai[min/10];
  61.                 if(cishu==2&&flash==1)
  62.                         DisplayData[5]=0x80;
  63.                 else
  64.                         DisplayData[5]=dongtai[min%10]+0x80;
  65.                 if(cishu==3&&flash==1)
  66.                         DisplayData[6]=0;
  67.                 else
  68.                         DisplayData[6]=dongtai[sec/10];
  69.                 if(cishu==4&&flash==1)
  70.                         DisplayData[7]=0;
  71.                 else
  72.                         DisplayData[7]=dongtai[sec%10];
  73.         }
  74.    /*
  75.         if(min==0&&sec==0)
  76.         {
  77.                 DisplayData[4]= 0x3f;
  78.                 DisplayData[5]= 0x3f+0x80;
  79.                 DisplayData[6]= 0x3f;
  80.                 DisplayData[7]= 0x3f;
  81.         }*/
  82. }

  83. void abc()
  84. {   
  85.         static unsigned char t=0;
  86.         P0=0x00;
  87.         P2&=0xe3;
  88.         P2|=(t<<2);
  89.         P0=DisplayData[t];
  90.         t=++t%8;
  91. }

  92. void  main()
  93. {
  94. //        P0=0x00;
  95.         Timer0Init();
  96.         while(1)
  97.         {  
  98.                 if(!k1||!k2||!k4)
  99.                 {
  100.                         delay(1000);
  101.                         if((!k1||!k2||!k4) && sign==0)
  102.                         {         
  103.                                 sign=1;
  104.                                 if(!k1 && flag==0)
  105.                                         cishu=++cishu%5;
  106.                                 if(!k2 && cishu>0)
  107.                                 {
  108.                                         switch(cishu)
  109.                                         {
  110.                                                 case 1: min+=10;if(min/10>5)min%=10; break;
  111.                                                 case 2: min++;if(min%10==0)min-=10; break;
  112.                                                 case 3: sec+=10;if(sec/10>5)sec%=10; break;
  113.                                                 case 4: sec++;if(sec%10==0)sec-=10; break;
  114.                                         }
  115.                                 }
  116.                                 if(!k4 && cishu==0)
  117.                                         flag=1;
  118.                         }
  119.                 }
  120.                 else sign=0;   
  121.                 aaa();
  122.         }
  123. }         

  124. void Timer0() interrupt 1
  125. {
  126.         TH0 = 0xFC;                //设置定时初值
  127.         TL0 = 0x18;                //设置定时初值
  128.         if(flag)
  129.         {
  130.                 if(min|sec!=0)
  131.                 {
  132.                         ssec++;
  133.                         if(ssec>=1000)  //1s
  134.                         {
  135.                                 ssec=0;
  136.                                 sec--;        
  137.                                 if(min==0&&sec==0)
  138.                                         flag=0;                       
  139.                                 else if(sec<0)
  140.                                 {
  141.                                         min--;
  142.                                         sec=59;
  143.                                 }
  144.                         }
  145.                 }
  146.                 else flag=0;
  147.         }
  148.         if(++num==200)
  149.         {
  150.                 num=0;
  151.                 flash=~flash;
  152.         }
  153.         abc();
  154. }
  155. /*
  156. void Timer1() interrupt 3
  157. {
  158.         static unsigned  int  j=0;
  159.         TH1=0XFC;        //给定时器赋初值,定时1ms
  160.         TL1=0X18;         
  161.         j++;  
  162.         if(j>=500)         
  163.         {
  164.                 j=0;
  165.                 P0=0x00;
  166.                 delay(20000);
  167.         }        
  168. }*/   
复制代码



回复

使用道具 举报

6#
ID:884325 发表于 2021-2-17 11:14 | 只看该作者
本帖最后由 千年约定 于 2021-2-17 20:29 编辑
wulin 发表于 2021-2-16 22:23
你这程序写得问题不少,难以达到预期效果,给你改了,仿真正常。

大佬很感谢您认真看了我的程序并且花了很多时间进行了修改
很抱歉没在问题上说清楚我的程序具体功能。功能是数码管前两位用来计数倒计时的次数的,最后四位用来做倒计时的时钟,当我按K1按键的时候开始倒计时,当我长按K2按键的时候能够修改次数,分钟,秒钟,修改的时候对应的数码管能够闪烁显示,其他数码管正常显示,K4和K8用来对其加减

将您的程序略作修改后终于实现了2位闪烁功能
非常感谢

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

7#
ID:213173 发表于 2021-2-17 20:45 | 只看该作者
一位或多位数码管闪烁原理时一样的,按你的意图修改并详细注释,应该可以看得懂。
1秒至99分59秒倒计时程序数码管闪烁示例 仿真.zip (124.42 KB, 下载次数: 9)

回复

使用道具 举报

8#
ID:884325 发表于 2021-2-17 23:06 | 只看该作者
wulin 发表于 2021-2-17 20:45
一位或多位数码管闪烁原理时一样的,按你的意图修改并详细注释,应该可以看得懂。

多谢大佬我去好好看看
回复

使用道具 举报

9#
ID:440403 发表于 2021-2-18 00:29 | 只看该作者
为什么一个位和段能控制显示,因为一个单纯的七段数码管就要七个引脚去控制,如果8位的话,就需要56个脚,所以通过位选来选择哪一位显示,节省引脚。因此只能显示一位,但是它显示的很快,肉眼是看不出来的,也就等同于都亮了,你要亮哪个,选哪个就好了。


不用过多纠结,都是电路来的。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

10#
ID:884325 发表于 2021-2-18 09:49 | 只看该作者
两仪式 发表于 2021-2-18 00:29
为什么一个位和段能控制显示,因为一个单纯的七段数码管就要七个引脚去控制,如果8位的话,就需要56个脚, ...

多谢大佬解释
回复

使用道具 举报

11#
ID:556632 发表于 2021-2-19 09:14 | 只看该作者
给高低电平并延时
回复

使用道具 举报

12#
ID:275826 发表于 2021-2-20 15:24 | 只看该作者
楼主问题解决了吗?
回复

使用道具 举报

13#
ID:884325 发表于 2021-3-1 11:47 | 只看该作者
tyrl800 发表于 2021-2-20 15:24
楼主问题解决了吗?

解决了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表