c语言数码管问题,单片机是STC89c52
大概看下代码,手机不好编辑将就下。for(i=0;i<=9;i++){P0=s[i];/*数组里是十六进制代码0-9*/tim();/*延迟1秒*/P2_0=0}有两个问题,第一是循环只能显示到八,如果换成10可以到九!第二是每次到最后要黑下屏,比如换成10它会循环到九然后变黑,然后变0在循环一次,到9还黑。能解释下具体原因吗?
追问:看不懂~!不过大概看懂你解释的了·! 我回去试延迟的位置~!
大概看下代码,手机不好编辑将就下。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(因为不知道你数码管是共阴还是共阳);才会有以上现象。
这样的话,就能解释为什么第一次会循环到八,第二次循环到九,而且会黑一下。
看看你的数组吧。