找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2160|回复: 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: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位数码管呀
真想不明白
回复

使用道具 举报

地板
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 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

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

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

使用道具 举报

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

多谢大佬解释
回复

使用道具 举报

7#
ID:884325 发表于 2021-3-1 11:47 | 显示全部楼层
tyrl800 发表于 2021-2-20 15:24
楼主问题解决了吗?

解决了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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