|
- #include<reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- //数码管位端口定义
- sbit w1=P2^0;
- sbit w2=P2^1;
- sbit w3=P2^2;
- sbit w4=P2^3;
- sbit w5=P2^4;
- ////////按键/////////////////////
- sbit key1=P3^0;//设置时间
- sbit key2=P3^1;//加
- sbit key3=P3^2;//减
- sbit key4=P3^3;//闹钟
- sbit beep=P1^0;//蜂鸣器
- /////共阴数码管段信号编码////////
- uchar code table[10]=//0---9
- {0xFC,0x60,0xDA,0xF2,0x66,
- 0xB6,0xBE,0xE0,0xFE,0xF6};//
- uchar num,miao,fen,shi;//计时 时分秒变量
- uchar fen1,shi1;//闹钟变量
- uchar d1,d2,d3,d4;//显示拆分数据
- void delay(uint ms)//1ms 延时函数 数据保持用的
- {
- uchar x;
- for(ms;ms>0;ms--)
- for(x=110;x>0;x--);
- }
- void display()//显示函数
- {
- d1=shi/10;//小时
- d2=shi%10;//
- d3=fen/10;//
- d4=fen%10;//分钟
- w1=0;P0=table[d1];delay(10);//第1位显示数据
- P0=0x00;w1=1;//关闭显示消除动态扫描阴影
- w2=0;P0=table[d2]|0x01;delay(10);//第2位显示数据
- P0=0x00;w2=1;//关闭显示消除动态扫描阴影
- w3=0;P0=table[d3];delay(10);//第3位显示数据
- P0=0x00;w3=1;//关闭显示消除动态扫描阴影
- w4=0;P0=table[d4]|0x01;delay(10);//第4位显示数据
- P0=0x00;w4=1;//关闭显示消除动态扫描阴影
- }
- void disp_set()//显示函数
- {
- d1=shi1/10;//小时
- d2=shi1%10;//
- d3=fen1/10;//
- d4=fen1%10;//分钟
- w1=0;P0=table[d1];delay(10);//第1位显示数据
- P0=0x00;w1=1;//关闭显示消除动态扫描阴影
- w2=0;P0=table[d2]|0x01;delay(10);//第2位显示数据
- P0=0x00;w2=1;//关闭显示消除动态扫描阴影
- w3=0;P0=table[d3];delay(10);//第3位显示数据
- P0=0x00;w3=1;//关闭显示消除动态扫描阴影
- w4=0;P0=table[d4]|0x01;delay(10);//第4位显示数据
- P0=0x00;w4=1;//关闭显示消除动态扫描阴影
- }
- void keyscan()//调时按键扫描函数
- {
- uchar k_flag,set_flag;
- if(key1==0)//按键按下 一下所有按键执行的模式都是一样的
- {
- delay(10);//延时消除按键抖动
- if(key1==0)//确定按键按下
- {
- k_flag=1;
- }
- while(key1==0)display();//等待按键松手
- }
- while(k_flag==1)//开始调整小时数据
- {
- display();
- if(key1==0)
- {
- delay(10);//延时消抖
- if(key1==0)
- {
- k_flag=2;
- }
- while(key1==0)display();
- }
- if(key2==0)
- {
- delay(10);
- if(key2==0)
- {
- shi++;
- if(shi==24)shi=0;
- }
- while(key2==0)display();
- }
- if(key3==0)
- {
- delay(10);
- if(key3==0)
- {
- if(shi==0)shi=24;
- shi--;
- }
- while(key3==0)display();
- }
- }
- while(k_flag==2)//开始调整分钟数据
- {
- display();
- if(key1==0)
- {
- delay(10);//延时消抖
- if(key1==0)
- {
- k_flag=3;
- }
- while(key1==0)display();
- }
- if(key2==0)
- {
- delay(10);
- if(key2==0)
- {
- fen++;
- if(fen==60)fen=0;
- }
- while(key2==0)display();
- }
- if(key3==0)
- {
- delay(10);
- if(key3==0)
- {
- if(fen==0)fen=60;
- fen--;
- }
- while(key3==0)display();
- }
- }
- ///////设置定时时间///////////////////////////////////////////////
- if(key4==0)
- {
- delay(10);
- if(key4==0)
- {
- set_flag=1;
- }
- while(key4==0)disp_set();
- }
- while(set_flag==1)
- {
- disp_set();
- if(key2==0)
- {
- delay(10);
- if(key2==0)
- {
- shi1++;
- if(shi1==24)shi1=0;
- }
- while(key2==0)disp_set();
- }
- if(key3==0)
- {
- delay(10);
- if(key3==0)
- {
- if(shi1==0)shi1=24;
- shi1--;
- }
- while(key3==0)disp_set();
- }
- if(key4==0)
- {
- delay(10);
- if(key4==0)
- {
- set_flag=2;
- }
- while(key4==0)disp_set();
- }
- }
- while(set_flag==2)
- {
- disp_set();
- if(key2==0)
- {
- delay(10);
- if(key2==0)
- {
- fen1++;
- if(fen1==60)fen1=0;
- }
- while(key2==0)disp_set();
- }
- if(key3==0)
- {
- delay(10);
- if(key3==0)
- {
- if(fen1==0)fen1=60;
- fen1--;
- }
- while(key3==0)disp_set();
- }
- if(key4==0)
- {
- delay(10);
- if(key4==0)
- {
- set_flag=0;
- }
- while(key4==0)disp_set();
- }
- }
- }
- void main()
- {
- TMOD=0x01;//定时器0 16位计时模式
- TH0=(65536-50000)/256; //50ms定时
- TL0=(65536-50000)%256; //50ms定时
- EA=1;//开启总中断
- ET0=1;//开启定时器中断
- TR0=1;//开启定时器
- w5=1;
- while(1)
- {
- w5=~w5;
- display();//显示函数
- keyscan();//按键扫描函数
- }
- }
- void T0_time() interrupt 1
- {
- TH0=(65536-50000)/256; //50ms定时
- TL0=(65536-50000)%256; //50ms定时
- num++;//加一次50ms定时
- if(num==20)//1S
- {
- num=0;
- miao++;
- if(miao==60)
- {
- miao=0;
- fen++;
- if(fen==60)
- {
- fen=0;
- shi++;
- if(shi==24)shi=0;
- }
- }
- }
- }
复制代码 |
|