微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > C51 程序求解(扫描数码管,);有图!求解释

C51 程序求解(扫描数码管,);有图!求解释

时间:10-02 整理:3721RD 点击:

   有图示:
程序 就是这些程序;
有个51的开发板;编写好后,下载到板子上调试;
为什么一直这个板子上的8个数码管一直显示8个 “8” 也不流动;
很是不解啊?
小弟刚学51勿见怪;
不知说的清楚否?
程序如下:
#include<reg51.h>
          #define uchar unsigned char
          #define uint unsigned int
          uchar code table[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,
                            0x7d,0x07,0x7f,0x6f,0x77,0x7c,
                0x39,0x5e,0x79,0x71            };         //定义编码数?
          void delay(uchar);
          sbit wela=P2^7;            //位选
          sbit dela=P2^6;            //段选
          uchar i;
          void main()
          {
              wela=1;
           P1=0x00;
           wela=0;
           while(1)
              {
             for(i=0;i<16;i++)
            {
             dela=1;
           P1=table;
           dela=0;
           delay(1100);            
            }      
           }         
          }
       void delay(uchar a)
       {
          uchar x,y;
          for(x=a;x<a;x--)
            for(y=0;y<100;y++);
      
       }


贴文字不行吗,看不清

P27,P26用法好像有问题吧

要是小编的初衷是是 让8个数码管依次扫描显示的话, 位选的使用是不正确的,
要是本来就做个小测试,8个数码管一起显示同样的数据的话,ok,可以这么用
小编说,为什么总是显示 8 ,我估计是 延时太短了,可以把延时加长试试。

小编,这两个P2^6和P2^7,没有问题哦

我不让他流动,只显示一个数码管亮,是没问题的;
就是在想让他如程序中,让他流动时,一直显示一个字不动?
很是不解/

小编,能不说的清楚些?

是啊,就是不能依次扫描啊,如果只让一个管子亮,是没问题的、位怎么选 ,
谢谢
   
我试下,加上延时,
  这是几个管子的接法,
请指示?


里面用for语句就是不行啊,,一直显示一个“8”

而用if 语句,就可以依次扫描,但是,出现的不是“0-F”
是乱码,不知为何
?请高手指教?
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
                             //#define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换
                                                         #define uchar unsigned char
                                                         #define uint unsigned int
        sbit dula=P2^2;//定义锁存使能端口 段锁存
        sbit wela=P2^3;//                 位锁存
  
          uchar code dofly_DuanMa[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,       
                                                                      0x7d,0x07,0x7f,0x6f,0x77,0x7c,
                                                                          0x39,0x5e,0x79,0x71          };            // 显示段码值01234567
          uchar code dofly_WeiMa[]={ 0xfe,0xfd,0xfb,0xf7,
                                     0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码
                   void Delay(uint t); //函数声明
/*------------------------------------------------
                    主函数
------------------------------------------------*/
                main()
                {
                 unsigned char i=0;
                                   wela=1;                //打开位远       
                                   P0=0xcd;                
                               wela=0;           //位锁存
                          while(1)
                                {
                               
                                         dula=1;                   //打开段选
                              P0=dofly_DuanMa[i]; //取显示数据,段码
                                 i++;          
                               dula=0;                //段锁存
                        Delay(60000); // 扫描间隙延时,时间太长会闪烁,太短会造成重影,
                                //这里故意延长时间,方便直观看出动态扫描原理
                                   if(i==16)
                                   i=0;   //检测8位扫描完全结束?如扫描完成则从第一个
                                           //开始再次扫描8位
                                     
                           }
                        }
/*------------------------------------------------
延时函数,含有输入参数 unsigned int t,无返回值
unsigned int 是定义无符号整形变量,其值的范围是
0~65535
------------------------------------------------*/
void Delay(unsigned int t)
{
while(--t);
}

很是奇怪,为什么是,乱码呢?
开发板应该不会有问题啊

亲  你的延时函数的参数类型是uchar  但是你的实参却是1000,你绝得没有问题?自己看看那个uchar的范围吧,然后考虑用多重循环来延时或者是中断延时

小编要的是8个数码管流动显示0-F吗?

你的dela=1,但是dela不是断码么,这样直接赋值成1了,所以ABCDEFG都是高电平,当然会一直全亮啊

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top