单片机C语言数码管时钟编程问题?

现在要做一个7段LED显示,时分秒6个LED,有三个功能设置按键,按下设置键,时间闪烁,另外两个按键是加减按键,再按下设置键,分闪烁,以此类推,当进入时分秒任意一种功能设... 现在要做一个7段LED显示,时分秒6个LED,有三个功能设置按键,按下设置键,时间闪烁,另外两个按键是加减按键,再按下设置键,分闪烁,以此类推,当进入时分秒任意一种功能设置,相对应的LED闪烁显示,如果10秒内没有任何按键操作,则退出设置,数码管段选用164,位选用单片机IO驱动三极管控制,整个显示采用动态扫描的方法,我的问题是
如果10秒内没有任何按键操作,则退出设置,这个软件怎么编写?六位数码管,四位正常扫描显示,同时另外两位闪烁显示。这个程序怎么编写呢?大家有什么思路吗?
展开
 我来答
德昂当
推荐于2016-08-05 · TA获得超过2842个赞
知道大有可为答主
回答量:1074
采纳率:100%
帮助的人:755万
展开全部
你的程序应该有个 显示缓存数组 disp_buf[6] 存放6个数码管对应显示字符字模的索引值。
要想闪,就是在每0.5s 时 把要闪的两个交替放入灭的索引值或要显示的值。

10秒内没有任何按键操作,则退出设置
进入设置后,就弄个设置标志位,和一个10s计时变量,每按一次键,这个变量就重新赋上 10s的值。在主循环中判断有设置时,判断这个计时变量有没有减到0 ,减至0后,就把设置标志清掉,退出设置。
beatorwin
2011-03-23 · TA获得超过332个赞
知道小有建树答主
回答量:138
采纳率:0%
帮助的人:119万
展开全部
10秒钟无按键:其实你在定时中断设置个变量,当10S后如果变量被清零,则认为无按键。
void TimerA_ISR(void)
{
static unsigned int key_count = 0;
//重新载入初值
if (key_value !=0) //一直有键按下则重新赋值
{
key_count = 5000;
}
if (key_count != 0)
{
key_count--;
}
else
{
//add your code
}
}

动态扫描 设闪烁标志为blink_flag = 0;//动态扫描是一毛秒一次,闪烁是半秒
假如blink_flag = 0x01;是第一个数码管闪烁 0x03是第一跟第二个闪烁。依次类推
void TimerA_ISR(void)
{
static unsigned char i = 0;
//reload
display();

}
void Display(void)
{
unsigned char i = 0;
static unsigned char j = 0;
static unsigned char n = 0;
static unsigned int CNT = 0x00;
unsigned char temp[6] = {0};

for (i=0; i<6; i++)
{
temp[i] = reg[i];
}

if (++CNT > 500)
{
CNT = 0;
n ^= 0x01;
}
if (n == 1)
{
for (i=0; i<6; i++)
{
if ((blink_flag>>i) !=0)
temp[i] = 0x00;
}
PORTD = 1<<j;
PORTC = ~temp[j];
}
else
{
PORTD = 1<<j;
PORTC = ~reg[j];
}
if (++j > 5)
{
j = 0;
}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2011-03-24
展开全部
哥们我这个程序下载到单片机里去试过能打的以上功能 ,自己看
#include<reg52.h>
#define unchar unsigned char
unchar flag;
unchar s,f,m;
unchar table[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0};
sbit k1=P0^4;
sbit k2=P0^5;
sbit k3=P0^6;
void delay(int time)
{
while(time--);
}
void display(unchar wei, unchar shi )
{
P1=wei*3+0;P2=table[shi/10];delay(20);P2=0;delay(10);
P1=wei*3+1;P2=table[shi%10];delay(20);P2=0;delay(10);
}
void main()
{
unchar i,j;
EA=1;
ET0=1;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
TMOD=1;
TR0=1;
while(1)
{
if(flag==20)
{
flag=0;
if(m==59)m=0;
else m++;

if(m==0)
{
if(f==59)f=0;
else f++;

if(f==0)
{
if(s==24)s=0;
else s++;
}
}
}
display(0,s);
display(1,f);
display(2,m);
P0=0XFE;
if(k1==0)
{
while(k1==0);flag=0;
while(1)
{
i++;
if(i==10){i=0;display(0,s);} ;
display(1,f);
display(2,m);
if(k2==0){while(k2==0); flag=0;s++; }
if(k3==0){while(k3==0); flag=0;s--; }
if(flag>=200){flag=0;break;}
if(j!=0)break;
if(k1==0)
{
while(k1==0);flag=0;
while(1)
{
i++;
if(i==10){i=0;display(1,f);} ;
display(0,s);
display(2,m);
if(k2==0){while(k2==0); flag=0;f++; }
if(k3==0){while(k3==0); flag=0;f--; }
if(flag>=200){j=1;break;}
if(j!=0)break;
if(k1==0)
{
while(k1==0);flag=0;
while(1)
{
i++;
if(i==4){i=0;display(2,m);} ;
display(1,f);
display(0,s);
if(k2==0){while(k2==0); flag=0;m++; }
if(k3==0){while(k3==0); flag=0;m--; }
if(flag>=200){j=2;break;}

}
}
}
}
}
}

}
}
void et0() interrupt 1
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
flag++;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
南宫枫41
2011-03-23 · TA获得超过289个赞
知道答主
回答量:290
采纳率:0%
帮助的人:109万
展开全部
个人认为:如果定时中断没有用完的话,加个定时中断就可以了。
流程:有键按下就开中断,定时器初始化,设置结束或者是调用了十秒无响应的的中断子程序后就关掉中断。
中断流程:若十秒到,关闪烁,重现调用显示,关中断,返回。
闪烁的话估计也要用到定时器了,或者用延时子程序,0.5秒亮,0.5秒不亮。

另:建议使用led显示驱动芯片7289或7281会方便很多
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
chengrang450
2011-03-24 · TA获得超过161个赞
知道答主
回答量:41
采纳率:0%
帮助的人:20.6万
展开全部
我觉得改一下单片机最小版系统的驱动程序应该可以,具体的我不行,比较在行硬件制作。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式