大家帮我看看这个程序,用定时写的简单时钟,四位八段数码管显示,例:每次按键时候假如秒显示00,按加键时候到58就跳到00;假如按减键显示的不是59,而是乱的,为什么不是按程序写的加减,而是乱搞
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
void display(uchar,uchar,uchar);
sbit key_sure=P0^0; //***确定键***
sbit key_add=P0^1; //***加键*****
sbit key_cut=P0^2; //***减键*****
sbit key_move=P0^3; //***移位键***
bit f_ks;f_ka;f_kc;f_km;//键标志位
uchar t_num;km_num;shi;fen;miao;
void delay(uchar ms)
{
uchar i;
while(ms--)
for(i=0;i<200;i++);
}
void time_int()
{
TMOD=0x01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
ET0=1;
TR0=1;
EA=1;
}
void time() interrupt 1 using 0
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
if(t_num++==100)
{
t_num=0;
if(miao++==60)
{
miao=0;
if(fen++==60)
{
fen=0;
if(shi++==25)
{
shi=0;
}
}
}
}
}
void key_scan() //检测独立式键盘
{
if(key_sure==0)
{
delay(5);
if(key_sure==0)
{
f_ks=1;
while(!key_sure)
display(shi,fen,miao);
delay(5);
while(!key_sure)
display(shi,fen,miao);
}
}
if(key_add==0)
{
delay(5);
if(key_add==0)
{
f_ka=1;
while(!key_add)
display(shi,fen,miao);
delay(5);
while(!key_add)
display(shi,fen,miao);
}
}
if(key_cut==0)
{
delay(5);
if(key_cut==0)
{
f_kc=1;
while(!key_cut)
display(shi,fen,miao);
delay(5);
while(!key_cut)
display(shi,fen,miao);
}
}
if(key_move==0)
{
delay(5);
if(key_move==0)
{
f_km=1;
while(!key_move)
display(shi,fen,miao);
delay(5);
while(!key_move);
display(shi,fen,miao);
}
}
}
void key_control() //键盘控制
{
key_scan();
if(f_km==1)
{
f_km=0;
km_num++;
if(km_num==4)
{
km_num=0;
}
}
if(km_num!=0)
TR0=0;
else TR0=1;
if(km_num==1)
{
if(f_ka==1)
{
f_ka=0;
miao=miao+1;
if(miao==59)
miao=0;
}
if(f_kc==1)
{
f_kc=0;
miao=miao-1;
if(miao==0)
miao=59;
}
}
if(km_num==2)
{
if(f_ka==1)
{
f_ka=0;
fen++;
if(fen==59)
fen=0;
}
if(f_kc==1)
{
f_kc=0;
fen--;
if(fen==0)
fen=59;
}
}
if(km_num==3)
{
if(f_ka==1)
{
f_ka=0;
shi++;
if(shi==24)
shi=0;
}
if(f_kc==1)
{
f_kc=0;
shi--;
if(shi==0)
shi=24;
}
}
}
void main() //主函数
{
time_int();
shi=0;fen=0;miao=0;km_num=0;
while(1)
{
key_control();
display(shi,fen,miao);
}
}
下面调用的是显示函数:
#include<reg52.h>
#define uchar unsigned char
sbit LS138A=P2^2; //位选口
sbit LS138B=P2^3; //位选口
sbit LS138C=P2^4; //位选口,通过锁存器373控制
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90,
0x88,0x83,0xc6,0xa1,0x86,0x8e,0x89,0x86,0xc7,0xbf,0xff}; //段码
uchar N_data[8];dat;n;
void delayms(uchar ms) //延时函数
{
uchar j;
while(ms--)
for(j=0;j<20;j++);
}
void display(uchar h,uchar m,uchar s)
{
uchar i;
N_data[0]=table[h/10];
N_data[1]=table[h%10];
N_data[2]=table[19];
N_data[3]=table[m/10];
N_data[4]=table[m%10];
N_data[5]=table[19];
N_data[6]=table[s/10];
N_data[7]=table[s%10];
for(i=0;i<8;i++)//位码扫描并送段码显示
{
switch(i)
{
case 0:LS138A=0; LS138B=0; LS138C=0; break;
case 1:LS138A=1; LS138B=0; LS138C=0; break;
case 2:LS138A=0; LS138B=1; LS138C=0; break;
case 3:LS138A=1; LS138B=1; LS138C=0; break;
case 4:LS138A=0; LS138B=0; LS138C=1; break;
case 5:LS138A=1; LS138B=0; LS138C=1; break;
case 6:LS138A=0; LS138B=1; LS138C=1; break;
case 7:LS138A=1; LS138B=1; LS138C=1; break;
default: break;
}
P1= N_data[i];
delayms(5);
}
} |