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

📄 ru_stick.c

📁 Renesas Development RU-Stick Starter Kit Driver Demo Source Code
💻 C
字号:
//*********************************************************************
//                                                                     
//  FILE        :RU_Stick.c                                             
//  DATE        :Thu, Sep 14, 2006                                     
//  DESCRIPTION :main program file.                                    
//  CPU GROUP   :1B                                                    
//                                                                     
//  This file is for the demostrtion of RU-Stick R8C/1B     
//                                                                     
//*********************************************************************
#include "sfr_r81b.h"			//包含R8C/1B特殊功能寄存器的头文件
#include "var_def.h"			//包含全局变量声明和宏定义的头文件

void main(void)					//主函数
{
	__DisableInt;				//关闭中断
	InitClock();				//设定使用主时钟作为系统时钟(RU-Stick使用16MHz的外部陶瓷振荡器)
	InitPort();					//设定单片机I/O端口的输入/输出状态
	InitTimer();				//设定使用定时器X作为主定时器,定时器C和Z输出PWM波,
	InitUART();					//设定使用UART0为同步串行通信模式

	ReloadRedLED(ON, 0);		//从红色LED开始
	ReloadGreenLED(OFF, NULL);	//关闭绿色LED	
	ReloadBlueLED(OFF, NULL);	//关闭蓝色LED

	__EnableInt;				//打开中断
	
	txs = START;				//启动定时器X
	tzs = START;				//启动定时器Z
	tcc00 = START;				//启动定时X
	u0tb = NULL;				//启动UART0发送
	while(TRUE)					//主循环
	{
		MainCouter = 0;
		while(MainCouter != SWITCH_TIME);//等待每次改变亮度
		IncreaseStep ++;		
		DecreaseStep --;
		
		if((IncreaseStep == 0x10) && (DecreaseStep == 0x00))
		{
			IncreaseStep = 0;			//重置色彩增加计数器
			DecreaseStep = 0x10;		//重置色彩减少计数器
			ColorStep ++;				//切换色彩模式: +-->红->黄->绿->青->蓝->紫-白--+
			if(ColorStep == 7) ColorStep = 0;	//		 |______________________________|
		}
			
		switch(ColorStep)
		{
			case 0:									//白色 -> 红色
				ReloadRedLED(ON, 0x0F);				//红色: 不变	
				ReloadGreenLED(ON, DecreaseStep);	//绿色: 减少				
				ReloadBlueLED(ON, DecreaseStep);	//蓝色: 减少
				break;
			case 1:									//红色 -> 黄色
				ReloadRedLED(ON, 0x0F);				//红色: 不变
				ReloadGreenLED(ON, IncreaseStep);	//绿色: 增加
				ReloadBlueLED(OFF, NULL);			//蓝色: 关闭
				break;
			case 2:									//黄色 -> 绿色
				ReloadRedLED(ON, DecreaseStep);		//红色: 减少
				ReloadGreenLED(ON, 0x0F);			//绿色: 不变
				ReloadBlueLED(OFF, NULL);			//蓝色: 关闭
				break;	
			case 3:									//绿色 -> 青色
				ReloadRedLED(OFF, NULL);			//红色: 关闭							
				ReloadGreenLED(ON, 0x0F);			//绿色: 不变
				ReloadBlueLED(ON, IncreaseStep);	//蓝色: 增加				
				break;											
			case 4:									//青色 -> 蓝色
				ReloadRedLED(OFF, NULL);			//红色: 关闭	
				ReloadGreenLED(ON, DecreaseStep);	//绿色: 减少
				ReloadBlueLED(ON, 0x0F);			//蓝色: 不变
				break;		
			case 5:									//蓝色 -> 紫色
				ReloadRedLED(ON, IncreaseStep);		//红色: 增加	
				ReloadGreenLED(OFF, NULL);			//绿色: 关闭					
				ReloadBlueLED(ON, 0x0F);			//蓝色: 不变
				break;
			case 6:									//紫色 -> 白色
				ReloadRedLED(ON, 0x0F);				//红色: 不变	
				ReloadGreenLED(ON, IncreaseStep);	//绿色: 增加					
				ReloadBlueLED(ON, 0x0F);			//蓝色: 不变
				break;			
		}
	}
}



//***********************************************************************************
//	函数名称:	InitClock
//	描述:		设定使用主时钟作为系统时钟(RU-Stick使用16MHz的陶瓷振荡器)
//				CPU时钟不分频
//	参数:  		无
//  输入/输出:	无
//	返回值:     无
//***********************************************************************************
void InitClock()
{
	unsigned char DetectTime = 10;	//检测10次	
	prcr = 0x01;					//关闭和时钟相关的保护寄存器,允许修改时钟 
	cm13 = 1;						//XIN-XOUT引脚连接内部起振电路
	cm15 = 1;						//XIN-XOUT引脚使用高驱动能力
	cm05 = 0;						//开始振荡
	while(0 != DetectTime)
	{ 
		if(ocd3) SoftWait(1000);	//如果主时钟没有振荡,等待一段时间后再次检测,否则不等待
		DetectTime --;
	}
	if(ocd3)						//如果检测10次后,主时钟还是没有振荡
	{
		hra00 = 1;					//高速内部振荡器振荡
		SoftWait(1000);				//等待 
		hra1 = NULL;				//使用高速内部振荡器(8MHz)
		SoftWait(100);				//等待
		hra01 = 1;					//使用内部高速振荡器时钟(FRING-Fast)作为内部时钟(FRING)
		ocd2 = 1;					//使用内部时钟作为系统时钟
	}
	else ocd2 = 0;					//如果时钟振荡,则使用主时钟作为系统时钟 

	cm16 = 0;						//CPU时钟不分频
	cm17 = 0;
	cm06 = 0;						//CPU时钟的分频比使用CM16,CM17进行设定 
	prcr = NULL;					//打开保护寄存器
}

//***********************************************************************************
//	函数名称:	InitPort
//	描述:		初始化CMP1_0(P3_3),TZOUT(P1_3),TXD0(P1_4)为输出端口,默认输出为L
//	参数:  		无
//  输入/输出:	无
//	返回值:     无
//***********************************************************************************
void InitPort()
{
	p1 = 0x08;		//设定P1_3端口默认输出'H',P1_4端口默认输出'L'
	p3 = NULL;		//设定P3_3端口默认输出'L'
	pd1 |= 0x18;	//设定P1_3,P1_4端口为输出端口	
	pd3 |= 0x01;	//设定P3_3端口为输出端口
}

//***********************************************************************************
//	函数名称:	InitTimer
//	描述:		初始化定时器X:程序主定时器,用于颜色强度变化和颜色切换
//				初始化定时器Z:使用可编程波形输出模式,产生PWM波用于绿色LED的亮度控制
//				初始化定时器C:使用输出比较模式,产生PWM波用于红色LED的亮度控制
//	参数:  		无
//  输入/输出:	无
//	返回值:     无
//***********************************************************************************
void InitTimer()
{
//	定时器X
	txs = STOP;						//停止定时器X
	txmod0 = 0;						//设定使用定时器模式 
	txmod1 = 0;
	txmod2 = 0;
	
	txck0 = 0;						//设定使用主时钟的1分频时钟作为计数源 
	txck1 = 0;
	
	prex = 200 - 1;					//定时器频率为: 16MHz/((200)*(200)) = 400Hz 
	tx = 200 - 1;
	
	txund = 0;
	txic = 7;						//设定定时器X使用7级中断 

//	定时器Z
	tzs = STOP;						//停止定时器Z
	tzmod0 = 1;						//设定使用可编程波形输出模式
	tzmod1 = 0;
	tzwc = 1;						//在可编程波形输出模式下设定为'1'
	tzck0 = 0;						//设定使用主时钟的1分频时钟作为计数源 
	tzck1 = 0;
	tzopl = 0;						//输出'H',红色LED关闭
	inostg = 0;						//在可编程波形输出模式下设定为'0'
	inoseg = 0;						//在可编程波形输出模式下设定为'0'
	tzpr = 1 - 1;					//初始值为0
	tzsc = 1 - 1;					//初始值为0
	
//	定时器C
	tcc00 = STOP;					//停止定时器C
	tcc01 = 0;						//设定使用主时钟的32分频时钟作为计数源
	tcc02 = 1;
	tcc10 = 1;						//滤波器通过f1采样
	tcc11 = 0;
	tcc12 = 1;						//在比较1一致时,将TC寄存器置0
	tcc13 = 1;						//选择比较0输出(输出比较模式)
	tcc14 = 1;						//通过比较0的一致信号,将CMP输出设定为高电平
	tcc15 = 1;
	tcc16 = 0;						//通过比较1的一致信号,将CMP输出设定为低电平
	tcc17 = 1;
	tm0 = 0;						//设定比较0和比较1寄存器值
	tm1 = 100;
	tcout3 = 1;						//允许CMP从CMP1_0输出
}


//***********************************************************************************
//	函数名称:	InitUART
//	描述:		初始化UART0使用同步串行通信模式,产生PWM波用于蓝色LED的亮度控制
//	参数:  		无
//  输入/输出:	无
//	返回值:     无
//***********************************************************************************
void InitUART()
{
	te_u0c1 = DISABLE;			//禁止UART0发送功能
	re_u0c1 = DISABLE;			//禁止UART0接收功能

	s0tic = 0x01;				//UART0发送使用1级中断 
	s0ric = NULL;				//禁止UART0接收中断 

	u0mr = 0x01;				//使用同步串行通信模式(同步串行通信时只能使用8-bit)  
								//使用内部时钟  
	u0c0 = 0x00;				//使用主时钟作为UART0的时钟 
								//TXD0使用CMOS输出Mode,能够输出'H' 
								//发送缓冲寄存器为空时产生中断 
	u0rrm = 0;					//禁止连续接收 				
	u0brg=0x67;					//通信速率为UART0:9600
	te_u0c1 = ENABLE;			//启用UART0发送功能	
}

//***********************************************************************************
//	函数名称:	SoftWait
//	描述:		使用软件等待一定的时间,时间长度没有准确的要求
//	参数:  		unsigned int WaitTime:等待的时间
//  输入/输出:	无
//	返回值:     无
//***********************************************************************************
void SoftWait(unsigned int WaitTime)
{
	while(0 != WaitTime) 
	{
		__Wait4NOP;
		WaitTime --;
	}
}

//***********************************************************************************
//	函数名称:	ReloadRedLED
//	描述:		设定红色LED的亮度值
//	参数:  		_Bool Mode:	TRUE(1):	打开LED
//							FALSE(0):	关闭LED
//				unsigned char Index:	LED的16级亮度0~0x0F
//
//  输入:		const unsigned char RedLevel[]: 红色LED的16级亮度表
//	输出:		无
//	返回值:     无
//***********************************************************************************
void ReloadRedLED(_Bool Mode, unsigned char Index)
{
	if(Mode)
	{		
		p3_3 = 1;
		pd3_3 = 1;
		tcout3 = ENABLE;
		tm0 = RedLevel[Index];
	}
	else
	{
		tcout3 = DISABLE;
		pd3_3 = 0;
		p3_3 = 0;
	}
}

//***********************************************************************************
//	函数名称:	ReloadGreenLED
//	描述:		设定绿色LED的亮度值
//	参数:  		_Bool Mode:	TRUE(1):	打开LED
//							FALSE(0):	关闭LED
//				unsigned char Index:	LED的16级亮度0~0x0F
//
//  输入:		const unsigned char GreenLevel[]: 绿色LED的16级亮度表
//	输出:		无
//	返回值:     无
//***********************************************************************************
void ReloadGreenLED(_Bool Mode, unsigned char Index)
{
	if(Mode)
	{
		tzocnt = 0;		
		tzs = STOP;
		tzsc = GreenLevel[Index];
		tzpr = 160 - GreenLevel[Index];
		tzs = START;
	}
	else
	{
		tzocnt = 1;
		p1_3 = 1;
	}
}

//***********************************************************************************
//	函数名称:	ReloadBlueLED
//	描述:		设定蓝色LED的亮度值
//	参数:  		_Bool Mode:	TRUE(1):	打开LED
//							FALSE(0):	关闭LED
//				unsigned char Index:	LED的16级亮度0~0x0F
//
//  输入:		const unsigned long int BlueLevel[]: 蓝色LED的16级亮度表
//	输出:		无
//	返回值:     无
//***********************************************************************************
void ReloadBlueLED(_Bool Mode, unsigned char Index)
{
	if(Mode) 
	{
		u0mr = 0x01;
		UART0Data = BlueLevel[Index];
		u0tb = (unsigned char)UART0Data;
	}
	else 
	{
		u0mr = NULL;
		p1_4 = 0;
	}
}

//***********************************************************************************
//	函数名称:	UART0SendInt
//	描述:		UART0的发送中断程序,用于蓝色LED的亮度控制
//	参数:  		无
//  输入:		unsigned long int UART0Data: 蓝色LED的亮度值
//  输出:		无
//	返回值:     无
//***********************************************************************************
#pragma INTERRUPT /B UART0SendInt();	//指定UART0SendInt为中断函数
void UART0SendInt()
{
	static unsigned char BlueLEDStep;
	u0tb = *(unsigned char *)(&UART0Data + BlueLEDStep);
	BlueLEDStep = (BlueLEDStep + 1) % 4;
}

//***********************************************************************************
//	函数名称:	UART0SendInt
//	描述:		UART0的发送中断程序,用于蓝色LED的亮度控制
//	参数:  		无
//  输入/输出:	unsigned int MainCoutner: 主计数器,计数频率400Hz
//	返回值:     无
//***********************************************************************************
#pragma INTERRUPT TimerXInt();
void TimerXInt(void)
{
	if(MainCouter != SWITCH_TIME) MainCouter ++;
}

⌨️ 快捷键说明

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