📄 总.c
字号:
/////////////////////////////////////////
// 接口 RTC.h
////////////////////////////////////////
#include <reg52.h>
//*******DS12887 *******
#define YEAR_IN_RTC 0
#define MONTH_IN_RTC 1
#define DAY_IN_RTC 2
#define HOUR_IN_RTC 3
#define MINUTE_IN_RTC 4
#define SECOND_IN_RTC 5
#define SECOND_ALARM_IN_RTC 6
#define MINUTE_ALARM_IN_RTC 7
#define HOUR_ALARM_IN_RTC 8
#define RTC_SECONDS XBYTE[0xfe00]
#define RTC_SECONDS_ALARM XBYTE[0xfe01]
#define RTC_MINUTES XBYTE[0xfe02]
#define RTC_MINUTES_ALARM XBYTE[0xfe03]
#define RTC_HOURS XBYTE[0xfe04]
#define RTC_HOURS_ALARM XBYTE[0xfe05]
#define RTC_DAYS XBYTE[0xfe07]
#define RTC_MONTHS XBYTE[0xfe08]
#define RTC_YEARS XBYTE[0xfe09]
#define DSA XBYTE[0xfe0a] //DS12887 register A
#define DSB XBYTE[0xfe0b]
#define DSC XBYTE[0xfe0c]
#define DSD XBYTE[0xfe0d]
sbit RTC_CS=P1^6;
bit Init_RTC(void);
bit Second_Interrupt(void);
unsigned char Read_RTC(unsigned char);
void Write_RTC(unsigned char,unsigned char);
/////////////////////////////////////////
// 实现部分 RTC.C
////////////////////////////////////////
#include <reg52.h>
#include<absacc.h>
#include<RTC.h>
unsigned char Read_RTC(unsigned char option)
{
switch(option)
{
case YEAR_IN_RTC:return(RTC_YEARS);break;
case MONTH_IN_RTC:return(RTC_MONTHS);break;
case DAY_IN_RTC:return(RTC_DAYS);break;
case HOUR_IN_RTC:return(RTC_HOURS);break;
case MINUTE_IN_RTC:return(RTC_MINUTES);break;
case SECOND_IN_RTC:return(RTC_SECONDS);break;
}
}
void Write_RTC(unsigned char option,unsigned char j)
{
switch(option)
{
case YEAR_IN_RTC:RTC_YEARS=j;break;
case MONTH_IN_RTC:RTC_MONTHS=j;break;
case DAY_IN_RTC:RTC_DAYS=j;break;
case HOUR_IN_RTC:RTC_HOURS=j;break;
case MINUTE_IN_RTC:RTC_MINUTES=j;break;
case SECOND_IN_RTC:RTC_SECONDS=j;break;
case SECOND_ALARM_IN_RTC:RTC_SECONDS_ALARM=j;break;
case MINUTE_ALARM_IN_RTC:RTC_MINUTES_ALARM=j;break;
case HOUR_ALARM_IN_RTC:RTC_HOURS_ALARM=j;break;
}
}
bit Second_Interrupt(void)
{
if( (DSC&0x20)==0x20 )return(1);
return(0);
}
/* initialize DS12887 */
bit Init_RTC(void)
{
DSA=0x20;
DSB=0x72; //SET=0,*IE=disenable,SQW=disenable ,BCD,NO DSE
DSC=0x00;
ACC=DSD;
//every second interrupt
Write_RTC(HOUR_ALARM_IN_RTC,0xff);
Write_RTC(MINUTE_ALARM_IN_RTC,0xff);
Write_RTC(SECOND_ALARM_IN_RTC,0xff);
//if(ACC&0x80)return(0); //when low bat return 0
//return(1);
/* DSB=0x82; //set SET=1
RTC_HOURS=0x23;
RTC_MINUTES=0x12;
RTC_SECONDS=0x30;
DSB=0x02;
*/
return(1);
}
//**************** 主函数*********************
void main()
{ Iinit_RTC(void);
setup12887();
read12887();
start12887();//启动DS12887
while(1) //无限循环
{
xianshi();
reset(); //复位
key(); //扫描键盘
conv(); //计时转换
pdt(); //计时中断
}
}
//************conv函数****************/
void conv()
{
if(deta<=50)d_05s=0; //????????///
else d_05s=1;
if(deta>=100){sec++;deta=0;}
if(sec>=60){min++;sec=0;if(ALMstart)ALMmin--;}
if(ALMmin==0){ALMstart=0;rdflag=0;} //??????/
if(min>=60){hou++;min=0;}
if(hou>=24){day++;hou=0;}
switch(mon)
{
case 1:if(day>31){mon++;day=1;}break;
case 2:if(day>28){mon++;day=1;}break;
case 3:if(day>31){mon++;day=1;}break;
case 4:if(day>30){mon++;day=1;}break;
case 5:if(day>31){mon++;day=1;}break;
case 6:if(day>30){mon++;day=1;}break;
case 7:if(day>31){mon++;day=1;}break;
case 8:if(day>31){mon++;day=1;}break;
case 9:if(day>30){mon++;day=1;}break;
case 10:if(day>31){mon++;day=1;}break;
case 11:if(day>30){mon++;day=1;}break;
case 12:if(day>31){mon++;day=1;}break;
default:break;
}
if(mon>12){year++;mon=1;}break;
}
//************** DS12887******************
#define uchar unsigned char
#define uint unsigned int
#include <reg52.h>
#include <stdio.h>
#include <absacc.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#define P128870 XBYTE[0xa000]
#define P128871 XBYTE[0xa001]
#define P128872 XBYTE[0xa002]
#define P128873 XBYTE[0xa003]
#define P128874 XBYTE[0xa004]
#define P128875 XBYTE[0xa005]
#define P128876 XBYTE[0xa006]
#define P128877 XBYTE[0xa007]
#define P128878 XBYTE[0xa008]
#define P128879 XBYTE[0xa009]
#define P12887a XBYTE[0xa00a]
#define P12887b XBYTE[0xa00b]
#define P12887c XBYTE[0xa00c]
#define P12887d XBYTE[0xa00d]
#define P12887e XBYTE[0xa00e]
#define P12887f XBYTE[0xa00f]
void setup12887(uchar *p);
void read12887(uchar *p);
void start12887(void);
void set12887(uchar *p)//设置系统时间
{
uchar i;
i=P12887d;
P12887a=0x70;P12887b=0xa2;P128870=*p++;P128871=0xff;P128872=*p++;
P128873=0xff;P128874=*p++;P128875=0xff;P128876=*p++;P128877=*p++;
P128878=*p++;P128879=*p++;P12887b=0x22;P12887a=0x20;
i=P12887c;
}
void read12887(uchar *p)//读取系统时间
{
uchar a;
do{a=P12887a;}while((a&0x80)==0x80);
*p++=P128870;*p++=P128872;*p++=P128874;*p++=P128876;
*p++=P128877;*p++=P128878;*p++=P128879;
}
void start12887(void)//启动时钟
{
uchar i;
i=P12887d;
P12887a=0x70;P12887b=0xa2;P128871=0xff;P128873=0xff;P128875=0xff;
P12887b=0x22;P12887a=0x20;
i=P12887c;
}
//***************键盘扫描****************
void scankey() //扫描键盘子函数
{ if (MS==10)EX0=1;else EX0=0; // 若模式为0或10,打开外中断0
if(MS<7) // 若模式小于7
{ if(!MSKEY){MS++;deday(300);if(MS==7)MS=0;} //调整模式
if(MS==1){
if(!MONKEY){mon++;if(mon>12)mon=1;delay(300);} //调整月
if(!DAYKEY){day++;if(day>31)mon=1;delay(300);} //调整天
if(!HOUKEY){hou++;if(hou>23)hou=0;delay(300);} //调整时
if(!MMINKEY){min++;if(mon>=60)min=0;delay(300);}//调整分
}
}
if(MS==2){ //调整定时1
if(!HOUKEY){T1hou_st++;if(T1hou_st>23)T1hou_st=0;delay(300);
}
if(!HOUKEY){T1min_st++;if(T1hou_st>23)T1hou_st=0;delay(300);}
if(!CHECKKEY){T1startflag=!T1startflag; delay(300);} //启动T1
}
}
//*************延时Kxlms子函数********************/
void delay(unit k)
{
uint i,j;
for(i=0;i<k;i++){for(i=0;j<60;j++)
{;}reset()}
}
//****************键盘扫描的另一种******************
void key(void) //扫描键盘
{uchar xx;
P1=0xff;
if(P1!=0xff)
{delay(10);
if(P1!=0xff)
{xx=P1;
switch(xx) //根据按键状态,调用不同的函数
{ case 0xfe:set_adj();break;//MS键按下,调用set_adj()子函数
case 0xfd:inc_key();break;//+键按下,调用inc_key()子函数
case 0xfb:dec_key();break; //-键按下,调用dec_key()子函数
case 0xf7:ring_key();break;//ring键按下,调用ring_key()子函数
default:break;
}
}
}
}
//*************设定工作模式子函数**************//
void set_adj(void)//设定工作模式子函数
{ if(cnt==5)
{ set++;
if(set>=4)set=0;
}
}
//********按键+子函数**************//
void inc_key(void) //按键加法子函数
{
if(cnt==5)
{
switch(set)
{case 0:if(P2==0xf7)ON_OFF=!ON_OFF;break;
case 1:min++;if(min>=59)min=59;break;
case 2:hour++;if(hour>=23)hour=23;break
case 3:day++;
switch(mon)
{
case 1:if(day>31){day=31;}break;
case 2:if(day>28){day=28}break;
case 3:if(day>31){day=31}break;
case 4:if(day>30){day=30}break;
case 5:if(day>31){day=31}break;
case 6:if(day>30){day=30}break;
case 7:if(day>31){day=31}break;
case 8:if(day>31){day=31}break;
case 9:if(day>30){day=30}break;
case 10:if(day>31){day=31}break;
case 11:if(day>30){day=30}break;
case 12:if(day>31){day=30}break;
default:break;
}
case 4:mon++;if(mon>=12)mon=12;break;
case 5:year++;break;
default:break;
}
}
}
//**************按键-子函数***********//
void dec_key(void) //按键减法子函数
{
if(cnt==5)
{
switch(set)
{case 0:if(P2==0xf7)ON_OFF=!ON_OFF;break;
case 1:min--;if(min<=0)min=0;break;
case 2:hour--;if(hour<=0)hour=0;break;
case 3:day--; if(day<=0)day=0
case 4:mon--;if(mon<=0)mon=0;break;
case 5:year--;break;
default:break;
}
}
}
//************定时子函数***************//
void ring_key() {
}
//************复位子函数***************//
void reset(void)
{
}
#define time_1 10
sbit DATA2=P2^6;
sbit CLKPIN=P2^7;
unsigned char data l_data[5]; //用户自定义LCD缓冲区
unsigned char dis[4];
unsigned char d[4]={0,0,0,0};
void delay(unsigned int t) // 延时子程序
{ unsigned int i,j;
for(i=0;i<t;i++)
for(j=0;j<114;j++)
;
}
//主函数之前是与显示相关的程序,等待调用
unsigned char led_seg(unsigned char i)
{
unsigned char tem;
switch(i)
{
case 0: tem=0x88;break;
case 1: tem=0xbb;break;
case 2: tem=0xc1;break;
case 3: tem=0x91;break;
case 4: tem=0xb2;break;
case 5: tem=0x94;break;
case 6: tem=0x84;break;
case 7: tem=0xb9;break;
case 8: tem=0x80;break;
case 9: tem=0x90;break;
default:break;
}
return tem;
}
void lcdwbit2(bit n2) //低位
{ DATA2 = n2;
CLKPIN = 1;
CLKPIN = 0;
CLKPIN = 1;
}
void lcdwd2(unsigned char data2) //低位
{ unsigned char i;
//data2=~data2; //数据取反
for(i=0;i<8;i++)
{ if((data2&0x01)==0x01)
lcdwbit2(1);
else
lcdwbit2(0);
data2>>=1;
}
}
void l_setd()
{
unsigned char i;
l_data[1]=0xff;
for(i=2;i<6;i++)
{ l_data[i]=led_seg(dis[i-2]); }
l_data[4]=l_data[4]&0x7f;
}
void lcdwdd() //低位
{ unsigned char i;
for(i=0;i<5;i++)
lcdwd2(l_data[i+1]);
}
void xianshi(unsigned long dd)
{
int j;
for(j=0;j<8;j++)
{ d[j]=dd%10; dd=dd/10; }
//开始显示
while(1)
{
dis[0]=d[3];
dis[1]=d[2];
dis[2]=d[1];
dis[3]=d[0];
l_setd(); lcdwdd(); delay(time_1); //低4位显示
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -