?? contorl.c
字號:
// RTC modle DS12887 driver and controller
// 7 segments LED 88888888 displayer
// Year, month, day, hour, minute and second display
// Functions display and keyboard
#include <aduc812.h>
#include <intrins.h>
#define uchar unsigned char
#define DSAD P2
#define LOCKRTC writeDS(0x0B,0x82)
#define FREERTC writeDS(0x0B,0x02)
//const address, second
#define ca_sec 0x00
//const address, alarm second
#define ca_seca 0x01
//const address, minute
#define ca_min 0x02
//const address, alarm minute
#define ca_mina 0x03
//const address, hour
#define ca_hor 0x04
//const address, alarm hour
#define ca_hora 0x05
//const address, day
#define ca_day 0x07
//const address, month
#define ca_mon 0x08
//const address, year
#define ca_yer 0x09
//const address, alarm switch, 0-off, 1-on
#define ca_alrsw 0x10
//const address, alarm end of minute
#define ca_minae 0x11
//const address, alarm end of hour
#define ca_horae 0x12
//const address, alarm start of minute
#define ca_minas 0x13
//const address, alarm start of hour
#define ca_horas 0x14
//const char, display code of '-'
#define cc_cancel 0x0a
//const char, display nothing
#define cc_null 0x0f
//temp def
sbit DSALE=P3^5;
sbit DSnWR=P3^6;
sbit DSnRD=P3^7;
sbit SDA = P3^4;
sbit SCK = P3^2;
sbit SCS = P3^3;
sbit KUP = P0^7;
sbit KDN = P0^6;
sbit KMO = P0^5;
sbit BEE = P0^4;
sbit SWT = P0^3;
//bit RTCSET;
//uchar ldat; // to set the RTC date and time by comm
uchar func; // functions
uchar dispday; // display date or time
//bit alarm;
void writeDS(uchar addr,uchar val)
{
DSAD=addr;
DSALE=1;
_nop_();_nop_();
DSALE=0;
DSAD=val;
DSnWR=0;
_nop_();_nop_();
DSnWR=1;
}
void DSRAMWrite(uchar addr,uchar val)
{
LOCKRTC;
writeDS(addr,val);
FREERTC;
}
uchar DSRAMRead(uchar addr)
{ uchar i;
LOCKRTC;
DSAD=addr;
DSALE=1;
_nop_();
DSALE=0;
DSAD=0xff;
DSnRD=0;
_nop_();_nop_();
i=DSAD;
DSnRD=1;
FREERTC;
return i;
}
void send(uchar sc)
{
SBUF=sc;
while(TI==0);
TI=0;
}
void serial () interrupt 4
{ uchar rcvd;
if(RI){
RI = 0;
rcvd=SBUF;
/*
if (ldat==0xe5) DSRAMWrite(0x10,rcvd);// set the second
if (ldat==0xe4) DSRAMWrite(0x11,rcvd);// set the minute
if (ldat==0xe3) DSRAMWrite(0x12,rcvd);// set the hour
if (ldat==0xe2) DSRAMWrite(0x13,rcvd);// set the day
if (ldat==0xe1) DSRAMWrite(0x14,rcvd);// set the month (nEOSC nE32K month5-0)
if (ldat==0xe0) DSRAMWrite(0x15,rcvd);// set xx year
if (rcvd==0xef){
uchar sc,mi,hr,da,mo,yr;
sc=DSRAMRead(0x10);mi=DSRAMRead(0x11);hr=DSRAMRead(0x12);
da=DSRAMRead(0x13);mo=DSRAMRead(0x14);yr=DSRAMRead(0x15);
send(0xef);send(hr);send(mi);send(sc);
DSRAMWrite(0x0A,0x20); //rtc initialtive
DSRAMWrite(0,sc);DSRAMWrite(2,mi);DSRAMWrite(4,hr);
DSRAMWrite(7,da);DSRAMWrite(8,mo);DSRAMWrite(9,yr);
}
ldat=rcvd;
*/
}
}
void sendled(uchar sch,uchar scl) //自定義字模
{uchar i;
SCS=0;
for (i=128;i!=0;i/=2){
SDA=(sch & i);
SCK=1;
_nop_();
SCK=0;
}
for (i=128;i!=0;i/=2){
SDA=(scl & i);
SCK=1;
_nop_();
SCK=0;
}
SCS=1;
}
bit proc0(uchar addr,uchar minv,uchar maxv)
{uchar mi;bit chg=0;
mi=DSRAMRead(addr);
if (KUP==0) {chg=1;mi++;if (mi>maxv) mi=minv;if ((mi%16)>9) mi+=6;}
if (KDN==0) {chg=1;mi--;if (mi<minv || mi>maxv) mi=maxv;if ((mi%16)>9) mi-=6;}
DSRAMWrite(0x0A,0x20);
DSRAMWrite(addr,mi);
return chg;
}
void rtcmcpy(uchar fromadd,uchar toadd)
{uchar mi;
mi=DSRAMRead(fromadd);
DSRAMWrite(0x0A,0x20);
DSRAMWrite(toadd,mi);
}
bit delay()
{uchar a,b;
uchar kb,kc;
bit update=0;
P0|=0xe0; kb=P0;kb|= 0x1f; // Keyboard port
for (b=180;b!=0;b--) //delay
for (a=180;a!=0;a--);
P0|=0xe0; kc=P0;kc|= 0x1f;
if (kc==kb && kb!=0xff){
update=1;
if (func==6 && (KUP==0 || KDN==0)) {
DSRAMWrite(0x0A,0x20);
DSRAMWrite(ca_sec,0);
}
if (func==11) {proc0(ca_minae,0,0x59);} //alarm end minute
if (func==10) {proc0(ca_horae,0,0x23);} //alarm end hour
if (func==9) {proc0(ca_minas,0,0x59);} //alarm start minute
if (func==8) {proc0(ca_horas,0,0x23);} //alarm start hour
if (func==7)
{bit chg;
chg=proc0(ca_alrsw,0,0x01);
if (chg==1){
rtcmcpy(ca_horas,ca_hora);
rtcmcpy(ca_minas,ca_mina);
}
} //alarm on/off
if (func==5) proc0(ca_min,0,0x59); // minute set
if (func==4) proc0(ca_hor,0,0x23); // hour set
if (func==3) proc0(ca_day,1,0x31); // day set
if (func==2) proc0(ca_mon,1,0x12); // month set
if (func==1) proc0(ca_yer,0,0x99); // year set
}
if (kc!=kb && kc==0xff)
{ update=1;
if ((kb | 0xdf)==0xdf){uchar alr;
func++;
if (func>11) func=0;
alr=DSRAMRead(ca_alrsw);
if (alr==0 && func>7) func=0;
dispday=3;
if (func<10) dispday=2;
if (func<7) dispday=0;
if (func<4) dispday=1;
if (func==0) dispday=0;
} else{
if (func==0) dispday++;
}
if (dispday>3) dispday=0; // normal display functions
}
if (update==1) {BEE=1;return 1;} else {BEE=0;return 0;}
}
void ledinit()
{
sendled(0x09,0xff); //ff全譯碼 00 不譯碼 0f 前四位
sendled(0x0a,4); //亮度(0-15)
sendled(0x0b,7); //顯示位數(0-7)
sendled(0x0c,1); //顯示開關 1開 0關
}
void dispnull(uchar pos)
{
sendled(pos,cc_null);
sendled(pos+1,cc_null);
}
void dispnum(uchar pos,uchar num,bit dot)
{
sendled(pos,(num/16));
sendled(pos+1,128*(uchar)(dot)+(num & 0x0f));
}
void main()
{
uchar t;bit b;
uchar alr;
// com init
SCON = 0x50; //SCON: serail mode 1, 8-bit UART, enable ucvr
TMOD |= 0x20; //TMOD: timer 1, mode 2, 8-bit reload
PCON |= 0x80; //SMOD=1;
TH1 = 0xF3; //F-Baudrate:4806 fosc=12MHz
IE = 0x90; //Enable Serial
TR1 = 1; // timer 1 run
BEE =0;
SWT =0;
ledinit();// led init
DSRAMWrite(0x0A,0x20); //rtc initialtive
sendled(0x0f,1); // led test
delay();delay();
sendled(0x0f,0); // led test
while(1){
ledinit();
alr=DSRAMRead(ca_alrsw); //Read the alarm enable byte
if (dispday<2)
{sendled(1,func);
sendled(2,0x0f);
if (dispday==0) //-------------hour minute and second display
{
t=DSRAMRead(0x00);//send(t);// Read the second
if (func==6 && b==0){dispnull(7);} else {dispnum(7,t,0);}
t=DSRAMRead(0x02);//send(t);// Read the minute
if (func==5 && b==0){dispnull(5);} else {dispnum(5,t,b);}
t=DSRAMRead(0x04);//send(t);// Read the hour
if (func==4 && b==0){dispnull(3);} else {dispnum(3,t,b);}
}
if (dispday==1){ // --------------year month day display
t=DSRAMRead(ca_day);//send(t);// Read the day
if (func==3 && b==0){dispnull(7);} else {dispnum(7,t,0);}
t=DSRAMRead(ca_mon);//send(t);// Read the month (nEOSC nE32K month5-0)
if (func==2 && b==0){dispnull(5);} else {dispnum(5,t,1);}
t=DSRAMRead(ca_yer);//send(t);//
if (func==1 && b==0){dispnull(3);} else {dispnum(3,t,1);}
}
}
else { //--------alarm display display>=2
if (alr==1) sendled(1,0x0d); else sendled(1,0x0a);// alarm signal
dispnull(3);
if (dispday==2){// display the alarm start clock
if (func!=7) sendled(2,0x00);
t=DSRAMRead(ca_horas);// Read the alarm start hour
if (func==8 && b==0){dispnull(5);} else {dispnum(5,t,1);}
t=DSRAMRead(ca_minas);// Read the alarm start minute
if (func==9 && b==0){dispnull(7);} else {dispnum(7,t,0);}
}// -- endif display=2
if (dispday==3){// display the alarm end clock
sendled(2,0x01);
t=DSRAMRead(ca_horae);// Read the alarm start hour
if (func==10 && b==0){dispnull(5);} else {dispnum(5,t,1);}
t=DSRAMRead(ca_minae);// Read the alarm start minute
if (func==11 && b==0){dispnull(7);} else {dispnum(7,t,0);}
}// -- endif display=3
if (func==7){ // func7 Set or Cancel the alarm
sendled(2,cc_cancel);
if (alr==0){ // Cancel, display ----
sendled(5,cc_cancel); sendled(6,cc_cancel);
sendled(7,cc_cancel); sendled(8,cc_cancel);}
else{ // Set, display the alarm time
t=DSRAMRead(ca_horas);// Read the alarm start hour
dispnum(5,t,1);
t=DSRAMRead(ca_minas);// Read the alarm start minute
dispnum(7,t,0);
}//---- end if alarm=0
}//------ end if func=7
}// endif display<2
t=DSRAMRead(0x0c);// alarm judgement
if (((t | 0xdf)==0xff) && (alr!=0))
{ if (alr==1)
{BEE=1;SWT=1;alr++;
DSRAMWrite(0x0A,0x20); DSRAMWrite(ca_alrsw,alr);// update Alarm sign in DS12887
rtcmcpy(ca_horae,ca_hora);rtcmcpy(ca_minae,ca_mina);
} else {BEE=1;SWT=0;alr=1;
DSRAMWrite(0x0A,0x20); DSRAMWrite(ca_alrsw,alr);// update Alarm sign in DS12887
}
}
if (delay()==1)
{b=1;
if (alr==1){rtcmcpy(ca_horas,ca_hora); rtcmcpy(ca_minas,ca_mina);}
if (alr==2){rtcmcpy(ca_horae,ca_hora); rtcmcpy(ca_minae,ca_mina);}
} else b=!b;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -