标题: 新手求助 时钟代码一直闪。求大神改。没用时钟 [打印本页]
作者: cwr1001 时间: 2016-10-12 15:28
标题: 新手求助 时钟代码一直闪。求大神改。没用时钟
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uint num,num1;
uchar n;
//int i,int j,int k,int q,int h;
int i,j,k,q,h;
//int s,m,h;
sbit dula=P2^6;
sbit wela=P2^7;
uchar code a[]={
0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,};
uchar code c[]={
0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
void play(uint x);
void delay(a);
void main()
{
//TMOD=0x11;
//TH0=(65536-45872)/256;
//TL0=(65536-45872)%256;
//TH1=(65536-45872)/256;
//TL1=(65536-45872)%256;
//EA=1;
//ET0=1;
//ET1=1;
//TR0=1;
//TR1=1;
num=0;
n=1;
k=1;
// s=0,m=0,h=0;
while(1)
{
i=0;
if(i<60)
{
for(i=0;i<60;i++)
{
play(num);
delay(1000);
num++;
}
}
else
{
num=60*n;
play(num);
delay(1000);
n++;
}
}
}
void play(uint x)
{
h=x/3600;
q=x%3600/600;
i=x%3600/60;
j=x%3600%60/10;
k=x%3600%60%10;
dula=1;
P0=a[h];
dula=0;
P0=0xff;
wela=1;
P0=c[1];
wela=0;
delay(1);
dula=1;
P0=a[q];
dula=0;
P0=0xff;
wela=1;
P0=c[2];
wela=0;
delay(1);
dula=1;
P0=a[i];
dula=0;
P0=0xff;
wela=1;
P0=c[3];
wela=0;
delay(1);
dula=1;
P0=a[j];
dula=0;
P0=0xff;
wela=1;
P0=c[4];
wela=0;
delay(1);
dula=1;
P0=a[k];
dula=0;
P0=0xff;
wela=1;
P0=c[5];
wela=0;
delay(1);
}
void delay(a)
{
int i,j;
for(i=a;i>0;i--)
for(j=110;j>0;j--);
作者: smallriver 时间: 2016-10-13 13:07
你把问题说的明白一点吧,都不明白你的问题是什么
作者: cwr1001 时间: 2016-10-13 14:11
代码打上去 数码管一闪一闪的,,,,。。。
作者: smallriver 时间: 2016-10-13 16:37
目测你的代码是郭天祥的,而且我没看懂你开始的定时器/计数的初始化有什么用,至于你说的数码管有闪烁的原因是由于有这几行代码的原因,
for(i=0;i<60;i++)
{
play(num);
delay(1000);
num++;
,主要是delay(1000),这个函数是延迟1000ms,也就是1秒的时间,那么你会看起来一闪一闪的,这里的意思大概是延迟1秒再显示一次,所以看起来会有闪烁现象
你这时钟也没用时钟芯片,也不同单片机自带的定时器来计数,只是用延时函数,精确度非常的低
作者: yzwzfyz 时间: 2016-10-13 19:23
本帖最后由 yzwzfyz 于 2016-10-13 19:25 编辑
正确的做法:
1、将所有的显示动作数据都准备好(就剩一句送出数据不做,目的:以后可以以最短的时间送出数据)
2、一条命令,切断所有LED的显示。要点:指令少时间短。
3、送出准备好的数据。因为显示已切断,所以无闪动。要点:指令少时间短。这就时为何要事先准备好数据。
4、打开需要显示的那一个LED。
重复扫描显示......
作者: yzwzfyz 时间: 2016-10-13 19:24
关键点:
1、在不显示的时候切换显示数据。
2、不显示的时间要短。以提高显示亮度并减小闪动感。
作者: yzwzfyz 时间: 2016-10-13 19:24
为了达成以上目的:
硬件上,尽可能将显示扫描“开关”放在同一个口
软件上,先将需要显示的数据准备好,不要:“送出一个,再计算处理一个,再送一个。”。要以最短的时间,在不显示的时候送出。
作者: zl2168 时间: 2016-10-13 21:03
本帖最后由 zl2168 于 2016-10-21 10:17 编辑
实例94 模拟电子钟(由80C51定时器产生秒时基)
先Proteus仿真一下,确认有效。
以上摘自张志良编著《单片机实验实训100例》 ISBN 978-7-5124-1603-1,北航社出版
书中电路和程序设计有详细说明,程序语句条条有注解。
作者: zl2168 时间: 2016-10-13 21:39
不知为什么不能上传附件和图片了?
作者: xyq040115 时间: 2016-10-14 11:13
先Proteus仿真一下,确认有无纰漏
作者: jianfeii 时间: 2016-10-14 11:35
不用时钟中断的话,你要根据时序,算出单片机一条指令程序运行的时间间隔.然后来做延迟的.
作者: 我是谁啊啊 时间: 2016-10-14 13:06
显示刷新问题
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |