标题:
数码管同时闪烁的单片机程序问题,请教大家,谢谢
[打印本页]
作者:
emily_1105
时间:
2019-12-16 08:34
标题:
数码管同时闪烁的单片机程序问题,请教大家,谢谢
用定时器实现两个数码管同时点亮的程序:
if(smgtime==10)
{
smg_show(10);
WE_1=1;
WE_2=0;
smg_show(data/10);
}
if(smgtime==20)
{ smg_show(10);
WE_1=0;
WE_2=1;
smg_show(data%10);
smgtime=0;
}
现在想让数码管实现闪烁的功能,两个数码管按照一定的频率闪烁,在同时点亮的基础上加了一个关闭数码管的功能,我是这样编写的,
if(smgtime==10)
{
smg_show(10);
WE_1=1;
WE_2=0;
smg_show(data/10);
}
if(smgtime==20)
{ smg_show(10);
WE_1=0;
WE_2=1;
smg_show(data%10);
}
if(smgtime==30)
{
smg_show(10);
smgtime=0;
}
出现的问题是,第二个数码管的亮度比第一个数码管亮度明显,第一个数码管出现明显的闪烁,第二个数码管闪烁不明显。硬件电路是这样设计的,
74HC573驱动段选,数码管是共阴极的,单片机通过三极管来控制公共端。
现在问题不知道出现在哪里,请大家帮我分析一下,谢谢。
作者:
moluxiyan
时间:
2019-12-16 10:25
延时太多了
作者:
wulin
时间:
2019-12-16 15:28
多位数码管显示电路分静态显示和动态显示,要实现单个闪烁或多个同时闪烁并不难。只要在正常显示的基础上按闪烁频率的1/2时间给段码驱动端送消隐码即可。共阴数码管送0x00,共阳数码管送0xff。数码管亮度不均匀或闪烁有差异是因为显示电路或显示代码本身不正常造成的。给你一个示例,用简单的4位时钟改成闪烁显示以便于理解。注释掉的部分是原来正常显示的部分。
无标题.jpg
(157.1 KB, 下载次数: 13)
下载附件
2019-12-16 15:26 上传
#include <AT89X52.H>
#define uint unsigned int
#define uchar unsigned char
sbit key1 =P3^4;
sbit key2 =P3^5;
//顺序共阴极数码管段码表,段码a-h顺序接PX0-PX7
unsigned char code table[]={//共阴数码管段码"0~f-."
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x40,0x80};
uchar hour=12,min=0,sec=0;
uchar tcnt;
bit flag;
void delayms(uint k)//1T
{
uint i,j;
for(i=k;i>0;i--)
for(j=125;j>0;j--);
}
void InitTimer0()//50毫秒@12.000MHz
{
TMOD= 0x01; //设置定时器模式
TL0 = 0xB0; //设置定时初值
TH0 = 0x3C; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
EA = 1;
ET0 = 1;
}
void keyscan()
{
static uchar count1,count2;
if(!key1)
{
if(++count1>=100)
{
count1=0;
hour++;
if(hour>=24)
hour=0;
}
}
else count1=0;
if(!key2)
{
if(++count2>=100)
{
count2=0;
min++;
tcnt=0;
sec=0;
if(min>=60)
min=0;
}
}
else count2=0;
}
void display()
{
static uchar i=0;
P0=0x00;//消隐
P3&=0xf0;//清P3低4位
/* switch(i)
{
case 0: P3|=0x0e;P0=table[hour/10];break;
case 1: P3|=0x0d;if(flag==1)P0=table[hour%10]|0x80;//加点
else P0=table[hour%10];break;//不加点
case 2: P3|=0x0b;P0=table[min/10] ;break;
case 3: P3|=0x07;P0=table[min%10] ;break;
}*/
switch(i)
{
case 0: P3|=0x0e;if(flag==1)P0=table[hour/10];
else P0=0x00;break;
case 1: P3|=0x0d;if(flag==1)P0=table[hour%10]|0x80;//加点
else P0=0x00;break;
case 2: P3|=0x0b;if(flag==1)P0=table[min/10];
else P0=0x00;break;
case 3: P3|=0x07;if(flag==1)P0=table[min%10];
else P0=0x00;break;
}
delayms(2);
i++;
i%=4;
}
void main(void)
{
InitTimer0();
while (1)
{
keyscan();
display();
}
}
void Timer0Interrupt(void) interrupt 1
{
tcnt++;
if(tcnt<10)
flag=1;
else flag=0;
if(tcnt>=20)
{
tcnt=0;
sec++;
if(sec>=60)
{
sec=0;
min++;
if(min>=60)
{
min=0;
hour++;
if(hour>=24)
hour=0;
}
}
}
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1