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

📄 44blib.c

📁 一个ADS下的ucos-II的移植代码,大家
💻 C
📖 第 1 页 / 共 2 页
字号:
    }
}
//***************************************************************************

/****************************************************************************
【功能说明】检查串行口是否收到字符并返回,ch为0从UART0收取,ch为1从UART1收取
****************************************************************************/
char Uart_GetKey(unsigned char ch)
{
    if(ch == 0)
    {	    
		if(rUTRSTAT0 & 0x1)		//如果收到字符就返回该字符
    	    return rURXH0;
		else	return 0;		//如果没有收到字符就返回0
    }
    else
    {
		if(rUTRSTAT1 & 0x1)		//如果收到字符就返回该字符
		    return rURXH1;
		else	return 0;		//如果没有收到字符就返回0
    }
}
//***************************************************************************

/****************************************************************************
【功能说明】向串行口发送一个数据,ch为0向UART0发送,ch为1向UART1发送
****************************************************************************/
void Uart_SendByte(unsigned char ch,int data)
{
	if(ch == 0)
	{
		if(data == '\n')
		{
			while(!(rUTRSTAT0 & 0x2));
			Delay(10);		//由于超级终端反应较慢,有一个微小延迟
			WrUTXH0('\r');
		}
		while(!(rUTRSTAT0 & 0x2));		//等待知道THR变空
		Delay(10);
		rUTXH0 = data;
   	}
	else
	{
		if(data == '\n')
		{
			while(!(rUTRSTAT1 & 0x2));
			Delay(10);		//由于超级终端反应较慢,有一个微小延迟
			rUTXH1 = '\r';
		}
		while(!(rUTRSTAT1 & 0x2));		//等待知道THR变空
		Delay(10);
		rUTXH1 = data;
    }	
}		
//***************************************************************************

/****************************************************************************
【功能说明】向串行口发送一个字符串,ch为0向UART0发送,ch为1向UART1发送
****************************************************************************/
void Uart_SendString(unsigned char ch,char *pt)
{
    while(*pt)		Uart_SendByte(ch,*pt++);
}
//***************************************************************************

/****************************************************************************
【功能说明】以标准格式printf向串行口发送一个字符串
ch为0向UART0发送,ch为1向UART1发送。(如果不用vsprintf代码会减小很多!)
****************************************************************************/
void Uart_Printf(unsigned char ch,char *fmt,...)
{
    va_list ap;
    char string[256];

    va_start(ap,fmt);
    vsprintf(string,fmt,ap);
    Uart_SendString(ch,string);
    va_end(ap);
}
//***************************************************************************

/****************************************************************************
【功能说明】定时器初始化,让PE7、6、5、4输出PWM信号
****************************************************************************/
void Timer_Pwm(void)
{
	rPCONE = 0xaa6b;		
	//PE8-P0的引脚功能依次为:ENDIAN TOUT4、3、2、1、0 RXD0 TXD0 FOUT
	rPUPE |= 0xf0;		//TOUT4、3、2、1、0设置成不上拉,其他引脚上拉

	rTCFG0 = 0x28f8f8f;		//死区长度为2;    Prescaler0/1/2=8f,8f,8f
	//定时器输入时钟频率计算公式 = MCLK/{prescaler+1}/{divider value}
	rTCFG1 = 0x0;		// Interrupt; Devider value = 1/2
	//定时器时钟 = (MCLK/prescaler+1)/2

	rTCNTB0 = 20000;		//决定TOUT 0引脚PWM输出信号的频率
	rTCNTB1 = 32000;		//决定TOUT 1引脚PWM输出信号的频率
	rTCNTB2 = 43000;		//决定TOUT 2引脚PWM输出信号的频率
	rTCNTB3 = 53000;		//决定TOUT 3引脚PWM输出信号的频率
	rTCNTB4 = 64000;		//决定TOUT 4引脚PWM输出信号的频率

	rTCMPB0 = 12000;		//决定TOUT 0引脚PWM输出高电平的信号宽度(rTCMPB0<rTCNTB0)
	rTCMPB1 = 18000;		//决定TOUT 1引脚PWM输出高电平的信号宽度(rTCMPB1<rTCNTB1)
	rTCMPB2 = 25000;		//决定TOUT 2引脚PWM输出高电平的信号宽度(rTCMPB2<rTCNTB2)
	rTCMPB3 = 28000;		//决定TOUT 3引脚PWM输出高电平的信号宽度(rTCMPB3<rTCNTB3)
	rTCMPB4 = 36000;		//决定TOUT 4引脚PWM输出高电平的信号宽度(rTCMPB4<rTCNTB4)

//	rTCON = 0xaaaa0a;		//自动重装,输出取反关闭,更新TCNTBn、TCMPBn,死区控制器关闭
//	rTCON = 0x999909;		//开始PWM输出(不使用死区控制器,上升沿会非常陡峭,是标准矩形波)
//	rTCON = 0xeeee0e;		//自动重装,输出取反打开,更新TCNTBn、TCMPBn,死区控制器关闭
//	rTCON = 0xdddd0d;		//开始PWM输出(不使用死区控制器,上升沿会非常陡峭,是标准矩形波)
//	rTCON = 0xaaaa1a;		//自动重装,输出取反关闭,更新TCNTBn、TCMPBn,死区控制器打开
//	rTCON = 0x999919;		//开始PWM输出(使用死区控制器,上升沿会变得平滑,适用于功率器件控制)

	//Delay(7500);		//延时若干个100us
	rTCON = 0xaaaa0a;		//自动重装,输出取反关闭,更新TCNTBn、TCMPBn,死区控制器关闭
	rTCON = 0x999900;		//停止蜂鸣器的叫声
//	rTCON = 0x0;		//停止定时器
	rPCONE = 0xaa6b;		//
	//PE8-P0的引脚功能依次为:ENDIAN TOUT4、3、2、1 OUTPUT RXD0 TXD0 FOUT
}
//***************************************************************************

/****************************************************************************
【功能说明】让PE7输出占空比可以数控的PWM信号,经平滑滤波后用作DAC输出
****************************************************************************/
void Tout5_Pwm(void)
{
	U8 m,n;
	for(m = 0; m < 0xff; m++)
	{
		rTCMPB4 = m;		//决定TOUT 4引脚PWM输出高电平的信号宽度(rTCMPB4<rTCNTB4)
		//rTCON = 0xaaaa0a;		//自动重装,输出取反关闭,更新TCNTBn、TCMPBn,死区控制器关闭
		//rTCON = 0x999900;		//停止蜂鸣器的叫声
		for(n = 0; n < 50;)		n++;
	}
}
//***************************************************************************

/****************************************************************************
【功能说明】液晶模块控制器初始化,外接DMF50081(320×240)液晶模块
****************************************************************************/
/*
void Lcd_Init(void)
{
	rPCOND=0xaaaa;
	rLCDCON1=(2)|(INVFRAME<<2)|(INVLINE<<3)|(INVCLK<<4)|(1<<5)|(MVAL_USED<<7)|(1<<8)|(1<<10)|(CLKVAL_SL<<12);
		//下降沿装载视频数据,禁止视频输出,LCD FIFO清空;行、帧信号取反;
		//4位单扫描模式;WDLY=8clk,WLH=8clk,CLKVAL_SL=38
	rLCDCON2=(239)|(79<<10)|(10<<21);
		//垂直点数为240,水平点数320=(80字),LINEBLANK=10
	rLCDSADDR1= (0x0<<27) | ( ((U32)Bmp>>22)<<21 ) | M5D((U32)Bmp>>1);
		// 黑白模式, LCDBANK, LCDBASEU
	rLCDSADDR2= (1<<29) | (M5D((U32)Bmp + ((320/8)*(240)))>>1) | (MVAL<<21);
	rLCDSADDR3= (320/16) | ( 0<<9 );   
	rLCDCON1=(3)|(INVFRAME<<2)|(INVLINE<<3)|(INVCLK<<4)|(1<<5)|(MVAL_USED<<7)|(1<<8)|(1<<10)|(CLKVAL_SL<<12);
		//下降沿装载视频数据,禁止视频输出,LCD FIFO清空;行、帧信号取反;
		//4位单扫描模式;WDLY=8clk,WLH=8clk,CLKVAL_SL=38
}
*/
//***************************************************************************

/****************************************************************************
【功能说明】液晶显示屏全屏填充某一个8位二进制数
****************************************************************************/
/*
void Lcd_Fill(U8 m)
{
	U16 i;
	for(i = 0; i < 9600; i++)		Bmp[i] = m;
}	
*/
//***************************************************************************

/****************************************************************************
【功能说明】液晶显示一个图片数组(向液晶控制器的显示存储器中填充待显示数据)
****************************************************************************/
/*void Lcd_Show_Bmp320_240(photo)
unsigned char photo[];
{
	U16 i;
	for(i = 0; i < 9600; i++)
	{
		Bmp[i] = photo[i];
	}
}
*/
//***************************************************************************

/****************************************************************************
【功能说明】实时时钟初始化
****************************************************************************/
void Rtc_Init(void)
{
    rRTCCON = 0x01;	//RTC读写使能,选择BCD时钟、计数器,无复位,1/32768

    rBCDYEAR = RTC_YEAR0;		//年
    rBCDMON  = RTC_MONTH0;		//月
    rBCDDAY  = RTC_DAY0;		//日
    rBCDDATE = RTC_DATE0;		//星期
    rBCDHOUR = RTC_HOUR0;		//小时
    rBCDMIN  = RTC_MIN0;		//分
    rBCDSEC  = RTC_SEC0;		//秒
}
//***************************************************************************

/****************************************************************************
【功能说明】显示实时时钟
****************************************************************************/
void Display_Rtc(void)
{
	U16 year;
	U8 month,day,weekday,hour,min,sec;
	U8 m,n;

	rRTCCON = 0x01;		//RTC读写使能,选择BCD时钟、计数器,无复位,1/32768
	year = 2000 + rBCDYEAR;

	month = rBCDMON;
	m = month>>4;		n = month&0x0f;
	month = m*10 + n;		//BCD码转十进制

	day = rBCDDAY;
	m = day>>4;		n = day&0x0f;
	day = m*10 + n;		//BCD码转十进制

	weekday = rBCDDATE;

	hour = rBCDHOUR;
	m = hour>>4;		n = hour&0x0f;
	hour = m*10 + n;		//BCD码转十进制
	
	min = rBCDMIN;
	m = min>>4;		n = min&0x0f;
	min = m*10 + n;		//BCD码转十进制

	sec = rBCDSEC;
	m = sec>>4;		n = sec&0x0f;
	sec = m*10 + n;		//BCD码转十进制
	
    rRTCCON = 0x00;		//RTC读写禁止(降低功率消耗),选择BCD时钟、计数器,无复位,1/32768

	Uart_Printf(0,"■实时时钟:%4d年%2d月%2d日【周%1d】%2d时%2d分%2d秒",year,month,day,weekday,hour,min,sec);
	Uart_Printf(1,"■实时时钟:%4d年%2d月%2d日【周%1d】%2d时%2d分%2d秒",year,month,day,weekday,hour,min,sec);
}
//***************************************************************************

/****************************************************************************
【功能说明】实时时钟定时报警
****************************************************************************/
void Rtc_Alarm(void)  
{
	rALMYEAR = RTC_YEAR1 ;		//年
	rALMMON = RTC_MONTH1;		//月
	rALMDAY = RTC_DAY1;		//日
	rALMHOUR = RTC_HOUR1;		//小时
	rALMMIN = RTC_MIN1;		//分
	rALMSEC = RTC_SEC1; 		//秒

	rRTCALM=0x7f;		//全局警报使能控制,年、月、日、星期、时分秒警报使能控制
}
//***************************************************************************

/****************************************************************************
【功能说明】模数转换初始化
****************************************************************************/
void ADC_Init(void)
{
	rCLKCON = rCLKCON | (1<<12);		//控制系统主时钟进入ADC单元模块
	rADCCON = 0x1|(0<<2);		//ADC转换使能,选择AIN7
	Delay(100);		//延时若干个100us
	rADCPSR = 10;		//ADC转换频率为:(int)(MCLK/(2*(rADCPSR+1))/16)
}
//***************************************************************************

/****************************************************************************
【功能说明】ADC某一通道进行转换,返回转换的数据
****************************************************************************/
/*U16 Read_Adc(unsigned char ain)
{
	int i;
	rADCCON = 0x1|(ain<<2);	//设置AD转换通道
	while(rADCCON & 0x1);	//避免标志FLAG错误
    while(!(rADCCON & 0x40));		//等待AD转换结束
	for(i = 0; i < rADCPSR; i++);		//避免第二次标志FLAG错误
	return rADCDAT;		//返回AD转换值
}
*/
//***************************************************************************

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -