📄 main1.c
字号:
/*********************************************************************************************
* File: main.c
* Author: embest
* Desc: c main entry
* History:
*********************************************************************************************/
#include "44blib.h"
#include "44b.h"
#include "rtc.h"
/*------------------------------------------------------------------------------------------*/
/* extern function */
/*------------------------------------------------------------------------------------------*/
extern char *f_szdate[8];
extern void read_rtc(void);
char user_getch(void);
char use_rtc(void);
char check_rtc(void);
void ev40_rtc_disp();
/*********************************************************************************************
* name: main
* func: c code entry
* para: none
* ret: 1
* modify:
* comment:
*********************************************************************************************/
int Main()
{
sys_init(); // Initial 44B0X's Interrupt,Port and UART
// set the extern interrupt
rINTMOD = 0x0;
rINTCON = 0x01;
rINTMSK = ~(BIT_GLOBAL | BIT_EINT4567); // use Extern 6 to set time
// use Extern 7 to set Alarm time
rPCONG = 0xffff; // EINT7~0
rPUPG = 0x0; // pull up enable
uart_init(0,115200);
// set the time for RTC and display current time
while(1)
{
if(use_rtc()) ev40_rtc_disp();
}
return 1;
}
/*********************************************************************************************
* name: check_rtc
* func: check rtc working or not
* para: none
* ret: cRTC_alr = 0:
* cRTC_alr = 1: ok
* modify:
* comment:
*********************************************************************************************/
char check_rtc(void)
{
char cRTC_alr = 0;
char cYn = 0x59;
// check RTC
while((cYn == 0x0d)|(cYn == 0x59)|(cYn == 0x79)|(cRTC_alr == 0))
{
uart_printf("\n RTC Check(Y/N)? ");
// get data from keybroad
cYn = uart_getch();
if((cYn == 0x4E)|(cYn == 0x6E)|(cYn == 0x59)|(cYn == 0x79)) uart_sendbyte(cYn);
if((cYn == 0x0d)|(cYn == 0x59)|(cYn == 0x79))
{
cRTC_alr = test_rtc_alarm(); // test rtc alarm
display_rtc();
}
else break;
if (cRTC_alr) break;
}
return cRTC_alr;
}
/*********************************************************************************************
* name: use_rtc
* func: set the data for RTC
* para: none
* ret: --------0
--------1 ok
* modify:
* comment:
*********************************************************************************************/
char use_rtc(void)
{
char cYn,cTmp,i,cN09=1;
char cNum0 = 0x30; // "0";
char cNum9 = 0x39; // "9";
char szchar[] ={0,'-',' ',':'};
char szDATE[12]; // xxxx-xx-xx x
char szTIME[8]; // xx:xx:xx
// set data for RTC
if(check_rtc())
{
uart_printf("\n RTC Working now. To set time(Y/N)? ");
cYn = uart_getch();
if((cYn == 0x4E)|(cYn == 0x6E)|(cYn == 0x59)|(cYn == 0x79)) uart_sendbyte(cYn);
if((cYn == 0x0d)|(cYn == 0x59)|(cYn == 0x79)) // want to set time?
{
// set the data for g_nYear,g_nMonth,g_nDay and g_nWeekday
do{
uart_printf("\nCurrent g_nDay is (%04x,%02x,%02x, %s). To set g_nDay(yy-mm-dd w): "
,g_nYear,g_nMonth,g_nDay,f_szdate[g_nWeekday]);
uart_getstring(szDATE); // get the data from keybroad
// check the format of the data
if(szDATE[0] == 0x32)
{
if((szDATE[4] == szchar[1] )&(szDATE[7] == szchar[1] )&(szDATE[10] == szchar[2] ))
{
if( (szDATE[11]>0) | (szDATE[11]<8) )
{
i = 0; cN09 = 0;
while(i<12)
{
if( (i!=4) | (i!=7) | (i!=10) )
{
if( (szDATE[i]<cNum0) & (szDATE[i]>cNum9) )
{
cN09 = 1;
break;
}
}
i++;
}
if(cN09 == 0)
break; // all right
} // if date 1 - 7
} // if "-" or " "
} // if 32 (21th century)
cN09 = 1;
uart_printf("\n Wrong value!! To set again(Y/N)? ");
cYn = uart_getch(); // want to set DATE again?
if( (cYn == 0x4E) | (cYn == 0x6E) | (cYn == 0x59) | (cYn == 0x79) ) uart_sendbyte(cYn);
}while( (cYn == 0x0d) | (cYn == 0x59) | (cYn == 0x79) );
// write the data into rtc register
if(cN09 ==0)
{
rRTCCON = 0x01; // R/W enable, 1/32768, Normal(merge), No reset
rBCDYEAR = ((szDATE[2]<<4)|0x0f) & (szDATE[3]|0xf0); // ->syear;
rBCDMON = ((szDATE[5]<<4)|0x0f) & (szDATE[6]|0xf0); // ->smonth;
rBCDDAY = ((szDATE[8]<<4)|0x0f) & (szDATE[9]|0xf0); // ->sday;
cTmp = ( (szDATE[11]&0x0f) +1);
if(cTmp == 8) rBCDDATE = 1; // SUN:1 MON:2 TUE:3 WED:4 THU:5 FRI:6 SAT:7
else rBCDDATE = cTmp;
rRTCCON = 0x00; // R/W disable
}
else uart_printf("\n\n Use Current DATE Settings.\n");
// set the data for g_nHour,g_nMin,g_nSec
do{
uart_printf("\nCurrent time is (%02x:%02x:%02x). To set time(hh:mm:ss): "
,g_nHour,g_nMin,g_nSec);
uart_getstring(szTIME); // get the data from keybroad
// check the format of the data
if( (szTIME[2] == szchar[3]) & (szTIME[5] == szchar[3]) )
{
i = 0; cN09 = 0;
while(i<8)
{
if((i != 2)|(i != 5))
{
if( (szTIME[i]<cNum0) & (szTIME[i]>cNum9) )
{
cN09 = 1;
break;
}
}
i++;
}
if(cN09 == 0)
{
cTmp = ( (szTIME[0]<<4)|0x0f) & (szTIME[1]|0xf0);
if( (cTmp>0) & (cTmp<0x24) )
{
szTIME[2] = cTmp; // ->shour;
cTmp = ((szTIME[3]<<4)|0x0f) & (szTIME[4]|0xf0);
if(cTmp <= 0x59)
{
szTIME[5] = cTmp; // ->smin;
cTmp = ((szTIME[6]<<4)|0x0f) & (szTIME[7]|0xf0);
if(cTmp <= 0x59)
break; // all right
} // if g_nMin < 59
} // if 0 < g_nHour < 24
} // if num 0-9
}
cN09 = 1;
uart_printf("\n Wrong value!! To set again(Y/N)? ");
cYn = uart_getch(); // want to set Time again?
if( (cYn == 0x4E) | (cYn == 0x6E) | (cYn == 0x59) | (cYn == 0x79) ) uart_sendbyte(cYn);
}while( (cYn == 0x0d) | (cYn == 0x59) | (cYn == 0x79) );
// write the data into rtc register
if(cN09 == 0)
{
rRTCCON = 0x01; // R/W enable, 1/32768, Normal(merge), No reset
rBCDHOUR = szTIME[2]; // ->shour;
rBCDMIN = szTIME[5]; // ->smin;
rBCDSEC = ((szTIME[6]<<4)|0x0f) & (szTIME[7]|0xf0); // ->ssec;
rRTCCON = 0x00; // R/W disable
}
else uart_printf("\n\n Use Current TIME Settings.\n");
}
else
{
uart_printf("\n Use Current Settings...\n");
return 1;
} // end if want to set?
}
else
{
uart_printf("\n Please check RTC or maybe it's Wrong. \n");
return 0;
} // end if(check_rtc)
}
/*********************************************************************************************
* name: ev40_rtc_disp
* func: rtc display
* para: none
* ret: none
* modify:
* comment:
*********************************************************************************************/
void ev40_rtc_disp()
{
while(rBCDSEC == 0);
// display the current data about g_nYear g_nMonth g_nDay g_nWeekday
if(rBCDYEAR == 0x99)
g_nYear = 0x1999;
else
g_nYear = 0x2000 + rBCDYEAR;
g_nMonth = rBCDMON;
g_nDay = rBCDDAY;
g_nWeekday = rBCDDATE;
uart_printf("\n%04x,%02x,%02x,%s\n",g_nYear,g_nMonth,g_nDay,f_szdate[g_nWeekday]);
// display the current data about g_nHour, g_nMin and g_nSec
uart_printf("\n please press 'Enter' to display current time\n");
while(uart_getch() != '\n')
{
g_nHour = rBCDHOUR;
g_nMin = rBCDMIN;
g_nSec = rBCDSEC;
uart_printf(" %02x:%02x:%02x\r",g_nHour,g_nMin,g_nSec);
if( (g_nSec==59) & (g_nHour==24) & (g_nMin==59) )
{
while(g_nSec = rBCDSEC);
break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -