📄 ru_stick.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 + -