电子时钟
用之前学的知识,自己做一个电子时钟
- 8个数码管分别显示"时时-分分-秒秒"如"08-12-24"
- 用三个独立按键,一个表示上,一个表示下,另一个表示模式切换
- 有四种模式:正常模式,调分钟模式,调小时模式,调秒模式。切换到哪一个,可以通过上下调整大小。
第一个功能的实现
注意到显示的形式不再是一个数,而是三个数,而且中间有"-"分割,因此需要对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; }============================找指导老师布置任务吧==============================