标题:
为什么单片机数码管电子钟按键是黑一下屏?
[打印本页]
作者:
咻咻修
时间:
2018-8-7 23:38
标题:
为什么单片机数码管电子钟按键是黑一下屏?
我的数码管电子钟什么都没问题了,可就是按键调时间时,一按下按键整个频就黑了,松开又亮了,而且功能也都实现了,就是按下按键时会黑一下,请问各位大佬是怎么回事呢???????我在板子上实现的,应该是我的程序不完善,下面是我的程序。。。。。希望各位大佬帮忙解答下。。。。。
单片机源程序如下:
#include<reg51.h>
typedef unsigned int u16;
typedef unsigned char u8;
u8 ms0;
u8 sec;
u8 min;
u8 hour;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit k1=P3^1;
sbit k2=P3^0;
sbit k3=P3^2;
sbit k4=P3^3;
u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71 };
void delay(u8 i)
{
i--;
}
void keyscan();
void display();
void main()
{
P0=0X00;
TMOD|=0X01;
TH0=(65536-49960)/256;
TL0=(65536-49960)%256;
EA=1;
ET0=1;
TR0=1;
while(1)
{
display();
}
}
void display()
{
while(1)
{
LSA=0;LSB=0;LSC=0;
P0=smgduan[sec%10];
delay(2);
P0=0x00;
LSA=1;LSB=0;LSC=0;
P0=smgduan[sec/10];
delay(2);
P0=0x00;
LSA=0;LSB=1;LSC=0;
P0=0x40;
delay(2);
P0=0x00;
LSA=1;LSB=1;LSC=0;
P0=smgduan[min%10];
delay(2);
P0=0x00;
LSA=0;LSB=0;LSC=1;
P0=smgduan[min/10];
delay(2);
P0=0x00;
LSA=1;LSB=0;LSC=1;
P0=0x40;
delay(2);
P0=0x00;
LSA=0;LSB=1;LSC=1;
P0=smgduan[hour%10];
delay(2);
P0=0x00;
LSA=1;LSB=1;LSC=1;
P0=smgduan[hour/10];
delay(2);
P0=0x00;
}
}
void T0_time() interrupt 1
{
TH0=(65536-49960)/256;
TL0=(65536-49960)%256;
ms0++;
if(ms0>=20)
{
ms0=0;
sec++;
if(sec>=60)
{
sec=0;
min++;
if(min>=60)
{
min=0;
hour++;
if(hour>=20)
hour=0;
}
}
}
keyscan();
}
/*void digdisplay()
{
switch(a)
{
case(0):
LSA=0;LSB=0;LSC=0;break;
case(1):
LSA=0;LSB=0;LSC=1;break;
case(2):
LSA=0;LSB=1;LSC=0;break;
case(3):
LSA=0;LSB=1;LSC=1;break;
case(4):
LSA=1;LSB=0;LSC=0;break;
case(5):
LSA=1;KSB=0;LSC=1;break;
case(6):
LSA=1;LSB=1;LSC=0;break;
case(7):
LSA=1;LSB=1;LSC=1;break;
}
} */
void keyscan()
{
if(k1==0)
{
delay(5);
if(k1==0)
{
min--;
if(min>=60)
min=0;
}
while(!k1);
}
if(k2==0)
{
delay(5);
if(k2==0)
{
min++;
if(min>=60)
min=0;
}
while(!k2);
}
if(k3==0)
{
delay(5);
if(k3==0)
{
hour--;
if(hour>=24)
hour=0;
}
while(!k3);
}
if(k4==0)
{
delay(5);
if(k4==0)
{
hour++;
if(hour>=24)
hour=0;
}
while(!k4);
}
}
复制代码
所有资料51hei提供下载:
数码管.zip
(24.99 KB, 下载次数: 5)
2018-8-7 23:36 上传
点击文件名下载附件
作者:
wulin
时间:
2018-8-8 06:43
你的按键扫描程序使用while(!k1)死循环判断松手,并且按键扫描程序被放在定时器中断中,在此期间内单片机任何工作都停止等待松手。
作者:
HC6800-ES-V2.0
时间:
2018-8-8 08:13
看了你的按键函数,就知道是你的程序问题了。
第一:为什么数码管会黑呢?因为没有执行显示部分的程序啊。
第二:为什么没有执行显示部分的程序呢?因为你按键程序用 while(!k1);占住了程序的执行啊——只要你不松手,数码管就会一直是黑的。
按键的松手消抖程序,不应该这样写,可能以前你都是这样写的,并且从来没有碰到问题,因为没有碰到这样的需要适时显示的情况。
这样写比较好:
for (i=0;((i<10)&&(k1==0));i++)
{
Delay1ms();
}
作者:
ahshmj
时间:
2018-8-8 10:03
你可以使用“显示”函数来延时就不会这样了。根据显示函数的运行占用时间,确定循环几次,满足延时。
作者:
人中狼
时间:
2018-8-8 13:04
按键扫描不要放在定时器中断里,放在主程序的循环里,显示程序应该放在定时器里,这样不论按键扫描或其他的程序死循环,只要定时器正常运行,就都能显示了
作者:
advance
时间:
2018-8-8 13:56
按键程序有问题,你按住按键程序就死在那,当然不执行显示程序了
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1