单片机C语言数码管时钟编程问题?
现在要做一个7段LED显示,时分秒6个LED,有三个功能设置按键,按下设置键,时间闪烁,另外两个按键是加减按键,再按下设置键,分闪烁,以此类推,当进入时分秒任意一种功能设...
现在要做一个7段LED显示,时分秒6个LED,有三个功能设置按键,按下设置键,时间闪烁,另外两个按键是加减按键,再按下设置键,分闪烁,以此类推,当进入时分秒任意一种功能设置,相对应的LED闪烁显示,如果10秒内没有任何按键操作,则退出设置,数码管段选用164,位选用单片机IO驱动三极管控制,整个显示采用动态扫描的方法,我的问题是
如果10秒内没有任何按键操作,则退出设置,这个软件怎么编写?六位数码管,四位正常扫描显示,同时另外两位闪烁显示。这个程序怎么编写呢?大家有什么思路吗? 展开
如果10秒内没有任何按键操作,则退出设置,这个软件怎么编写?六位数码管,四位正常扫描显示,同时另外两位闪烁显示。这个程序怎么编写呢?大家有什么思路吗? 展开
5个回答
展开全部
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;
}
}
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++;
#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++;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
个人认为:如果定时中断没有用完的话,加个定时中断就可以了。
流程:有键按下就开中断,定时器初始化,设置结束或者是调用了十秒无响应的的中断子程序后就关掉中断。
中断流程:若十秒到,关闪烁,重现调用显示,关中断,返回。
闪烁的话估计也要用到定时器了,或者用延时子程序,0.5秒亮,0.5秒不亮。
另:建议使用led显示驱动芯片7289或7281会方便很多
流程:有键按下就开中断,定时器初始化,设置结束或者是调用了十秒无响应的的中断子程序后就关掉中断。
中断流程:若十秒到,关闪烁,重现调用显示,关中断,返回。
闪烁的话估计也要用到定时器了,或者用延时子程序,0.5秒亮,0.5秒不亮。
另:建议使用led显示驱动芯片7289或7281会方便很多
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我觉得改一下单片机最小版系统的驱动程序应该可以,具体的我不行,比较在行硬件制作。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询