?? 51.c
字號:
#include <reg52.h> /*頭文件的包含*/
#include "IIC.h"
#include "display.h"
#include "define.h"
#define PCF8583 0xa0 /*10100000--A0 write*/
#define PCF8583_Ctr 0x00/*control register*/
#define Sen 0x02
#define Min 0x03
#define Hour 0x04
char sen,min,hour; /*需要用到-1,不用uchar*/
uchar flag; /*進入設置時鐘標志*/
uchar wflag; /*故障標志 0-正常*/
uchar id; /*故障發生點 1-8*/
uchar point; /*記錄EEPROM的當前頁的目前的地址*/
uchar recvflag; /*接收到串口信息標志*/
uchar EEP;
/*s1為進入和退出設置鍵,s2為+鍵,s3為-鍵,s4為循環鍵*/
sbit s1=P3^2;
sbit s2=P3^3;
sbit s3=P3^4;
sbit s4=P3^5;
sbit s5=P1^0;
sbit s6=P1^1;
sbit s7=P1^2;
sbit s8=P1^3;
sbit s9=P1^4;
sbit s10=P1^5;
sbit s11=P1^5;
sbit s12=P1^6;
/*
對時間進行設置
*/
void keyscan()
{
uchar roll=0; /*roll=0表示設置秒;roll=1表示設置分;roll=2表示設置時*/
//rd=0;
if(s1==0)
{
delay_ms(5); /*消抖*/
if(s1==0) /*確定鍵已經按下*/
{
flag=!flag; /* 1 標志進入時間設置狀態*/
while(!s1); /*等待按鍵松開*/
if(1==flag)
{
roll=0;
light(roll); /*顯示在秒設置處*/
}
else if(0==flag) /*退出時間設置狀態*/
{
ISendByte(PCF8583,Sen,sen);
ISendByte(PCF8583,Min,min);
ISendByte(PCF8583,Hour,hour); /*寫入新的時間到8583*/
light(4); /*全熄滅*/
}
}
}
if(flag==1) /*在設置狀態下*/
{
if(s4==0) /*進入選擇設置位,選擇要設置的單位*/
{
delay_ms(5); /*消抖*/
if(s4==0) /*確定鍵已經按下*/
{
while(!s4); /*等待按鍵松開*/
roll++;
if(roll==3) roll=0; /*循環*/
light(roll);
}
}
if(s2==0) /*進入+狀態*/
{
delay_ms(5); /*消抖*/
if(s2==0) /*確定鍵已經按下*/
{
while(!s2); /*等待按鍵松開*/
if(roll==0) /*設置秒*/
{
sen++;
if(sen==60) sen=0;
}
if(roll==1) /*設置分*/
{
min++;
if(min==60) min=0;
}
if(roll==2) /*設置時*/
{
hour++;
if(hour==24) hour=0;
}
}
}
if(s3==0) /*進入-狀態*/
{
delay_ms(5); /*消抖*/
if(s3==0) /*確定鍵已經按下*/
{
while(!s3); /*等待按鍵松開*/
if(roll==0) /*設置秒*/
{
sen--;
if(sen==-1) sen=59;
}
if(roll==1) /*設置分*/
{
min--;
if(min==-1) min=59;
}
if(roll==2) /*設置時*/
{
hour--;
if(hour==-1) hour=23;
}
}
}
}
}
/*
將發生故障的時間、故障點、修復的時間寫入EEPROM,記錄100個故障
鍵按下代表發生故障,記錄發生故障的時間; 寫入順序 id->sen->min->hour
鍵松開代表修復故障,記錄修復故障的時間。
*/
void save()
{
/*為了避免代碼重復,這里只給了S5發生故障的代碼,s6,s7,s8,s9,s10,s11,s12類似*/
/*10101 A1 A0 0 確定頁地址
00000 0 0 0 - 0頁 0
00000 0 1 0 - 1頁 2
00000 1 0 0 - 2頁 4
00000 1 1 0 - 3頁 6
*/
EEP=0xa8; /*10101000--A8 write A2,A1是頁*/
if(s5==0) /*故障*/
{
delay_ms(5); /*消抖*/
if(s5==0) /*確定鍵已經按下 開始寫入故障的時間*/
{
wflag=1; //故障標志置位
id=1;
ISendByte(EEP,point,id);
point++;
if(0xFF==point-1)
{
point=0x00; /*頁內指針復位*/
EEP=EEP+2 ; /*加一頁*/
}
ISendByte(EEP,point,sen);
if(0xFF==point-1)
{
point=0x00; /*頁內指針復位*/
EEP=EEP+2 ; /*加一頁*/
}
ISendByte(EEP,point,min);
if(0xFF==point-1)
{
point=0x00; /*頁內指針復位*/
EEP=EEP+2 ; /*加一頁*/
}
ISendByte(EEP,point,hour);
if(0xFF==point-1)
{
point=0x00; /*頁內指針復位*/
EEP=EEP+2 ; /*加一頁*/
}
while(!s5); /*等待按鍵松開 開始寫入回復故障的時間*/
wflag=0; //故障清除
id=1;
ISendByte(EEP,point,id);
point++;
if(0xFF==point-1)
{
point=0x00; /*頁內指針復位*/
EEP=EEP+2 ; /*加一頁*/
}
ISendByte(EEP,point,sen);
if(0xFF==point-1)
{
point=0x00; /*頁內指針復位*/
EEP=EEP+2 ; /*加一頁*/
}
ISendByte(EEP,point,min);
if(0xFF==point-1)
{
point=0x00; /*頁內指針復位*/
EEP=EEP+2 ; /*加一頁*/
}
ISendByte(EEP,point,hour);
if(0xFF==point-1)
{
point=0x00; /*頁內指針復位*/
EEP=EEP+2 ; /*加一頁*/
}
}
}
}
void serial()
{
if(recvflag==1)
{
ES=0; //關串行中斷
recvflag=0;
if(wflag==1)
{
SBUF=id;
while(!TI); //確定發送完畢
TI=0;
}
else if(wflag==0)
{
SBUF='o';
while(!TI); //確定發送完畢
TI=0;
SBUF='k';
while(!TI); //確定發送完畢
TI=0;
}
ES=1;
}
}
void main()
{
ISendByte(PCF8583,PCF8583_Ctr,0x00); /*reset*/
/*************************************************************************
NOTE: 向分0x03,向秒0x02寫入0 ,向hour0x04寫入0x00;
*************************************************************************/
ISendByte(PCF8583,Sen,0x00);
ISendByte(PCF8583,Min,0x00);
ISendByte(PCF8583,Hour,0x00); /*寫入00 00000000 bit7,bit6=0->24小時制*/
/*設置定時器0,50ms中斷,用于LED的動態顯示*/
TMOD=0x01;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
EA=1;
ET0=1;
TR0=1;
/*串口中斷設置*/
TMOD=0x20;//設置定時器1為工作方式2
TH1=0xfd;
TL1=0xfd; //9600bps
TR1=1;
REN=1;
SM0=0;
SM1=1;
EA=1;
ES=1; //開串口中斷
while(1)
{
keyscan();
save();
serial();
if(0==flag)
{
sen=IRcvByte(PCF8583,Sen);
min=IRcvByte(PCF8583,Min);
hour=IRcvByte(PCF8583,Hour);
}
}
}
void timer0() interrupt 1
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
display(1,2,hour);
display_(3);
display(4,5,min);
display_(6);
display(7,8,sen);
}
void ser() interrupt 4
{
uchar a;
RI=0; //RI清零
a=SBUF;
if(a==0xaa) recvflag=1;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -