⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 代码.txt

📁 该代码就是本人编写的关于arm9 2410板子上的蜂鸣器的程序
💻 TXT
📖 第 1 页 / 共 2 页
字号:
			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 + -