我這兒有個程序我改了半天運行不對 #include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit duan = P1^6; //段選
sbit wei = P1^7; //位選
sbit S1 = P3^6; //暫停鍵
sbit S2 = P3^5; //增加鍵
sbit S3 = P3^4; //減少鍵
sbit S4 = P3^1; //鬧鐘設置鍵
sbit S5 = P3^0; //鬧鐘啟用停止鍵
sbit BEE = P1^5;//蜂鳴器
sbit S6=P3^2; //24小時與12小時轉換
uchar code aaa[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar temp,out = 1,qq = 0,ww = 0,H,M,S,j1,j2,k1,k2,l1,l2;
uchar H1 = 0,M1 = 0,Sa = 0,j10,j20,k10,k20,l10,l20,SS = 0;
uint UT;
void delayMS(x) //延時函數,單位毫秒
{
uint a , b;
for(a = 0 ; a < x ; a++ )
for(b = 0 ; b < 110 ; b++);
}
void play(uint h1 , uint h2 , uint m1 , uint m2 , uint s1 , uint s2) //時分秒的顯示
{
wei = 1; //時的十位
P2 = 0x7f;
wei = 0;
duan = 1;
P0 = aaa[h1];
duan = 0;
delayMS(3);
wei = 1; //時的個位
P2 = 0xbf;
wei = 0;
duan = 1;
P0 = aaa[h2];
duan = 0;
delayMS(3);
wei = 1; //分的十位
P2 = 0xdf;
wei = 0;
duan = 1;
P0 = aaa[m1];
duan = 0;
delayMS(3);
wei = 1; //分的個位
P2 = 0xef;
wei = 0;
duan = 1;
P0 = aaa[m2];
duan = 0;
delayMS(3);
wei = 1; //秒的十位
P2 = 0xf7;
wei = 0;
duan = 1;
P0 = aaa[s1];
duan = 0;
delayMS(3);
wei = 1; //秒的個位
P2 = 0xfb;
wei = 0;
duan = 1;
P0 = aaa[s2];
duan = 0;
delayMS(3);
}
void stopfunc() //S1鍵函數 暫停
{
if(S1 == 0)
{
while(!S1);
qq++;
out = 0; //暫停
TR0 = 0;
}
}
void WWS4() //鬧鐘設置
{
if(S4 == 0)
{
while(!S4);
ww++;
}
}
void begin() //S5鍵 鬧鐘啟動和停止
{
if(S5 == 0)
{
while(!S5);
SS = !SS;
}
}
void clock()
{ unsigned int i;
for(i=1000;i>0;i--)
{BEE=1;
P1=0xfe;
delayMS(10);
BEE=0;
P1=0xff;
delayMS(10);}}
void ala() //鬧鐘控制蜂鳴器
{
if((H == H1) && (M == M1) && (SS == 1))
{
clock();
}
}
void to12()
{ if(S6==0)
{
if(H>=12)
{H=H-12;}
if(H1>=12)
{H1=H1-12;}
}
}
void buttfunc() //S2鍵、S3鍵函數 調時
{
if(qq == 1) //第一次按S1時,調秒
{
if(S2 == 0)
{
while(!S2);
if(S < 59)
{
S++;
}
else
{
S = 0;
}
delayMS(5);
}
if(S3 == 0)
{
while(!S3);
if(S > 0)
{
S--;
}
else
{
S = 59;
}
delayMS(5);
}
j1=H%10;
j2=H/10;
k1=M%10;
k2=M/10;
l1=S%10;
l2=S/10;
play(j2,j1,k2,k1,l2,l1);
}
if(qq == 2) //第二次按S1時,調分
{
if(S2 == 0)
{
while(!S2);
if(M < 59)
{
M++;
}
else
{
M = 0;
}
delayMS(5);
}
if(S3 == 0)
{
while(!S3);
if(M > 0)
{
M--;
}
else
{
M = 59;
}
delayMS(5);
}
j1=H%10;
j2=H/10;
k1=M%10;
k2=M/10;
l1=S%10;
l2=S/10;
play(j2,j1,k2,k1,l2,l1);
}
if(qq == 3) //第三次按S1時,調時
{
if(S2 == 0)
{
while(!S2);
if(H < 23)
{
H++;
}
else
{
H = 0;
}
delayMS(5);
}
if(S3 == 0)
{
while(!S3);
if(H > 0)
{
H--;
}
else
{
H = 23;
}
delayMS(5);
}
j1=H%10;
j2=H/10;
k1=M%10;
k2=M/10;
l1=S%10;
l2=S/10;
play(j2,j1,k2,k1,l2,l1);
}
if(qq == 4) //第四次 ,設鬧鐘
{
j10=H1%10;
j20=H1/10;
k10=M1%10;
k20=M1/10;
l10=Sa%10;
l20=Sa/10;
play(j20,j10,k20,k10,l20,l10);
if(ww == 1)
{
if(S2 == 0)
{
while(!S2);
if(M1 < 59)
{
M1++;
}
else
{
M1 = 0;
}
delayMS(10);
}
if(S3 == 0)
{
while(!S3);
if(M1 > 1)
{
M1--;
}
else
{
M1 = 59;
}
}
}
if(ww == 2)
{
if(S2 == 0)
{
while(!S2);
if(H1 < 23)
{
H1++;
}
else
{
H1 = 0;
}
delayMS(10);
}
if(S3 == 0)
{
while(!S3);
if(H1 > 1)
{
H1--;
}
else
{
H1 = 23;
}
}
}
}
if(qq == 5) //第五次按S1時,繼續計時
{
while(!S1);
qq = 0;
ww = 0;
out = 1;
}
}
void main()
{
TMOD = 0x01; //定時器0
IE = 0x83; //中斷打開,打開外部中斷0和定時器0中斷
TH0 = (65536 - 46080)/256; //初值:2^16=65536 11.0592*10^6 * 50*10^(-3)=46080 (晶振*中斷時間)
TL0 = (65536 - 46080)%256;
while(1)
{
stopfunc();
begin();
ala();
to12();
if(out == 1)
{
TR0 = 1;
if(UT == 20) //1秒鐘到了----20*50=1000ms
{
UT = 0;
S++;
if(S == 60)
{
S=0;
M++;
if(M == 60)
{
M = 0;
H++;
if(H == 24) //24小時制
{
H = 0;
}
}
}
}
j1=H%10;
j2=H/10;
k1=M%10;
k2=M/10;
l1=S%10;
l2=S/10;
play(j2,j1,k2,k1,l2,l1);
}
else
{
WWS4();
buttfunc();
}
}
}
void TIME() interrupt 1
{
TH0 = (65536 - 46080)/256; //重裝初值
TL0 = (65536 - 46080)%256;
UT++;
}
就是其中的24小時轉12小時我做仿真的時候一按那按鍵時間就不走了
|