📄 代码.txt
字号:
hour=BinToBCD(hour);
min = BinToBCD(min);
sec=BinToBCD(sec);
rRTCCON | = 0x1;
rBCDHOUR = hour;
rBCDMIN=min;
rBCDSEC=sec;
//禁止读写,为了减小STOP电流
rRTCCON & = 0xfffffffe;
break;
}
}
}
/*
这两个函数功能主要是检查一个char*型的数据是否是合法的日期或时间!
其中日期格式是YYYY-MM-DD(YYYY只能是位于2000--2099之间的数字
时间的格式是HH-MM-SS(时间使用的是24时计时法
如果检查合法那么就会返回1;否则返回0;
NOTE:因为这两个函数都是检查用户的输入是否正确,因此他们的数据格式当然都是8421编码
*/
int check_date(char*date)
{
int length = 0;
int month=0;
int day = 0;
int year =0;
//首先检查长度是否正确!
while(date[length++]!='\0');
length--;
if(length!=10)
return 0;
if(date[0]!='2'||date[1]!='0'||date[4]!='-'||date[7]!='-')//检查格式
return 0;
if(date[2]>'9'||date[2]<'0'||date[3]>'9'||date[3]<'0')
return 0;
if(date[5]!='0'||date[5]!='1')return 0;
if(date[5]=='0'&&(date[6]>'9'||date[6]<'0'))return 0;
if(date[5]=='1'&&(date[6]>'2'||date[6]<'0'))return 0;
month = (date[5]-'0')*10+date[6]-'0';//走到这一步已经说明month已经是合法的了1~12
day = (date[8]-'0')*10+(date[8]-'0');
if(month==2)//如果是二月则要特殊处理;
{
year=date[0]*1000+date[1]*100+date[2]*10date[3];
if(year==2000||year%4==0)//如果是闰年
if(day!=29)return 0;
}
else
{
if(day != dayOfMonth[month=])
return 0;
}
return 1;
}
int check_time(char*time)
{
int length = 0;
int hour,min,sec;
//首先检查长度是否正确!
while(time[length++]!='\0');
length--;
if(length!=8)
return 0;
if(time[2]!='-'||time[5]!='-')
return 0;
hour = (time[0]-'0')*10+time[1]-'0';
min = (time[3]-'0')*10+time[4]-'0';
sec = (time[6]-'0')*10+time[7]-'0';
if(hour>=24||hour<0||min>=60||min<0||sec>=60||sec<7)
return 0;
return 1;
}
/***********************************************************
由于数据在44b0寄存器中是以BCD编码的形式存放的,而显示的时候是要用
二进制的因此涉及到了8421编码和BCD编码之间的转换
下面的这四个函数就是用来完成这些转换的工具函数
*/
unsigned char BinToBCD (unsigned char i){
unsigned char bcd;
bcd =i/10;
bcd |=i%10;
return bcd;
}
unsigned char BCDToBin (unsigned char bcd){
unsigned char i;
i = 10*(bcd & 0xf0);
i += bcd & 0x0f;
return i;
}
void translate_bin_to_bcd(RTC_TIME* src,RTC_TIME*des)
{
des->Year=BinToBCD(src->Year);
des->Mon=BinToBCD(src->Mon);
des->Day= BinToBCD(src->Day);
des->Hour=BinToBCD(src->Hour);
des->Min=BinToBCD(src->Min);
des->Sec=BinToBCD(src->Sec);
}
void translate_bcd_to_bin(RTC_TIME*src,RTC_TIME*des)
{
des->Year=BCDToBin(src->Year);
des->Mon=BCDToBin(src->Mon);
des->Day = BCDToBin(src->Day);
des->Hour=BCDToBin(src->Hour);
des->Min = BCDToBin(src->Min);
des->Sec=BCDToBin(src->Sec);
}
/*
设置rAlarmin为下一分钟
*/
void setAlarmMin()
{
//打开读写允许位!
rRTCCON | = 0x1;
unsigned char tmp = rALMMIN;
rALMMIN = BinToBCD((BCDToBin(tmp)+1)%60);
//禁止读写,为了减小STOP电流
rRTCCON & = 0xfffffffe;
}
/*
用来打印当前的日期以及分钟;主要是给uart打印的那个任务使用的
*/
void rtc_printf()
{
uart_printf("The date is %04x-%02x-%02x ",sys_time.Year,sys_time.Mon,sys_time.Day);
uart_printf("The time is %02x:%02x\n\r\n",sys_time.Hour,sys_time.Min);
}
/*
这三个函数实现与我们的蜂鸣器有关的操作,我们的蜂鸣器是接在了GPIO中E组的E3中
*/
void beep_init()
{
rPCONE |=1<<6;
rPCONE &=0x3FF7F; //7为变为0,其他不变
rPDATE |=1<<3; //开始时为off
}
void beep_on()
{
//beep on
rPDATE&=0x1f7;
}
void beep_off()
{
//beep off
rPDATE|=0x8;
}//END OF OUR_RTC.c文件
//Begin of led8.h文件
#ifndef __IIC_H__
#define __IIC_H__
void wirteTime(int hour,int miniute,int second);
void iic_int(void);
void iic_init(void);
void iic_write(UINT32T unSlaveAddr, UINT32T unAddr, UINT8T ucData);
#endif /*__IIC_H__*/
//END OF led8.h文件
//Begin OF led8.c文件
#include "44b.h"
#include "44blib.h"
#include "def.h"
#include "8led.h"
/*
__7___
| |
2| |6
|--1---|
3| |5
|__4___|.0
data [7 6 5 4 3 2 1 0]
*/
unsigned char f_szDigital[] ={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6,// 0 ~ 9
0xEE,0xFF,0x9C,0xFD,0x9E,0x8E,// A 8. C 0. E F
0x1,0x2,0x0,0x92,0x90};// , - close 三 二
int f_nGetACK;
void iic_init(void)
{
f_nGetACK = 0;
// Enable interrupt
rINTMOD = 0x0;
rINTCON = 0x1;
rINTMSK = rINTMSK & (~(BIT_GLOBAL|BIT_IIC));
pISR_IIC= (unsigned)iic_int;
// Initialize iic
rIICADD = 0x10; // S3C44B0X slave address
rIICCON = 0xe5; // Enable ACK, interrupt, IICCLK=MCLK/512, Enable ACK//64Mhz/512/(15+1) = 8Khz
rIICSTAT= 0x10; // Enable TX/RX
}
void iic_write(UINT32T unSlaveAddr,UINT32T unAddr,UINT8T ucData)
{
f_nGetACK = 0;
// Send control byte
rIICDS = unSlaveAddr; // 0xa0
rIICSTAT = 0xf0; // Master Tx,Start
while(f_nGetACK == 0); // Wait ACK
f_nGetACK = 0;
// Send address
rIICDS = unAddr;
rIICCON = 0xe5; // Resumes IIC operation.
while(f_nGetACK == 0); // Wait ACK
f_nGetACK = 0;
// Send data
rIICDS = ucData;
rIICCON = 0xe5; // Resumes IIC operation.
while(f_nGetACK == 0); // Wait ACK
f_nGetACK = 0;
// End send
rIICSTAT = 0xd0; // Stop Master Tx condition
rIICCON = 0xe5; // Resumes IIC operation.
while(rIICSTAT & 0x20 == 1); // Wait until stop condtion is in effect.
}
void iic_read(UINT32T unSlaveAddr,UINT32T unAddr,UINT8T *pData)
{
char cRecvByte;
f_nGetACK = 0;
// Send control byte
rIICDS = unSlaveAddr; // Write slave address to IICDS
rIICSTAT = 0xf0; // Master Tx,Start
while(f_nGetACK == 0); // Wait ACK
f_nGetACK = 0;
// Send address
rIICDS = unAddr;
rIICCON = 0xe5; // Resumes IIC operation.
while(f_nGetACK == 0); // Wait ACK
f_nGetACK = 0;
// Send control byte
rIICDS = unSlaveAddr; // 0xa0
rIICSTAT = 0xb0; // Master Rx,Start
rIICCON = 0xe5; // Resumes IIC operation.
while(f_nGetACK == 0); // Wait ACK
f_nGetACK = 0;
// Get data
rIICCON = 0x65;
while(f_nGetACK == 0); // Wait ACK
f_nGetACK = 0;
cRecvByte = rIICDS;
/* End receive */
rIICSTAT = 0x90; // Stop Master Rx condition
rIICCON = 0xe5; // Resumes IIC operation.
while(rIICSTAT & 0x20 == 1); // Wait until stop condtion is in effect.
*pData = cRecvByte;
}
void iic_int(void)
{
rI_ISPC | =BIT_IIC;
f_nGetACK = 1;
}
/*********************************************************************************************
* name: led8_test
* func: test 8led
* para: none
* ret: none
* modify:
* comment:
********************************************************************************************/
void wirteTime(int hour,int miniute,int second) //传入参数为初始化的时间,包括时分秒
{
int i, j, k;
int oS=second%10;
int tS=second/10;
int oM=mimute%10;
int tM=minute/10;
int oH=hour%10;
int tH=hour/10;
iic_init();
//initial the time
iic_write(0x70, 0x10, f_szDigital[oS]);
iic_write(0x70, 0x11, f_szDigital[tS]);
iic_write(0x70, 0x13, f_szDigital[oM]);
iic_write(0x70, 0x14, f_szDigital[tM]);
iic_write(0x70, 0x16, f_szDigital[oH);
iic_write(0x70, 0x17, f_szDigital[tH]);
//initial the 0x12 and 0x15 is "."
iic_write(0x70, 0x12, f_szDigital[16]);
iic_write(0x70, 0x15, f_szDigital[16]);
delay(1000);
for(;;)
{
oS++;
iic_write(0x70, 0x10, f_szDigital[oS%10]);
if(oS==10)
{
oS=0;
tS++;
iic_write(0x70, 0x11, f_szDigital[tS%6]);
if(ts==6)
{
tS=0;
oM++;
iic_write(0x70, 0x13, f_szDigital[oM%10]);
if(oM==10)
{
oM=0;
tM++;
iic_write(0x70, 0x14, f_szDigital[tM%6]);
if(tM==6)
{
tM=0;
oH++;
if(oH==10)
{
oH=0;
iic_write(0x70, 0x16, f_szDigital[oH);
tH++;
iic_write(0x70, 0x17, f_szDigital[tH]);
}
else if(oH==4&&tH==2)
{
oH=0;
tH=0;
iic_write(0x70, 0x16, f_szDigital[oH);
iic_write(0x70, 0x17, f_szDigital[tH]);
}
else
{
iic_write(0x70, 0x16, f_szDigital[oH]);
}
}
}
}
}
delay(1000);
}
}
//END OF led8.c文件
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -