当前位置:编程学习 > C/C++ >>

c语言数码管问题,单片机是STC89c52

大概看下代码,手机不好编辑将就下。for(i=0;i<=9;i++){P0=s[i];/*数组里是十六进制代码0-9*/tim();/*延迟1秒*/P2_0=0}有两个问题,第一是循环只能显示到八,如果换成10可以到九!第二是每次到最后要黑下屏,比如换成10它会循环到九然后变黑,然后变0在循环一次,到9还黑。能解释下具体原因吗?
追问:看不懂~!不过大概看懂你解释的了·! 我回去试延迟的位置~!

答案: 

1.第一是循环只能显示到八,如果换成10可以到九

for(i=0;i<=9;i++)//此处限制了循环9次,显示9个数,也就是0~8(记住开始显示的是0)

{

       P0=s[i];

      P2_0=0;//开显示

      SoftDelay();//延时1s  注意:延时最好写后面

2.第二是每次到最后要黑下屏,比如换成10它会循环到九然后变黑,然后变0在循环一次,

不要听他说什么消隐。消隐,只有在动态扫描才会遇到,而你的明显是静态显示。我估计你程序右面有一定的延时,导致循环后,有一定的软件延时,没给数码管上电导致的,具体情况发源代码吧

 

发个代码给你,:(此代码只是一个模块,要想使用还必须加上主函数调用哦)

#include<reg51.h>
#include<intrins.h>
#include"MacroAndConst.h"

#define DPORT_dula P0 // 段端口
#define DPORT_wela P2 // 位端口
uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//段码表

/*---------------------------
函数原型
-----------------------------*/

static void SoftDelay(uint x);
void SMG2_Disply(void);
//延时
/*---------------------------
软件延时,且声明外部不可调用
-----------------------------*/

static void SoftDelay(uint x)
{
 uchar t;
 while(x--)
 for(t=100;t>0;t--){
  ;
 }
}
/*---------------------------
显示函数
-----------------------------*/

void SMG2_Disply(void)
{
 uchar wela=0x80;
 uchar i;

 for(i=0;i<8;i++){
    DPORT_dula=0xff; 

   DPORT_dula=DSY_CODE[i]; //发送段码
    wela=_crol_(wela,1);
 DPORT_wela=wela; //发送位码
 SoftDelay(2);
 }
 DPORT_wela=0x00; //关闭所有数码管并延时
 SoftDelay(1000);

 

 

 

直奔→嵌入式团队为你解答

我觉得你的数组s[]中s[0]是消隐码,也就是FF或者00(因为不知道你数码管是共阴还是共阳);才会有以上现象。

这样的话,就能解释为什么第一次会循环到八,第二次循环到九,而且会黑一下。

 

看看你的数组吧。

 

上一个:C语言,用什么工具啊,初学者用的,
下一个:C语言,麻烦哪位仁兄详细讲解一下这个程序

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,