这是单片机实现的电子手表上的C语言程序
日期显示还有点下问题:
#include"at89x51.h"
#define uchar unsigned char
sbit key=P3^4;
sbit key_change=P3^5;
sbit key_up=P3^6;
sbit key_down=P3^7;
uchar tab[]={ //数码管显示代码表
0xC0,/*0*/
0xF9,/*1*/
0xA4,/*2*/
0xB0,/*3*/
0x99,/*4*/
0x92,/*5*/
0x82,/*6*/
0xF8,/*7*/
0x80,/*8*/
0x90,/*9*/
};
uchar number,count,change;
uchar date,month;
uchar hour,mintue,second;
/******************************
初始化程序
******************************/
void system()
{
hour=12;
mintue=10;
second=0;
date=23;
month=5;
count=number=change=0;
TMOD=0x01;
TR0=1;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
}
/******************************
延时毫秒程序
******************************/
void delay(uchar no)
{
uchar i,j;
for(i=0;i<no;i++)
{
for(i=0;j<164;j++);
for(i=0;j<164;j++);
}
}
/******************************
定时器0中断处理程序
******************************/
void timer1_ISR() interrupt 1
{
count++;
if(count==20)
{
count=0;
second++;
if(second==60)
{
second=0;
mintue++;
if(mintue==60)
{
mintue=0;
hour++;
if(hour==24)
{
hour=0;
date++;
if(date==30)
{
month++;
month=month%13;
}
}
}
}
}
}
/******************************
显示程序
******************************/
void display_day()
{
P0=tab[month/10];
P2_0=0;
delay(1);
P2_0=1;
P0=tab[month%10];
P2_1=0;
delay(1);
P2_1=1;
P0=tab[date/10];
P2_2=0;
delay(1);
P2_2=1;
P0=tab[date%10];
P2_3=0;
delay(1);
P2_3=1;
}
void display_time()
{
P0=tab[hour/10];
P2_0=0;
delay(1);
P2_0=1;
P0=tab[hour%10];
P2_1=0;
delay(1);
P2_1=1;
P0=tab[mintue/10];
P2_2=0;
delay(1);
P2_2=1;
P0=tab[mintue%10];
P2_3=0;
delay(1);
P2_3=1;
}
void display_second()
{
P0=tab[second/10];
P2_2=0;
delay(1);
P2_2=1;
P0=tab[second%10];
P2_3=0;
delay(1);
P2_3=1;
}
void deal_change()
{
if(key_change==0)
{
change++;
while(!key_change)
{
display_time();
}
change=change%5;
}
}
void deal_change0()
{
if(change==0)
{
if(key==0)
{
number++;
number=number%3;
while(!key);
}
if(number==0)
{
display_time();
}
if(number==1)
{
display_second();
}
if(number==2)
{
display_day();
}
}
}
void deal_change1()
{
if(change==1)
{
display_time();
if(key_up==0)
{
mintue++;
while(!key_up)
{
display_time();
}
if(mintue==60)
{
mintue=0;
hour++;
if(hour==24)
{
date++;
if(date==30)
{
month++;
month=month%13;
}
}
}
}
if(key_down==0)
{
if(mintue==0)
{
mintue=60;
if(hour==0)
{
hour=24;
date--;
if(date==0)
month--;
hour--;
}
}
mintue--;
while(!key_down)
{
display_time();
}
}
}
}
void deal_change2()
{
if(change==2)
{
display_time();
if(key_up==0)
{
hour++;
while(!key_up)
{
display_time();
}
if(hour==24)
{
hour=0;
date++;
if(date==30)
{
month++;
date=1;
}
}
}
if(key_down==0)
{
while(!key_down)
{
display_time();
}
if(hour==0)
{
hour=24;
date--;
if(date==0)
{
month--;
date=30;
}
}
hour--;
}
}
}
void deal_change3()
{
if(change==3)
{
display_day();
if(key_up==0)
{
date++;
while(!key_up)
{
display_day();
}
if(date==30)
{
month++;
date=1;
}
}
if(key_down==0)
{
while(!key_down)
{
display_day();
}
if(date==0)
{
month--;
date=31;
}
date--;
}
}
}
void deal_change4()
{
if(change==4)
{
display_day();
if(key_up==0)
{
month++;
month=month%13;
while(!key_up)
display_day();
}
if(key_down==0)
{
month--;
if(month==0)
month=12;
while(!key_down)
display_day();
}
}
}
/************************
主程序
************************/
void main()
{
system();
while(1)
{
deal_change();
deal_change0();
deal_change1();
deal_change2();
deal_change3();
deal_change4();
}
}