|
- #include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
- typedef unsigned int u16;
- typedef unsigned char u8;
- u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00,0x80 };//数码管显示0-9和-的断码
- /*定义全局变量*/
- unsigned int counter; //定义计数数据
- unsigned char mode; //定义模式
- unsigned char second=0,minute=0;hour=12;//定义秒分时的初始值
- unsigned char ADD_bit=0,DEC_bit=0,flag=0;//加标志位和减标志位赋初值
- sbit LSA=P2^2;
- sbit LSB=P2^3;
- sbit LSC=P2^4;
-
- /*定义按键*/
- sbit k1=P3^1; //按键P3^1调节模式变化
- sbit ADD=P3^0; //按键P3^0实现加一
- sbit DEC=P3^2; //按键P3^2实现减一
- sbit k4=P3^3; // 按键P3^3调闹钟 暂时不会
-
- /*******************************************************************************
- * 函 数 名 : delay
- * 函数功能 : 延时函数,i=1时,大约延时10us
- *******************************************************************************/
- void delay(u16 i)
- {
- while(i--);
- }
-
- void Digdisplay()
- {
- LSA=1;LSB=1;LSC=1; //7
- P0=smgduan[hour/10];delay(10);P0=smgduan[11];//间隔一段时间扫描,消隐
- LSA=0;LSB=1;LSC=1; //6
- P0=smgduan[hour%10];delay(10);P0=smgduan[11];
- LSA=0;LSB=0;LSC=1; //4
- P0=smgduan[minute/10];delay(10);P0=smgduan[11];
- LSA=1;LSB=1;LSC=0; //3
- P0=smgduan[minute%10];delay(10);P0=smgduan[11];
- if(counter>0&&counter<49)
- { LSA=1;LSB=1;LSC=0; P0=0x80;delay(10);
-
- }
- else
- {LSA=1;LSB=1;LSC=0; P0=0x80;}
- LSA=1;LSB=0;LSC=0; //1
- P0=smgduan[second/10]+0x80;delay(10);P0=smgduan[11];
- LSA=0;LSB=0;LSC=0; //0
- P0=smgduan[second%10];delay(10);P0=smgduan[11];
- LSA=0;LSB=1;LSC=0; //2
- P0=smgduan[10];delay(1);P0=smgduan[11];
- LSA=1;LSB=0;LSC=1; //5
- P0=smgduan[10];delay(1);P0=smgduan[11];
- }
-
- /*按键扫描*/
- void Buttonscan()
- {
- /*通过标志位来控制模式*/
- if(k1==0) //控制模式键 按下
- {
- flag=1; //确定按键按下
- }
- if((k1)&&(flag))
- {
- flag=0;
- mode++;
- if(mode==4)
- mode=0;
- }
- if(mode==1) //加减秒
- {
- /*加按键*/
- if(ADD==0) //加键按下
- {
- ADD_bit=1;
- }
- if((ADD)&&(ADD_bit))
- {
- ADD_bit=0;
- second++;
- if(second==60)
- second=0;
- }
-
- /*减按键*/
- if(DEC==0)
- {
- DEC_bit=1; //按下按键
- }
- if((DEC)&&(DEC_bit==1))
- {
- DEC_bit=0;
- if(second==0)
- second=59;
- second--;
- }
- }
-
-
-
- if(mode==2) //加减分
- {
- if(ADD==0)
- {
-
- ADD_bit=1;
- }
- if((ADD)&&(ADD_bit))
- {
- ADD_bit=0;
- minute++;
- if(minute==60)
- minute=0;
- }
- if(DEC==0)
- {
- DEC_bit=1;
- }
- if((DEC)&&(DEC_bit==1))
- {
- DEC_bit=0;
- if(minute==0)
- minute=60;
- minute--;
- }
- }
-
-
- if(mode==3) //加减时
- {
- if(ADD==0)
- {
- ADD_bit=1;
- }
- if((ADD)&&(ADD_bit))
- {
- ADD_bit=0;
- hour++;
- if(hour==24)
- hour=0;
- }
- if(DEC==0)
- {
- DEC_bit=1;
- }
- if((DEC)&&(DEC_bit==1))
- {
- DEC_bit=0;
- if(hour==0)
- hour=24;
- hour--;
- }
- }
- }
-
- /*初始化*/
- void time0Init()
- {
- TMOD=0x01; //设置定时器模式一
- TH0=0xd8;//高八位赋初值
- TL0=0xf0;//低八位赋初值
- TR0=1;//启动定时器0计数
- ET0=1;//使能定时器中断
- EA=1;//使能总中断
- }
- /*主函数*/
- void main()
- {
- time0Init(); //初始化函数
-
- while(1)
- {
-
- Digdisplay(); //显示函数
- Buttonscan(); //按键
-
- }
- }
- /*中断*/
- void time0() interrupt 1
- {
- TH0=0xd8;//高八位赋初值
- TL0=0xf0;//低八位赋初值
- counter++;
- if(counter==100)
- {
- counter=0;
- second++;//秒加1
- if(second==60)
- {
- second=0;
- minute++;//分加1
- if(minute==60)
- {
- minute=0;
- hour++;//时加1
- if(hour==24)
- hour=0;
- }
- }
- }
- }
复制代码 |
|