|
本帖最后由 三元里 于 2015-1-15 10:33 編輯
在以上兩位老師的指導(dǎo)下,我的帶定鬧時電子鐘c程完工了,在學(xué)習(xí)機(jī)上通過。剛學(xué),程序?qū)懙蒙泊舭澹赡艽嬖阱e誤,還望指導(dǎo)!
#include <reg52.h> // 自寫數(shù)碼鬧鐘程序
typedef unsigned char uint8;
typedef unsigned int uint16;
code uint8 number[] = {0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90};
uint8 a[6], b[6];
uint16 counter = 0;
uint8 sec=0,min=0,hour=0,t_min=0,t_hour=0,ky;
uint16 counter1=0;
sfr T2MOD=0XC9;
sbit BUZZ = P1^6;
sbit ENLED = P1^4;
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit KeyOut1=P2^3;
sbit K1 = P2^4;
sbit K2 = P2^5;
sbit K3 = P2^6;
void timer1_init() //定時器1初使化
{
TMOD |= 0x10;
TMOD &= 0xdf;
TH1 = 0xFC;
TL1 = 0x67;
ET1 = 1;
EA = 1;
TR1 = 1; }
void interrupt_timer1()interrupt 3 //T1中斷函數(shù)
{ TH1 = 0xFC;
TL1 = 0x67;
counter1++;
if(counter1 == 10000)
{ counter1 =0;
TR1 = 0;}
BUZZ = ~BUZZ;
}
void timer2_init() // 定時器T2運行函數(shù)
{
T2MOD=0X00;
TH2=(65536-110592/60)/256;
TL2=(65536-110592/60)%256;
RCAP2H=TH2;
RCAP2L=TL2;
EA=1;
ET2=1;
TR2=1;
}
void refresh_led() //數(shù)碼管刷新函數(shù)
{
static uint8 j = 0;
if(ky==1) //刷新走時
switch(j)
{
case 0: ADDR0 = 0;ADDR1 = 0;ADDR2 = 0;j++;P0 =0x7f & number[a[0]];break;
case 1: ADDR0 = 1;ADDR1 = 0;ADDR2 = 0;j++;P0 = number[a[1]];break;
case 2: ADDR0 = 0;ADDR1 = 1;ADDR2 = 0;j++;P0 =0x7f & number[a[2]];break;
case 3: ADDR0 = 1;ADDR1 = 1;ADDR2 = 0;j++;P0 = number[a[3]];break;
case 4: ADDR0 = 0;ADDR1 = 0;ADDR2 = 1;j++;P0 =0x7f & number[a[4]];break;
case 5: ADDR0 = 1;ADDR1 = 0;ADDR2 = 1;j = 0;P0 = number[a[5]];break;
default: break;
}
else if(ky==0) //刷新鬧時
switch(j)
{
case 0: ADDR0 = 0;ADDR1 = 0;ADDR2 = 0;j++;P0 = 0x7f & number[b[0]];break;
case 1: ADDR0 = 1;ADDR1 = 0;ADDR2 = 0;j++;P0 = number[b[1]];break;
case 2: ADDR0 = 0;ADDR1 = 1;ADDR2 = 0;j++;P0 = 0x7f & number[b[2]];break;
case 3: ADDR0 = 1;ADDR1 = 1;ADDR2 = 0;j++;P0 = number[b[3]];break;
case 4: ADDR0 = 0;ADDR1 = 0;ADDR2 = 1;j++;P0 = 0x7f & number[b[4]];break;
case 5: ADDR0 = 1;ADDR1 = 0;ADDR2 = 1;j = 0;P0 = number[b[5]];break;
default: break;
}
}
void Hms(void) //秒,分,時計算函數(shù)
{
static uint16 ui2msCount=0;
ui2msCount++;
if(ui2msCount>499)
{
ui2msCount=0;
sec++;
if(sec>59)
{
sec=0;
min++;
if((ky==1)&&(t_hour==hour)) {if(t_min==min)timer1_init();}
if(min>59)
{
min=0;
hour++;
if(hour>23)
hour=0;
}
}
}
a[5]=hour/10;
a[4]=hour%10;
a[3]=min/10;
a[2]=min%10;
a[1]=sec/10;
a[0]=sec%10;
if(ky==0)
{ b[5]=t_hour/10;
b[4]=t_hour%10;
b[3]=t_min/10;
b[2]=t_min%10;
b[1]=0;
b[0]=0;
};
}
void Key3(void) //K3按鍵處理函數(shù)
{
while(!K3);
ky++;
if(ky > 1)
ky=0;
}
void Key2(void) //K2按鍵處理函數(shù)
{
while(!K2);
{if(ky==1)
{ min++;
if(min>59)
min=0;};
if(ky==0)
{t_min++;
if(t_min>59)
t_min=0;};
}
}
void Key1(void) //K1按鍵處理函數(shù)
{
while(!K1);
{if(ky==1)
{ hour++;
if(hour>23)
hour=0;};
if(ky==0)
{t_hour++;
if(t_hour>59)
t_hour=0;};
}
}
void Delay(uint16 ms) //毫秒延時函數(shù)
{
uint8 i;
while(ms--)
{
for( i=0;i<125;i++)
;
}
}
main() //主函數(shù)
{
ENLED = 0; ADDR3 = 1;
timer2_init();
KeyOut1=0;
while(1)
{
if(!K1)
Delay(5);
if(!K1)
Key1();
if(!K2)
Delay(5);
if(!K2)
Key2();
if(!K3)
Delay(5);
if(!K3)
Key3();
}
}
void interrupt_timer2() interrupt 5 // 定時器T2中斷函數(shù)
{
TF2=0;
Hms();
refresh_led();
}
|
|