找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机数码管显示达不到要求,敬请朋友们帮助,谢谢!

[复制链接]
跳转到指定楼层
楼主
ID:86913 发表于 2019-3-17 12:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
4位数码管显示2019和依次显示 2、0、1、9 刚刚试过成功了,但是想来个跳档显示(先2、后1、再0、最后9)却搞不好,又想不通。恳请朋友们指导:我这是错在哪里?谢谢!
这个程序,只能显示1个“2”(2常亮)


/******  在 2、0、1、9 的排列上,先显示2、再1、再0、最后9  ******/
/******所用单片机STC12C4052AD******/  
#include <reg51.h>
#define uint  unsigned int        
#define uchar unsigned char
uchar code bit_tab[]={0xfe,0xfd,0xfb,0xf7};    //四位数码管位选表
uchar code seg_data[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};           //数码管显示码
uchar disp_buf[]={2,0,1,9,};                       //定义显示,并赋值“2019”
         /******延时函数*******/
void Delay(uint xms)                                    
{
  uint i,j;
  for(i=xms;i>0;i--)                     
    for(j=110;j>0;j--);      
}
        /******显示函数******/
void Display()
{
  uchar tmp;                            //定义显示暂存
  uchar j;                                 
  tmp=bit_tab[j];             //根据当前的位选计数值决定显示哪只数码管
  P3=tmp;                            //送P3控制被选取的数码管点亮
  tmp=disp_buf[j];              //根据当前的位选计数值查的数字的显示码
  tmp=seg_data[tmp];                    //取显示码
  P1=tmp;                            //送到P1口显示出相应的数字        
  Delay(1000);                            //延时1秒钟
  P3=0xff;        
  P1=0xff;            
}
         /******主函数******/
void main()      
{
  uchar j;                              //显示位选计数器  
  while(1)
   {        
    j=0;                            //在第一位上显示2
    Display();                                
    j=2;                            //在第三位上显示1        
    Display();                                                        
    j=1;                            //在第二位上显示0
    Display();                                                         
    j=3;                            //在第四位上显示9
    Display();                                                                  
   }                    
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

来自 4#
ID:234075 发表于 2019-3-17 22:32 | 只看该作者
你在main()主函数和Display()显示函数中同时定义了变量 j ,而你想把主函数中的变量 j 的值带入Display显示函数中,这样做是不行的。
在执行main()主函数中,你对 j 进行了赋值,但在执行Display()显示函数时,因为你又重新定义了 j ,程序会使用新的未定义的变量 j ,而不是你在主函数中赋值的 j。
正确的做法应该时在函数初始先定义变量 j ,然后在main()主函数中进行赋值,在Disaplay()显示函数中调用。

评分

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

查看全部评分

回复

使用道具 举报

沙发
ID:387856 发表于 2019-3-17 18:52 | 只看该作者
/******  在 2、0、1、9 的排列上,先显示2、再1、再0、最后9  ******/
/******所用单片机STC12C4052AD******/  
#include <reg51.h>
#define uint  unsigned int        
#define uchar unsigned char

uchar k1,j1;  

uchar code bit_tab[]={0x01,0x02,0x04,0x08};    //四位数码管位选表
uchar code seg_data[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};           //数码管显示码
uchar disp_buf[]={2,0,1,9,};                       //定义显示,并赋值“2019”
         /******延时函数*******/
void Delay(uint xms)                                    
{
  uint i,j;
  for(i=xms;i>0;i--)                     
    for(j=110;j>0;j--);      
}
         /******主函数******/
void main()      
{  
  uint i;                           
  P1 = 0xff;
  P3 = 0xff;
  while(1)
   {   
    for(i=0;i<80;i++)     //  此段显示的时间
    {                                          //
         P1 = seg_data[2];    //                                            
     P3 = bit_tab[0];     //                           
     Delay(10);           //                 
     P3 = 0x00;                  //
     P1 = 0xff;      
     Delay(2);                          //
        }                                     //    此段显示2
        for(i=0;i<40;i++)      ///
    {                                                //
         P1 = seg_data[2];     ///                                          
     P3 = bit_tab[0];      ///                          
     Delay(10);             //               
     P3 = 0x00;                   //
     P1 = 0xff;                       //
     Delay(2);                           //
         P1 = seg_data[0];      //                                          
     P3 = bit_tab[1];       //                        
     Delay(10);             //               
     P3 = 0x00;                        //
     P1 = 0xff;                       //
     Delay(2);                                 // 此段显示0  下同 就不标注了
        }   
        for(i=0;i<20;i++)   
    {
         P1 = seg_data[2];                                                
     P3 = bit_tab[0];                                
     Delay(10);                           
     P3 = 0x00;        
     P1 = 0xff;      
     Delay(2);
         P1 = seg_data[0];                                                
     P3 = bit_tab[1];                                
     Delay(10);                           
     P3 = 0x00;        
     P1 = 0xff;      
     Delay(2);
     P1 = seg_data[1];                                                
     P3 = bit_tab[2];                                
     Delay(10);                           
     P3 = 0x00;        
     P1 = 0xff;      
     Delay(2);
        }  
        while(1)   
    {
         P1 = seg_data[2];                                                
     P3 = bit_tab[0];                                
     Delay(10);                           
     P3 = 0x00;        
     P1 = 0xff;      
     Delay(2);
         P1 = seg_data[0];                                                
     P3 = bit_tab[1];                                
     Delay(10);                           
     P3 = 0x00;        
     P1 = 0xff;      
     Delay(2);
     P1 = seg_data[1];                                                
     P3 = bit_tab[2];                                
     Delay(10);                           
     P3 = 0x00;        
     P1 = 0xff;      
     Delay(2);
     P1 = seg_data[9];                                                
     P3 = bit_tab[3];                                
     Delay(10);                           
     P3 = 0x00;        
     P1 = 0xff;      
     Delay(2);
        }                                                                 
   }                    
}
回复

使用道具 举报

板凳
ID:466164 发表于 2019-3-17 19:10 | 只看该作者
你的变量J
void main()
void Display()
同时使用,且是关联的,开个全局变量,估计能解决你的问题。

评分

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

查看全部评分

回复

使用道具 举报

5#
ID:387856 发表于 2019-3-18 09:08 | 只看该作者
我都把程序附上去了 而且是仿真通过的。管理员怎么不给我加分呢。而且其它两位的回答,我在调试的过程中就试过的,都是不行的,楼主的程序是有问题的。楼主可以直接复制我的程序在PROTUES里仿真,出来的效果就是 先显示2再显示20,再显示201最后停在显示2019;
回复

使用道具 举报

6#
ID:86913 发表于 2019-3-19 21:16 | 只看该作者
zhb2004xp 发表于 2019-3-17 22:32
你在main()主函数和Display()显示函数中同时定义了变量 j ,而你想把主函数中的变量 j 的值带入Display显示 ...

谢谢zhb2004xp ,完全是您说的那样。
回复

使用道具 举报

7#
ID:86913 发表于 2019-3-19 21:19 | 只看该作者
7358655 发表于 2019-3-17 19:10
你的变量J
void main()
void Display()

感谢7358655您的指导,改为全局变量后运行正确!
回复

使用道具 举报

8#
ID:86913 发表于 2019-3-19 21:20 | 只看该作者
liuhailan5757 发表于 2019-3-17 18:52
/******  在 2、0、1、9 的排列上,先显示2、再1、再0、最后9  ******/
/******所用单片机STC12C4052AD*** ...

谢谢您的关心、指导,辛苦了!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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