最近写了一个有关电子时钟控制的程序(我是初学者),程序调试时发现:当调节参数时,数码管显示不稳定。程序我修改了无数遍,就是不知道原因出在哪里!希望可以在各位大虾的帮助找出原因!!!!!
程序如下:
/*--------------------------------------------------------------
*题目: 可调时钟-数码管显示
* 定时器T0中断服务中产生时钟数据
* 用动态扫描显示8个数码管。
* P0口接七段数码管的段码,P2.2、P2.3、P2.4口接数码管的位控制码。
* 按键接在P1口,按下按键,对应的端口位就是0.
* 采用多功能按键设计,A、B个按键调节功能代码,选择要调节的参数;C、D按键循环调节选中的参数的值。
* 闹铃声音信号从P1.5口输出;时间控制接口从P1.6输出,控制指示灯接P3.7口。
---------------------------------------------------------------*/
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar hour,min,sec,flag,num0;
uchar c1_hour,c1_min;
uchar cont1_sh,cont1_sm;
uchar cont1_eh,cont1_em;
sbit sound=P1^5;
sbit cont_led=P3^7;
sbit control=P1^6;
sbit key_a=P1^0;
sbit key_b=P1^1;
sbit key_c=P1^2;
sbit key_d=P1^3;
uchar code table[]={
0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90,
0x40,0x79,0x24,0x30,0x19,
0x12,0x02,0x78,0x00,0x10,
0x88,0x83,0xc6,0xa1,0x86,0x8e,0x8c,0xbf};
void delayms(uint xms) //延时xms
{
uint i,j;
for(i=xms;i>0;i--)
for(j=120;j>0;j--);
}
void init()
{
hour=13;
min=31;
sec=30;
c1_hour=12;
c1_min=33;
cont1_sh=12;
cont1_sm=32;
cont1_eh=12;
cont1_em=33;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
// TH1=(65536-4000)/256;
// TL1=(65536-4000)%256;
EA=1;
ET0=1;
// ET1=1;
TR0=1;
// TR1=1;
}
void display(uchar num,uchar dat)
{
P0=table[dat];//P0口为段码接口
P2=0xe3+4*num;//74ls138输出端作为位码接口
delayms(1);
}
void dis_time()
{
uchar i;
i=hour/10;
display(0,i);
i=hour%10;
display(1,i);
display(2,27);
i=min/10;
display(3,i);
i=min%10;
display(4,i);
display(5,27);
i=sec/10;
display(6,i);
i=sec%10;
display(7,i);
}
void dis_adj(uchar sj1,uchar sj2,uchar sj3 )
{
uchar t;
display(0,26);
t=sj1/10;
display(1,t);
t=sj1%10;
display(2,t);
display(3,27);
t=sj2/10;
display(4,t);
t=sj2%10;
display(5,t+10);
t=sj3/10;
display(6,t);
t=sj3%10;
display(7,t);
}
void dis_all()
{
switch(flag)
{
case 0: dis_time();
break;
case 1:
case 2: dis_adj(flag,hour,min);
break;
case 3:
case 4: dis_adj(flag,c1_hour,c1_min);
break;
case 5:
case 6: dis_adj(flag,cont1_sh,cont1_sm);
break;
case 7:
case 8: dis_adj(flag,cont1_eh,cont1_em);
break;
}
}
void t_control()
{
if(!flag)
{
if((c1_hour==hour)&&(c1_min==min))
sound=0;
if(min==c1_min+1)
sound=1;
if((cont1_sh==hour)&&(cont1_sm==min))
{
cont_led=0;
control=0;
}
if((cont1_eh==hour)&&(cont1_em==min))
{
cont_led=1;
control=1;
}
}
}
/*------------------------------------------
A键处理:调节功能标志flag循环增加
-------------------------------------------*/
void key_scan()
{
if(key_a==0)
{
delayms(10);
if(key_a==0)
{
flag++;
if(flag==1||flag==2)
TR0=0;
else TR0=1;
if(flag==9)
flag=0;
while(!key_a);
dis_all();
}
}
/*------------------------------------------
B键处理:调节功能标志flag循环减少
-------------------------------------------*/
if(key_b==0)
{
delayms(10);
if(key_b==0)
{
flag--;
if(flag==1||flag==2)
TR0=0;
else TR0=1;
if(flag==-1)
flag=8;
dis_all();
while(!key_b);
dis_all();
}
}
/*------------------------------------------
C键处理:根据功能标志flag的值进行判断
调节时钟-小时、分钟,闹钟1-小时、分钟,时段控制-小时、分钟的增加
-------------------------------------------*/
if(key_c==0)
{
delayms(10);
if(key_c==0)
{
if(flag==1)
{
hour++;
if(hour==24)
hour=0;
}
if(flag==2)
{
min++;
if(min==60)
min=0;
}
if(flag==3)
{
c1_hour++;
if(c1_hour==24)
c1_hour=0;
}
if(flag==4)
{
c1_min++;
if(c1_min==60)
c1_min=0;
}
if(flag==5)
{
cont1_sh++;
if(cont1_sh==24)
cont1_sh=0;
}
if(flag==6)
{
cont1_sm++;
if(cont1_sm==60)
cont1_sm=0;
}
if(flag==7)
{
cont1_eh++;
if(cont1_eh==24)
cont1_eh=0;
}
if(flag==8)
{
cont1_em++;
if(cont1_em==60)
cont1_em=0;
}
while(!key_c);
}
}
/*------------------------------------------
D键处理:根据功能标志flag的值进行判断
调节时钟-小时、分钟,闹钟1-小时、分钟,时段控制-小时、分钟的减少
-------------------------------------------*/
if(key_d==0)
{
delayms(10);
if(key_d==0)
{
if(flag==1)
{
if(hour==0) hour=23;
else hour--;
}
if(flag==2)
{
if(min==0) min=59;
else min--;
}
if(flag==3)
{
if(c1_hour==0) c1_hour=23;
else c1_hour--;
}
if(flag==4)
{
if(c1_min==0) c1_min=59;
else c1_min--;
}
if(flag==5)
{
if(cont1_sh==0) cont1_sh=23;
else cont1_sh--;
}
if(flag==6)
{
if(cont1_sm==0) cont1_sm=59;
else cont1_sm--;
}
if(flag==7)
{
if(cont1_eh==0) cont1_eh=23;
else cont1_eh--;
}
if(flag==8)
{
if(cont1_em==0) cont1_em=59;
else cont1_em--;
}
while(!key_d);
}
}
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
num0++;
if(num0==20)
{
num0=0;
sec++;
if(sec==60)
{
sec=0;
min++;
if(min==60)
{
min=0;
hour++;
if(hour==24)
{
hour=0;
}
}
}
}
}
void main()
{
init();
while(1)
{
key_scan();
dis_all();
t_control();
}
}
此帖出自
小平头技术问答
把检测按键放开的那个while删掉,不然你一按,程序就卡那里了,影响数码管输出
你可以循环N次扫描一次按键,这样就不会按一下执行多次了
i++;
if(i>13)
{
key_scan();
i=0;
}
数值自己选取个合适的
[ 本帖最后由 孤獨の快樂 于 2012-7-2 13:26 编辑 ]一周热门 更多>