六位数码管显示时分秒,通过四个按键进行时间的控制。按下"调时"按键,时间显示停止;按下"选择时分秒"按键,数码管上方的发光二极管会点亮,对应着选中的要修改的时间是小时、分钟还是秒;按下"按下增加"按键,选中的时间将会增加;按下"完成"按键,时间继续显示。
已通过proteus仿真,电路图如下所示,希望大家多多指点,积极留言:
- //编程:jumpmysoul
- #include<reg52.h>
- #define ulong unsigned long
- char tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳数码管数字码
- char tab_dp[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x70,0x10};//共阳数码管数字码(带小数点)
- #define LED P0 //P0为数码管的段选
- #define LIGHT P1 //P1为时分秒位的指示灯
- #define WS P2 //P2为数码管的位选
- sbit time_change=P3^0; //P3^0为“调时”按键
- sbit time_choose=P3^1; //P3^1为“选择时分秒”按键
- sbit time_inc=P3^2; //P3^2为“增加”按键
- sbit time_ok=P3^3; //P3^3为“完成”按键
- ulong t;
- ulong sec,min,hour,sec_ge,sec_shi,min_ge,min_shi,hour_ge,hour_shi; //定义秒,分,时,秒的个位,十位,分的个位,十位,时的个位,十位
- int choose_n; //按下“选择时分秒”按键的次数
- int flag; //定义“调时”按键的标志位
- //---------------------------------------------------------------------
- void init();
- void display();
- void delay(int);
- void time_modify();
- //---------------------------------------------------------------------
- void main()
- {
- init();
- while(1)
- {
- TR0=1;
- display();
- time_modify();
- }
- }
- //---------------------------------------------------------------------
- void init()
- {
- WS=t=LIGHT=choose_n=0;
- sec_ge=sec_shi,min_ge,min_shi,hour_ge,hour_shi=sec=min=hour=flag=0;
- TMOD=0x01; //定义定时器0工作与方式1
- TH0=(65536-5536)/256; //定时器赋初值
- TL0=(65536-5536)%256;
- EA=1; //开总中断和T0中断
- ET0=1;
- }
- //--------------------------------延时子函数------------------------------------
- void delay(int x)
- {
- int i,j;
- for(i=x;i>0l;i--)
- for(j=255;j>0;j--);
- }
- //-------------------------------显示子函数---------------------------------------
- void display()
- {
- int i=0;
- if(TF0==1) //如果定时器溢出
- {
- TF0=0; //清中断标志位
- t++;
- if(t==10)
- {
- t=0;
- sec++; //秒加1
- if(sec==60) //如果秒为60,则清零,分加1
- {
- sec=0;
- min++;
- }
- if(min==60) //如果分为60,则清零,时加1
- {
- min=0;
- hour++;
- }
- if(hour==24) //如果时为24,则清零
- {
- hour=0;
- }
- }
- }
- sec_ge=sec%10; //秒的个位和十位
- sec_shi=sec/10;
- min_ge=min%10; //分的个位和十位
- min_shi=min/10;
- hour_ge=hour%10; //时的个位和十位
- hour_shi=hour/10;
- WS=0x20; //循环扫描
- LED=tab[sec_ge];
- delay(1);
- WS=0x10;
- LED=tab[sec_shi];
- delay(1);
- WS=0x08;
- LED=tab_dp[min_ge];
- delay(1);
- WS=0x04;
- LED=tab[min_shi];
- delay(1);
- WS=0x02;
- LED=tab_dp[hour_ge];
- delay(1);
- WS=0x01;
- LED=tab[hour_shi];
- delay(1);
- }
- //----------------------------调时子程序-------------------------------
- void time_modify()
- {
- if(time_change==0) //如果“调时”按键按下
- {
- delay(5); //延时去抖
- if(time_change==0)
- {
- flag=1; //标志位置1
- while(flag) //当标志位为1时才能进行时间调整
- {
- TR0=0; //定时器停止
- display(); //显示停止时的时间
- if(time_ok==0) //如果“完成”按键按下
- {
- delay(15); //延时去抖
- if(time_ok==0)
- {
- flag=0; //标志位清零
- }
- }
- if(time_choose==0) //如果“时分秒选择”按键按下
- {
- delay(30); //延时去抖
- if(time_choose==0)
- {
- ++choose_n; //按下的次数增加
- if(choose_n==4) //如果次数达到4次
- {
- choose_n=1; //次数清零
- }
- if(choose_n==1) //如果次数为1,秒指示灯亮
- {
- LIGHT=0x03;
- }
- else if(choose_n==2) //如果次数为2,分指示灯亮
- {
- LIGHT=0x0c;
- }
- else if(choose_n==3) //如果次数为3,时指示灯亮
- {
- LIGHT=0x30;
- }
- }
- }
- if(time_inc==0) //如果“增加”按键按下
- {
- delay(30); //延时去抖
- if(time_inc==0)
- {
- switch(choose_n) //分支结构,根据choose_n的值来判断哪一位加1
- {
- case 1: //如果choose_n为1,秒加1,到60清零
- {
- sec++;
- if(sec==60)
- sec=0;
- break;
- }
- case 2: //如果choose_n为2,分加1,到60清零
- {
- min++;
- if(min==60)
- min=0;
- break;
- }
- case 3: //如果choose_n为3,时加1,到24清零
- {
- hour++;
- if(hour==24)
- hour=0;
- break;
- }
- default:break;
- }
- }
- }
- }
- }
- }
- }
复制代码
|