📄 rtu.c
字号:
#include <reg52.h>
#include <intrins.h>
#include <absacc.h>
#include "VI2C_C51.h"
#include "stdio.h"
unsigned char rd[5]; //定义接收缓冲区
unsigned char td[5]={0x00,0x12,0x00,0x00,0x00}; //定义初始化字 :控制寄存器1 控制寄存器2
//秒,分,时,日,星期,月/世纪,年
const unsigned char dis[10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};//显示码
#define PCF8563 0xA2 //定义器件地址
#define WRADDR 0x00 //定义写单元首地址
#define RDADDR 0x02 //定义读单元首地址
unsigned char key; /*键盘值*/
bit keyint=0; /*按键中断标志*/
bit kk=0;
bit keychange=0; /*数据修改标志*/
bit found=0;
sbit alarm=P3^5;
unsigned char bufdata;
unsigned char k;
unsigned char DelayNS(unsigned char no)
{
unsigned char i,j; //延时参数
for(; no>0; no--)
{
for(i=0; i<100; i++)
for(j=0; j<100; j++);
}
return 0;
}
void delay(unsigned char e)
{
unsigned char g;
for(e; e > 0; e--)
{
for(g =200; g > 0; g--);
}
}
void key_int0() interrupt 0 /*时间设定启动*/
{
keychange=1;
found=1;
}
void key_int1() interrupt 2 /*报警设定启动*/
{
keychange=1;
found=0;
}
void time_setup()
{
unsigned char i,j,k,b;
char num=3; /*移位键移到哪个LED*/
/* if(!found)
{ */
i=1;j=2;k=0x01;b=0x02;
/* }
else {
i=8;j=9;k=0x09;b=0x02;
}*/
k=(rd[i]&0x0F);
P0=~(0x01<<num);
P1=~(dis[k]);
while(keychange)
{
if(P2==0xEE) //移位键
delay(100);
if(P2==0xEE) //移位键
{
while(P2==0xEE);
num--;
if(num<0)
{
num=3;
}
switch(num)
{
case 0:k=(rd[j]&0x30);
k=k>>4;
P0=0xfe;
P1=~(dis[k]);
break;
case 1: k=(rd[j]&0x0F);
P0=0xfD;
P1=~(dis[k]);
break;
case 2:
k=(rd[i]&0x70);
k=k>>4;
P0=0xfB;
P1=~(dis[k]);
break;
case 3: k=(rd[i]&0x0F);
P0=0xf7;
P1=~(dis[k]);
break;
default :break;
}
}
else if(P2==0xED) //+
delay(100);
if(P2==0xED)
{
while(P2==0xED);
if(num==3) //在分的个位
{
if((rd[i]&0x0f)==0x09)
rd[i]=0x00;
else ++rd[i];
k=(rd[i]&0x0F);
P0=~(0x01<<num);
P1=~(dis[k]);
}
if(num==2) //在分的十位
{
if((rd[i]&0xf0)==0x50)
rd[i]=0x00;
else rd[i]+=0x10;
k=(rd[i]&0x70);
k=k>>4;
P0=~(0x01<<num);
P1=~(dis[k]);
}
if(num==1) //在小时的个位
{
if((rd[j]&0xf0)==0x20) //判断十位是否为二
{
if((rd[j]&0x0f)==0x03) //是,则判断个位是否为3
rd[j]&=0xf0; //是,则个位置0
else ++rd[j]; //否则加1
}
else //不位二
{
if((rd[j]&0x0f)==0x09) rd[j]&=0xf0;
else ++rd[j];
}
k=(rd[j]&0x0f);
P0=~(0x01<<num);
P1=~(dis[k]);
}
if(num==0) //在小时的十位
{
if((rd[j]&0x0f)>=0x04)
{
if((rd[j]&0xf0)==0x10) rd[j]&=0x0f;
else rd[j]+=0x10;
}
else if((rd[j]&0xf0)==0x20) rd[j]&=0x0f;
else rd[j]+=0x10;
k=(rd[j]&0x30);
k=k>>4;
P0=~(0x01);
P1=~(dis[k]);
}
}
else if(P2==0xEB) //-
delay(100);
if(P2==0xEB)
{
while(P2==0xEB);
if(num==3) //在分的个位
{
if((rd[i]&0x0f)==0x00)
rd[i]|=0x09;
else --rd[i];
k=(rd[i]&0x0F);
P0=~(0x01<<num);
P1=~(dis[k]);
}
if(num==2) //在分的十位
{
if((rd[i]&0xf0)==0x00)
rd[i]|=0x50;
else rd[i]-=0x10;
k=(rd[i]&0x70);
k=k>>4;
P0=~(0x01<<num);
P1=~(dis[k]);
}
if(num==1) //在小时的个位
{
if((rd[j]&0x0f)==0x00)
{
if((rd[j]&0xf0)==0x20)
rd[j]|=0x03;
else rd[j]|=0x09;
}
else --rd[j];
k=(rd[j]&0x0f);
P0=~(0x01<<num);
P1=~(dis[k]);
}
if(num==0) //在小时的个位
{
if((rd[j]&0xf0)==0x00)
{
if(((rd[j]&0x0f)==0x00)||((rd[j]&0x0f)==0x01)||((rd[j]&0x0f)==0x02)||((rd[j]&0x0f)==0x03))
rd[j]|=0x20;
else rd[j]|=0x10;
}
else rd[j]-=0x10;
k=(rd[j]&0x30);
k=k>>4;
P0=~(0x01);
P1=~(dis[k]);
}
}
else if(P2==0xE7)
delay(100);
if(P2==0xE7)
{
while(P2==0xE7);
keychange=0;
rd[1]=0x12;
ISendStr(PCF8563,k,rd,b);
}
}
}
void main()
{
bit i=0;
unsigned char j=0;
EA=1;IT0=1;EX0=1;
IT1=1;EX1=1;
P2=0xEF;
found=0;
ISendStr(PCF8563,WRADDR,td,0x2); //初始化PCF8563,如果需要的话可以不去掉
if(P2==0xEB)
ISendStr(PCF8563,WRADDR,td,0x5); //初始化PCF8563,如果需要的话可以不去掉
for(;;)
{
if(keychange)
time_setup();
IRcvStr(PCF8563,RDADDR,rd,0x3); //读现在的时、分、秒
/* bufdata=(rd[0]&0x08);
if(bufdata==0x08){
alarm=0;
j++;
if(j==100){
alarm=1;
ISendStr(PCF8563,WRADDR,td,0x2); //
}
}*/
bufdata=rd[0]&0x7F;
P0=~(0x01<<5);
P1=~(dis[bufdata&0x0F]);
delay(4);
P0=0xff;
delay(2);
bufdata=bufdata>>4;
P0=~(0x01<<4);
P1=~(dis[bufdata]);
delay(4);
P0=0xff;
delay(2);
bufdata=rd[1]&0x7F;
P0=~(0x01<<3);
P1=~(dis[bufdata&0x0F]);
delay(4);
P0=0xff;
delay(2);
bufdata=bufdata>>4;
P0=~(0x01<<2);
P1=~(dis[bufdata]);
delay(4);
P0=0xff;
delay(2);
bufdata=rd[2]&0x3F;
P0=~(0x01<<1);
P1=~(dis[bufdata&0x0F]);
delay(4);
P0=0xff;
delay(2);
bufdata=bufdata>>4;
P0=~(0x01<<0);
P1=~(dis[bufdata]);
delay(4);
P0=0xFF;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -