大神们来看看数码管的程序那里错了
我想用按键控制7段数码管的两位数计数 按一次计数加1 现在 我已经程序写好了 可是就是个位的数码管老是闪烁 能不能消除这是程序
#include "reg51.h"
#include "intrins.h"
#define uchar unsigned char
#define uintunsigned int
sbit cs1=P3^5;
sbit cs2=P3^6;
sbit wr=P3^7;
sbit anjian=P1^0;
uchar code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uint shuzi;
void delay(uint s)
{
uint j,z;
for(j=s;j>0;j--)
for(z=128;z>0;z--);
}
void display();
void jianpan();
void main()
{
while(1)
{
jianpan();
display();
}
}
void display()
{
//uint q;
//unsigned char k;
P2=0xfe;
wr=0;
cs2=0;
wr=1;
cs2=1;
//k=_crol_(k,1);
P2=seg;
wr=0;
cs1=0;
wr=1;
cs1=1;
delay(2);
P2=0xfd;
wr=0;
cs2=0;
wr=1;
cs2=1;
//k=_crol_(k,1);
P2=seg;
wr=0;
cs1=0;
wr=1;
cs1=1;
delay(2);
}
void jianpan()
{
if(anjian==0)
{
delay(200);
if(anjian==1)shuzi++;
}
}
补充一下 按键按着的时候不计数 松开才加1 可是按住的时候数码管就闪烁 时间间隔问题,缩短显示之前的时间 你不停的刷新,当然狂闪了。或者是接近全亮。
如果是不是真正的产品的话,在display调用加个延时。 你是说加延时吗 sleet1986 发表于 2013-2-27 15:44 static/image/common/back.gif
时间间隔问题,缩短显示之前的时间
你是说加延时吗 本帖最后由 shower.xu 于 2013-2-27 15:50 编辑
void delay(uint s)
{
uint j,z;
for(j=s;j>0;j--)
{
for(z=100;z>0;z--);
display();
}
}
修改下试试
display()里的delay(2); 注释掉 ABC8636694 发表于 2013-2-27 15:47 static/image/common/back.gif
你是说加延时吗
jianpan()里面的延时长了,可以修改按键函数,不采用这样的延时 jianpan占用时间太长
void jianpan(void)
{
char anjian1;
static char anjian0;
anjian1=anjian;
if((anjian1==0)&&(anjian0!=0))shuzi++;
anjian0=anjian1;
}
lcw_swust 发表于 2013-2-27 15:52 static/image/common/back.gif
jianpan占用时间太长
void jianpan(void)
{
void jianpan(void)
{
char anjian1;
static char anjian0;
anjian1=anjian;
if((anjian1==0)&&(anjian0!=0))shuzi++;
anjian0=anjian1;
}
这个能解释下吗 我试了 可以 不过我看起来好乱 lcw_swust 发表于 2013-2-27 15:52 static/image/common/back.gif
jianpan占用时间太长
void jianpan(void)
{
还有 你这样改 有时按住的时候会连续跳几个数 不是原来的按住 起来的时候加1 ABC8636694 发表于 2013-2-27 16:01 static/image/common/back.gif
void jianpan(void)
{
char anjian1;
anjian1表示当前键值
anjian0表示上一次的键值
if((anjian1==0)&&(anjian0!=0))就是指(当前键值为0且上一次的键值不为0) ABC8636694 发表于 2013-2-27 16:02 static/image/common/back.gif
还有 你这样改 有时按住的时候会连续跳几个数 不是原来的按住 起来的时候加1 ...
这应该是按键的抖动造成的,在开关上并个小电容试试。
或者增加查询间隔,比如
char i;
while(1)
{
jianpan();
for(i=0;i<10;i++) display();
}
或者在按键函数内加入软件滤波 毛,用一个很长的函数运行,不要加循环延时,用循环标志来控制延时。否则你这延一点那延一点,还怎么能运行? 用定时器去调用显示
那样感觉会好恨多 建议看看手把手教单片机的书
页:
[1]