C语言单片机 时钟程序

cyclone0417 2010-01-04 05:31:40
学校要求做一个24小时的时钟 格式为 XX:XX (小时:分钟) 程序已经完成 但是显示的时候应该熄灭的灯管确实微微亮着的 比如应该显示6的时候 却有些像8 老师说是学校的设备达不到要求 如果使用两个中断就可以解决

我不知道该如何弄 还请各位大大赐教 多谢

code:


#include <stdio.h>
#include <reg515a.h>
#include "d:\Keil\Lcd.h"
#include "d:\Keil\serial.h"
#include "d:\Keil\keyboard.h"

#define MinutesButton KEY7
#define ToggleNameLed 0x01
#define HoursButton KEY6
#define PowerButton KEY0



int i=0,dot=0,dotm=0;
int disp=1,j=0;
int count=0;
int seg[10] = {0xAF,0xA0,0xCD,0xE9,0xE2,0x6B,0x6F,0xA1,0xEF,0xEB};
int digit[4]={4,2,3,1};


void inittimer(void)
{
EAL=0;
TMOD=0X01;
TR0=1;
ET0=1;
TL0=0x17;
TH0=0xFC;
EAL=1;


}



void task1 (void) interrupt 1
{

TL0=0X17;
TH0=0XFC;
count++;
dotm++;
}





void main(void)

{


int sec=0;
int min=0;
int Tmin=0;
int hour=0;
int Thour=0;
int minutes=0;






LcdInit();
KeyboardInit();
port_init();
inittimer();
digit[0] = 0;
digit[2] = 0;
digit[1] = 0;
digit[3] = 0;


LcdSetXY(1,0);
LcdString("power is on");


while(1){

i++;
if (i > 3)
{
i=0;
}

disp*=2;

if (dotm>500)
{
dot=dot^0x10;
dotm=0;
}

if (disp >8)

{
disp =1;
}


P5=disp|0xC0;

P1=seg[digit[i]] | dot;

if(count>=1000)
{
sec++;
count=0;
}

digit[0] = min;
digit[2] = Tmin;
digit[1] = hour;
digit[3] = Thour;

if(!(P5&0x40))
{


if (count>30)
{
if (min<9)

{
min++;
}
else if (min==9)

{
Tmin++;
min=0;
}

count=0;
}

}
if(!(P5&0x80))
{

if (count>30)
{
if (min>0)
{
min--;
}
else if ((min==0)&&(Tmin>0))

{
Tmin--;
min=9;
}
else if ((min==0)&&(Tmin==0)&&(hour>0))
{
Tmin=5;
min=9;
hour--;
}
else if ((min==0)&&(Tmin==0)&&(hour==0)&&(Thour>0))
{
min=9;
Tmin=5;
hour=9;
Thour--;
}
else if ((min==0)&&(Tmin==0)&&(hour==0)&&(Thour==0))
{
min=9;
Tmin=5;
hour=3;
Thour=2;
}

count=0;

}


}

if(sec==59)
{
if (min<9)
{
min++;
}
else if (min==9)
{
Tmin++;
min=0;
}
sec=0;
}

else if((Tmin==6)&&(min==0))
{
if ((Thour<2)&&(hour<9))
{
hour++;
}
else if ((Thour<2)&&(hour==9))
{
Thour++;hour=0;
}
else if ((Thour==2)&&(hour<3))
{
hour++;
}
else if ((Thour==2)&&(hour==3))
{
Thour=0;
hour=0;
}
Tmin=0;
}

}









}










...全文
419 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
cyclone0417 2010-01-08
  • 打赏
  • 举报
回复
if ( !(x % 3)) {
P5=disp|0xC0;

P1=getal[digit[i]] | dot;
}


谢谢楼上各位 修改了这句以后 之前的问题没有了 显示起来有些不连贯

老师表示这个已经可以了 但说还不是他期望的方式

准备做个 display 在 interrupt 里面的

等好了会贴上来的

再次感谢各位了
ebabys 2010-01-07
  • 打赏
  • 举报
回复
不好意思,刚才没看代码!!

你将频率改小一点应该就好了!
ebabys 2010-01-07
  • 打赏
  • 举报
回复
板子有锁存器吗?有可能是板子的问题,
afei8856 2010-01-07
  • 打赏
  • 举报
回复
显示频率的问题吧 动态显示就是这样
lxks2003 2010-01-06
  • 打赏
  • 举报
回复
学习!
cyymycc 2010-01-06
  • 打赏
  • 举报
回复
P5=disp|0xC0;

P1=seg[digit[i]] | dot;
改为
P1=0;
P5=disp|0xC0;

P1=seg[digit[i]] | dot;
试一试
clgt2001 2010-01-06
  • 打赏
  • 举报
回复
学习
空影 2010-01-06
  • 打赏
  • 举报
回复
楼主你可以改变下位码的扫描频率看看
yanzhaozhiqing 2010-01-04
  • 打赏
  • 举报
回复
数码管扫描频率小一点就好了 试试
宇帆 2010-01-04
  • 打赏
  • 举报
回复
这个是刷新频率的事
kyzf 2010-01-04
  • 打赏
  • 举报
回复
应该是LED数码管的刷新与显示的时间控制有问题;
导致熄灭的时间不够;


我晚上给你详细的源代码吧,QQ:604914729,到时如还有问题,QQ聊。
贝隆 2010-01-04
  • 打赏
  • 举报
回复
学习
tcdzyq 2010-01-04
  • 打赏
  • 举报
回复
MARK
cyclone0417 2010-01-04
  • 打赏
  • 举报
回复
为什么不能添加回复 再试一下

多谢2,3楼的大大 一会拿到板子 我再试下

1楼的大大 等你有空还要麻烦你了 谢谢

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧