数码管显示时钟,用矩阵键盘来设置时间,断电时的时间会存储在EEPROM中,来电时恢复断电时刻的时间
单片机源程序如下:
- /*实验效果每加一秒钟显示会跳动,并在8位数码管上以时间的形式显示*/
- /*使用矩阵键盘的S1、S2、S3按键分别对秒、分、时进行设置加1操作。*/
- /*设备断电时EEPROM记忆断电时刻的时间,重新上电时设备显示断电时刻的时间开始走时*/
- /********注意事项:往EEPROM 24c2写入数据时与下一次写数据时适当延时2ms左右*****/
- /****************不然写入数据的速度跟不上程序执行时间以至于数据写不进24c02中**/
- #include<reg51.h>
- #include"init.h"
- #include"key.h"
- #include"i2c.h"
- #include"delay.h"
- //sbit K1=P3^0;
- //sbit K2=P3^1;
- unsigned char code DIG_CODE[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- unsigned char disp[8]={0x3f,0x3f,0x40,0x3f,0x3f,0x40,0x3f,0x3f};
- unsigned char hour=12,minit=0,second=0, Time=0;
- bit write=0,KeyState;
- main()
- {
- unsigned char keyvalue;
- hour=At24c02Read(0x02); //读出24c02地址0保存的数据赋于小时中
- minit=At24c02Read(0x01); //读出24c02地址1保存的数据赋于分中
- second=At24c02Read(0x00); //读出24c02地址2保存的数据赋于秒中
- Timer1configuration();
- Timer0configuration();
-
- Int0Configuration();
-
- while(1)
- {
- keyvalue=readkey();
- if(TR0==0)
- {
- if(KeyState==1) //按键状态为1时代表有按键按下
- {
- if(keyvalue==1) // 按键1按下时
- {
-
- second++; //秒加1
- write=1; //向24c02写数据允许
- if(second==60)
- second=0;
- }
- else if(keyvalue==2)// 按键2按下时
- {
- minit++; // 分加1
- write=1;//向24c02写数据允许
- if(minit==60)
- minit=0;
- }
-
- if(keyvalue==3) // 按键3按下时
- {
- hour++; // 小时加1
- write=1;//向24c02写数据允许
- if(hour==24)
- hour=0;
- }
- KeyState=0; //清除按键按下状态标志
- }
-
- }
- disp[7]=DIG_CODE[hour/10];
- disp[6]=DIG_CODE[hour%10];
- disp[4]=DIG_CODE[minit/10];
- disp[3]=DIG_CODE[minit%10];
- disp[1]=DIG_CODE[second/10];
- disp[0]=DIG_CODE[second%10];
- if(write==1) //当write为1时向24c02写入数据
- {
- write=0;//清除写保护标记
- At24c02Write(0x02,hour); //在24c02的地址0中写入数据"小时"
- Delay1ms(2);/*作适当的延时,程序运行太快以至于数据还没有写入24c02就开始执行下一条语句*/
- At24c02Write(0x01,minit); //在24c02的地址1中写入数据"分"
- Delay1ms(2);/*作适当的延时,程序运行太快以至于数据还没有写入24c02就开始执行下一条语句*/
- At24c02Write(0x00,second); //在24c02的地址2中写入数据"秒"
-
- }
-
- }
- }
复制代码
所有资料51hei提供下载:
时钟断电记忆 矩阵键盘设置时间.zip
(57.47 KB, 下载次数: 72)
|