这是我的程序,怎样实现断电继续走?ds1302的时钟芯片,有备用电源。
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit rs=P2^5; //定义1602液晶rs端
- sbit rw=P2^6; //定义1602液晶rw端
- sbit lcden=P2^7; //定义1602液晶lcden端
- sbit s2=P3^2; //定义功能键
- sbit s3=P3^3; //定义增大键
- sbit s4=P3^4; //定义减小键
- uchar count,s1num;
- char miao,shi,fen;
- uchar code table[]=" 2018-1-7MON "; //定义初始上电时液晶默认显示状态
- uchar code table1[]=" 00:00:00 ";
- //Read_BursRam(&Read_Flag,1);
- //if(Read_Flag!= 1)
- //{
- // Write_Data(0x90,0xaa);
- // Write_BurstClock(Cur_Time);
- // Write_BurstRam(&Clock_Flag,1);
- // Write_Data(0x8e,0x80);
- //}
- void delay(uint z) //延时函数
- {
- uint x,y;
- for(x=z;x>0;x--);
- for(y=110;y>0;y--);
- }
- void write_com(uchar com) //液晶写命令函数
- {
- rs=0;
- lcden=0;
- P0=com;
- delay(20);
- lcden=1;
- delay(20);
- lcden=0;
- }
- void write_date(uchar date) //液晶写数据函数
- {
- rs=1;
- lcden=0;
- P0=date;
- delay(20);
- lcden=1;
- delay(20);
- lcden=0;
- }
- void init() //初始化函数
- {
- uchar num;
- lcden=0;
- rw=0;
- write_com(0x38); //初始化1602液晶
- write_com(0x0c);
- write_com(0x06);
- write_com(0x01);
- write_com(0x80); //设置显示初始坐标
- for(num=0;num<15;num++)
- {
- write_date(table[num]);
- delay(20);
- }
- write_com(0x80+0x40);
- for(num=0;num<12;num++)
- {
- write_date(table1[num]);
- delay(20);
- }
- TMOD=0x01; //设置定时器0工作模式1
- TH0=(65536-50000)/256; //定时器装初值
- TL0=(65536-50000)%256;
- EA=1; //开总中断
- ET0=1; //开定时器0中断
- TR0=1; //启动定时器0
- }
- void write_sfm(uchar add,uchar date)
- {
- uchar shi,ge;
- shi=date/10;
- ge=date%10;
- write_com(0x80+0x40+add);
- write_date(0x30+shi);
- write_date(0x30+ge);
- }
- void keyscan() //按键扫描函数
- {
- if(s2==0)
- {
- delay(20);
- if(s2==0) //确认功能键被按下
- {
- s1num++; //功能键按下次数记录
- while(!s2); //确认释放
- if(s1num==1) //第一次被按下时
- {
- TR0=0; //关闭定时器
- write_com(0x80+0x40+10); //功能键作用在秒
- write_com(0x0f); //光标闪烁
- }
- }
- if(s1num==2) //第二次被按下时在分
- {
- write_com(0x80+0x40+7);
- }
- if(s1num==3) //第三次被按下时在时
- {
- write_com(0x80+0x40+4);
- }
- if(s1num==4) //第四次被按下,清零
- {
- s1num=0;
- write_com(0x0c);
- TR0=1; //启动定时器时钟开始走
- }
-
- }
- if(s1num!=0) //当功能键被按下后增大键减小键才可以发挥作用
- {
- if(s3==0)
- {
- delay(20);
- if(s3==0) //增大键被按下
- {
- while(!s2); //按键释放
- if(s1num==1) //若功能键第一次被按下
- {
- miao++; //秒加一
- if(miao==60) //秒满60后清零
- miao=0;
- write_sfm(10,miao); //每调节一次液晶显示一次
- write_com(0x80+0x40+10); //显示位置重新回到调节处
-
-
- }
- if(s1num==2)
- {
- fen++;
- if(fen==60)
- fen=0;
- write_sfm(7,fen);
- write_com(0x80+0x40+7);
- }
- if(s1num==3)
- {
- shi++;
- if(shi==24)
- shi=0;
- write_sfm(4,shi);
- write_com(0x80+0x40+4);
- }
- }
- }
- if(s4==0)
- {
- delay(20);
- if(s4==0)
- {
- while(!s3);
- if(s1num==1)
- {
- miao--; //调整秒减一
- if(miao==-1) //减到负数则重新设置为59
- miao=59;
- write_sfm(10,miao);
- write_com(0x80+0x40+10);
- }
- if(s1num==2)
- {
- fen--;
- if(fen==-1)
- fen=59;
- write_sfm(7,fen);
- write_com(0x80+0x40+7);
- }
- if(s1num==3)
- {
- shi--;
- if(shi==-1)
- shi=23;
- write_sfm(4,shi);
- write_com(0x80+0x40+4);
- }
- }
- }
- }
- }
- void main()
- {
- // Ds1302Init();
- init();
- while(1)
- {
- keyscan();
-
- }
- }
- void timer0() interrupt 1 //定时器0中断服务程序
- {
- TH0=(65536-50000)/256; //再次装定时器初值
- TL0=(65536-50000)%256;
- count++; //中断次数累加
- if(count==18)
- {
- count=0;
- miao++;
- if(miao==60)
- {
- miao=0;
- fen++;
- if(fen==60)
- {
- fen=0;
- shi++;
- if(shi==24)
- {
- shi=0;
- }
- write_sfm(4,shi);
- }
- write_sfm(7,fen);
- }
- write_sfm(10,miao);
-
- }
- }
复制代码
|