找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2180|回复: 9
收起左侧

单片机想要两位LED都显示数字,该怎么办?附程序

[复制链接]
ID:1015298 发表于 2022-4-19 16:55 | 显示全部楼层 |阅读模式
我开头是这么设定的         
        #include<math.h>
        #include <reg51.h>
        #define  uchar unsigned char
        #define  uint unsigned int
          char led[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
          char led1[]={0x3f,0x06,0x5b,0x4f,0xe66,0x6d,0x7d,0x07,0x7f,0x6f};
          sbit P3_7=P3^7;                        //加键
          sbit P3_6=P3^6;                   //减键
          sbit P3_1=P3^1;
          sbit P3_0=P3^0;
          sbit P3_4=P3^4;                 //模式选择(设置输出电压值模式or电压输出模式)         
          uchar set=50,tj=0;
          显示程序是这样的
        //显示两位数码管
                                                         
                                                                P3_0=0;         P3_1=1;
                                                        P0=led[set/10];        
                                                        delay(50)        ;                                       
                                                        P3_0=1;         P3_1=0;
                                                        P0=led1[set%10];               
                                                                        delay(50)        ;
        然后当我进行仿真的时候,按下确定键,显示是这样的

        现在我想要它两个都显示,应该怎么办,


捕获.PNG
回复

使用道具 举报

ID:332444 发表于 2022-4-19 21:04 | 显示全部楼层
P0=~led1[set%10];  试看
回复

使用道具 举报

ID:752974 发表于 2022-4-20 08:48 | 显示全部楼层
这个代码运行到个位显示就结束了,当然只有个位在显示了。要想两位都显示,需要不停的循环运行显示代码部分,这是动态显示电路工作的基本原理。
回复

使用道具 举报

ID:1015298 发表于 2022-4-20 14:00 | 显示全部楼层
munuc_w 发表于 2022-4-20 08:48
这个代码运行到个位显示就结束了,当然只有个位在显示了。要想两位都显示,需要不停的循环运行显示代码部分 ...

该怎么写,求指导,
回复

使用道具 举报

ID:1015298 发表于 2022-4-20 14:01 | 显示全部楼层
xianfajushi 发表于 2022-4-19 21:04
P0=~led1[set%10];  试看

不行啊,还是只亮各位
回复

使用道具 举报

ID:161164 发表于 2022-4-20 14:33 | 显示全部楼层
代码只给一部份如瞎子摸象
问题现象加上现有代码
可退敲出几个问题可能
1. 没有消影
2. 延时不足
3. 其他代码耗时太长
回复

使用道具 举报

ID:121859 发表于 2022-4-20 15:13 | 显示全部楼层
你的延时时间可能有问题,一般这个延时时间几个毫秒。
回复

使用道具 举报

ID:1015298 发表于 2022-4-20 23:32 | 显示全部楼层
lkc8210 发表于 2022-4-20 14:33
代码只给一部份如瞎子摸象
问题现象加上现有代码
可退敲出几个问题可能

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uint aa,b,bb;
sbit p1=P2^7;
sbit p2=P2^6;
sbit p3=P2^5;
sbit p4=P2^4;
sbit dp=P0^7;
sbit an1=P1^4;
sbit an2=P1^5;
sbit an3=P1^6;
sbit CLK=P1^2;/*定义DAC控制端口*/
sbit CS=P1^1;
sbit DIN=P1^3;
uchar code SegCode[12] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xc1};
int moshi=0;
void DelayMs(uchar n)
{
        uchar j;
        while (n--)            
        {
                for (j = 0; j < 113; j++);
        }
}

void keyscan1()        /*复位*/
{
    if(an1==0)
     {  aa=0;
                bb=0;
       
         }
    while(an1==0);
}

void keyscan2()        /*按键1进行加1*/
{
    if(an2==0)
     {
                         if(aa<99)
                         {
                                 aa=aa+1;
                     bb++;
                         }
         }
    while(an2==0);
}

void keyscan3() /*按键2进行减1*/
{
   if(an3==0)
    {
           if(aa>0)
                 {
                         aa=aa-1;
             bb--;
                 }
        }
  while(an3==0);
}

/*显示函数*/
void display(void)
{  p1=0;p2=0;
          if(bb/10%10==0)
    P0=SegCode[1];
    else
        P0=SegCode[bb/10%10];
        p1=1;p2=0;
        DelayMs(1);
       
          p1=0;p2=0;
        P0=SegCode[bb/1%10];
        dp=0;
        p1=0;p2=1;
        DelayMs(1);
        p1=0;p2=0;
}
       
void DA_Conver(unsigned int DAValue)
{
      unsigned char i;
      DAValue <<= 6;       
      CS =   0;                             
      CLK = 0;                          
                                       
      for(i = 0; i < 12; i++)                 
      {                                    
          DIN = (bit)(DAValue & 0x8000);  
          CLK = 1;                        
          DAValue <<= 1;                  
         CLK = 0;
      }
      CS = 1;                              
      CLK = 0;           
}
                       
float zh (float k)
{
  float DA;
  DA=k*1024/500;        /*2.5v参考电压!*/
  return DA;  }
void init_timer()
{  
    TMOD=0x01;
        TH0=(65536-3500)/256;         
        TL0=(65536-3500)%256;
        EA=1;
        ET0=1;
        TR0=1;
              }

void main()
{long DAValue=0;
  aa=0;


          init_timer();

  while(1)
  {  
    DAValue=zh(aa);  /*输出电压*/
          DA_Conver(DAValue);
             keyscan1();
          keyscan2();
          keyscan3();
         
        }
  }
       
void time0() interrupt 1
        {          TH0=(65536-3500)/256;
        TL0=(65536-3500)%256;
        b++         ;
        if(b==2)
        {b=0;
          display(); }
          }         
这是我的代码,如果想显示的话,该怎么改才行
回复

使用道具 举报

ID:1015298 发表于 2022-4-20 23:35 | 显示全部楼层
lkc8210 发表于 2022-4-20 14:33
代码只给一部份如瞎子摸象
问题现象加上现有代码
可退敲出几个问题可能

搞错了 ,这个才是

        #include<math.h>
        #include <reg51.h>
        #define  uchar unsigned char
        #define  uint unsigned int
          char led[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
          char led1[]={0x3f,0x06,0x5b,0x4f,0xe66,0x6d,0x7d,0x07,0x7f,0x6f};
          sbit P3_7=P3^7;                        //加键
          sbit P3_6=P3^6;                   //减键
          sbit P3_1=P3^1;
          sbit P3_0=P3^0;
          sbit P3_4=P3^4;                 //模式选择(设置输出电压值模式or电压输出模式)          
          uchar set=50,tj=0;
         


        void delay (unsigned int time)
                {
                  unsigned j;
                  for (;time>0;time--)
                  for(j=0;j<125;j++) ;       
                }

         void main ()
         {

        while (1)
                {
        if(P3_4==0)
         { tj=!tj;         while(P3_4==0) ; }

        if(tj==0)                         //设置输出电压
                        {               
                                                   //扫描按键1
                                if(P3_7==0)
                                                        {       
                                                                delay(10);                                                                  // 摁键消抖
                                                                if(P3_7==0)
                                                                  {  
                                                                         set++;
                                                                         if(set>99) set=99;                                                  // 设置显示最大值
                                                                         while(P3_7==0)                                                  // 等待按键松开
                                                                             ;
                                                                         }  
                                                                }
                                                          //扫描按键2
                                if(P3_6==0)
                                                   {
                                                                   delay(10);                                                                  // 摁键消抖          
                                                                  if(P3_6==0)
                                                                  {
                                                                           set--;       
                                                                            if(set<0) set=0        ;                                         // 设置显示最小值
                                                                           while(P3_6==0)                                         // 等待按键松开
                                                                                ;
                                                                           }
                                                  
                                                                }               
                                                               
                                                                //显示两位数码管
                                                         
                                                                P3_0=0;         P3_1=1;
                                                        P0=led[set/10];       
                                                        delay(50)        ;                                       
                                                        P3_0=1;         P3_1=0;
                                                        P0=led1[set%10];               
                                                                        delay(50)        ;
                                                               
                                                               
                                                                        }
                               
        else{               
                                        
                                  P2=(float)set*2.56 ;                                   //输出算法
//                                        P2=25.6;                                                                 
                                 }
               
                }
         
         
         }

回复

使用道具 举报

ID:827243 发表于 2022-4-21 05:59 | 显示全部楼层
总的看来,问题比较多。
简单改法:
扫描显示的意义在于无论如何,显示代码在循环中都需要跑一次,这才是扫描。所以 //显示两位数码管 这段代码 需要放在 while(1)中长期运行,而不能放在 if(tj==0)                         //设置输出电压 里 这样在输出电压时,就只能显示一位了。 所以 按键判断  while(P3_6==0)                                         // 等待按键松开 也是不合适的,这样键盘按下不放时,只会显示一位。
建议做法:
主循环while(1)不能存在卡循坏的代码。
按键在while(1)里取值,连续5次一致,认可此次按键有效(用于消抖),去掉while(P3_6==0);这类代码。然后比较此次按键与上次按键的不同,用于判断按下或是松开按键。这样写法还可加入按键时长的计算,便于代码的扩展。
//显示两位数码管 代码放于主循环中,保证一直运行。

评分

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

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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