电子时钟

用之前学的知识,自己做一个电子时钟

  1. 8个数码管分别显示"时时-分分-秒秒"如"08-12-24"
  2. 用三个独立按键,一个表示上,一个表示下,另一个表示模式切换
  3. 有四种模式:正常模式,调分钟模式,调小时模式,调秒模式。切换到哪一个,可以通过上下调整大小。

第一个功能的实现

注意到显示的形式不再是一个数,而是三个数,而且中间有"-"分割,因此需要对disp.h和disp.c进行进一步完善

\*disp.h*\
#ifndef __DISP_H__   //这几句话的意思是为了保证这个h文件只被调用一次
#define __DISP_H__

#define uchar unsigned char
extern uchar code tab[];
void disp(long int x);  
void dispTime(int h, int m, int s);  //加一个新的函数用来显示时间
void DelaySMG(unsigned int time);    

#endif
\*disp.c*\
#include "disp.h" //注意到此处是用的"",用<>也可以,具体原因请自行探索。
#include <STC15F2K60S2.h>
uchar code tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF};//0-9,最后一个加了0xBF表示-

void disp(long int dat) //函数的定义
{
	int i;
	unsigned char str[8];
	str[0]=dat/10000000%10;
	str[1]=dat/1000000%10;
	str[2]=dat/100000%10;
	str[3]=dat/10000%10;
	str[4]=dat/1000%10;
	str[5]=dat/100%10;
	str[6]=dat/10%10;
	str[7]=dat/1%10;
	for( i = 0 ;i<8;i++)
	{
		
		P2 = P2&0x1f|0xc0;P0=0X01<<i;
		P2 = P2&0x1f|0xe0;P0=tab[str[i]];
		P2 = P2&0x1f;
		DelaySMG(600);
		P2=P2&0x1f|0xc0;P0=0;	
	}
}
void dispTime(int h,int m,int s) //显示时分秒
{
	int i;
	unsigned char str[8];
	str[0]=h/10;
	str[1]=h%10;
	str[2]=10; //第十个字符是”-“
	str[3]=m/10;
	str[4]=m%10;
	str[5]=10;
	str[6]=s/10;
	str[7]=s%10;
	for( i = 0 ;i<8;i++)
	{
		
		P2 = P2&0x1f|0xc0;P0=0X01<<i;
		P2 = P2&0x1f|0xe0;P0=tab[str[i]];
		P2 = P2&0x1f;
		DelaySMG(600);
		P2=P2&0x1f|0xc0;P0=0;	
	}
}
void DelaySMG(unsigned int time) //函数的定义
{
    while(time--);
}

main函数也相应修改

#include <STC15F2K60S2.h>
#include "disp.h"
#define FOSC 18432000L
#define T1MS (65536-FOSC/1000)
int num = 0;
int h =2, m = 10, s = 0;
void InitBoard();
void InitTimer0();

void main()
{
	InitBoard();
	InitTimer0();
	while(1)
	{
		dispTime(h,m,s);
	};
}
void timer0() interrupt 1  
{
	num++;
	if(num>=1000)
	{
		num = 0;   //此时时间经过一秒
		s++;       //秒+1
		if(s>=60)   //如果秒到了60
		{
			s=0;     //秒变为0
			m++;      //分钟+1
			if(m>=60)  //如果分到了60
			{
				m=0;    //分变为0
				h++;     //小时+1
				if(h>=24)   //如果小时到了24
				{
					h=0;    //小时变为0
				}
			}
		}
		
	}	
}

void InitBoard()      
{
	P2=0XA0;P0=0X00;
	P2=0X80;P0=0XFF; 

}
void InitTimer0()      
{
	AUXR |=0x80; 
	TMOD = 0x00; 
	TL0 = T1MS%256;  
	TH0 = T1MS/256;	
	TR0=  1;  
	ET0 = 1;  
	EA = 1;   
}

按键功能的实现

main函数改为如下

#include <STC15F2K60S2.h>
#include "disp.h"
#define FOSC 18432000L 
#define T1MS (65536-FOSC/1000)
#define set P30  //定义三个按键
#define up P31
#define down P32
int num = 0;
int h =2, m = 10, s = 0;
int mode = 0;// 模式,如果为0就是正常模式,如果1就调h,2调m,3调s
void InitBoard();
void InitTimer0();

void main()
{
	InitBoard();
	InitTimer0();
	while(1)
	{
		dispTime(h,m,s);
		if(set == 0 )
		{
			DelaySMG(60000);
			if(set ==0)
			{
				mode=(++mode)%4;  //m加1然后对4取余数,这样可以保证h不大于3
			}
			while(set ==0);
		}
		if(up == 0)
		{
			DelaySMG(60000);
			if(up ==0)
			{
				switch(mode)
				{
					case 1: h=(++h)%24;break;//h加1然后对24取余数,这样可以保证h不大于23
					case 2: m=(++m)%60;break;
					case 3: s=(++s)%60;break;
					default:break;
				}
			}
			while(up ==0);
		}
		if(down == 0)
		{
			DelaySMG(60000);
			if(down ==0)
			{
				switch(mode)
				{
					case 1: h==0?h = 23:h--;break;//判断h是否到0了,如果为0那么变为23,否则自减1
					case 2: m==0?m = 59:m--;break;
					case 3: s==0?s = 59:s--;break;
					default:break;
				}
			}
			while(down ==0);
		}
	}
}
void timer0() interrupt 1   
{
	num++;
	if(num>=1000)
	{
		num = 0;
		s++;
		if(s>=60)
		{
			s=0;
			m++;
			if(m>=60)
			{
				m=0;
				h++;
				if(h>=24)
				{
					h=0;
				}
			}
		}
		
	}	
}

void InitBoard()      
{
	P2=0XA0;P0=0X00;
	P2=0X80;P0=0XFF; 

}
void InitTimer0()     
{
	AUXR |=0x80; 
	TMOD = 0x00; 
	TL0 = T1MS%256;  
	TH0 = T1MS/256;	 
	TR0=  1;  
	ET0 = 1; 
	EA = 1; 
}
============================找指导老师布置任务吧==============================