资讯详情

瑞萨开发记录04:按键控制数码管(R5F104FEA芯片)

04.按键控制数字管

  • 一、引脚配置
  • 二、编写代码
    • 1.r_cg_userdefine.h
    • 2.r_cg_timer_user.h
    • 3.my_key.h
    • 4.my_key.c
    • 5.r_main.c
  • 三、烧录程序
  • 四、附录

??按钮的原理很简单,注意抖就行了。本案不使用延迟抖动或定时器抖动。while在循环中定义一个可以随时修改的变量,并根据程序运行所需的时间进行合理的抖动。本实验实现的案例如下: ??开发板上有五个按钮,分别是KEY1-KEY5.功能如下:

KEY1:短按时,数码管每秒 1;长按时,数码管每秒-1;快速双击时,数码管停止移动。 KEY二、短按时,数码管 1; KEY三、短按时,数码管-1; KEY4:短按时,数码管清零,不每秒更新; KEY5:短按时,数字管清零,如果原来处于每秒更新状态,则继续每秒±1。 

在这里插入图片描述

一、引脚配置

??根据原理图配置相关引脚,以下按钮引脚设置为输入模式,定时器选择通道1定时50ms。

二、编写代码

1.r_cg_userdefine.h

/*********************************************************************************************************************** * DISCLAIMER * This software is supplied by Renesas Electronics Corporation and is only intended for use with Renesas products. * No other uses are authorized. This software is owned by Renesas Electronics Corporation and is protected under all * applicable laws, including copyright laws. * THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING THIS SOFTWARE, WHETHER EXPRESS, IMPLIED * OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY * LAW, NEITHER RENESAS ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE FOR ANY DIRECT, * INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR * ITS AFFILIATES HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. * Renesas reserves the right, without notice, to make changes to this software and to discontinue the availability * of this software. By using this software, you agree to the additional terms and conditions found by accessing the * following link: * http://www.renesas.com/disclaimer * * Copyright (C) 2011, 2021 Renesas Electronics Corporation. All rights reserved. ***********************************************************************************************************************/  /*********************************************************************************************************************** * File Name : r_cg_userdefine.h * Version : CodeGenerator for RL78/G14 V2.05.06.02 [08 Nov 2021] * Device(s) : R5F104FE * Tool-Chain : CCRL * Description : This file includes user definition. * Creation Date: 2022/6/7 ***********************************************************************************************************************/  #ifndef _USER_DEF_H #define _USER_DEF_H  /*********************************************************************************************************************** User definitions ***********************************************************************************************************************/  /* Start user code for function. Do not edit comment generated here */ #define COM1 P6_bit.no3 #define COM2 P7_bit.no0
#define COM3 P7_bit.no1
#define COM4 P7_bit.no2
#define COM5 P7_bit.no3
#define SEG_A P3_bit.no1
#define SEG_B P3_bit.no0
#define SEG_C P14_bit.no6
#define SEG_D P1_bit.no3
#define SEG_E P1_bit.no4
#define SEG_F P1_bit.no5
#define SEG_G P1_bit.no6
#define SEG_DP P1_bit.no7

#define KEY1 P12_bit.no1
#define KEY2 P12_bit.no2
#define KEY3 P13_bit.no7
#define KEY4 P12_bit.no3
#define KEY5 P12_bit.no4
//void key_scan(void);//KEY1-KEY5?¨¬2a
/* End user code. Do not edit comment generated here */
#endif

2.r_cg_timer_user.h

/*********************************************************************************************************************** * DISCLAIMER * This software is supplied by Renesas Electronics Corporation and is only intended for use with Renesas products. * No other uses are authorized. This software is owned by Renesas Electronics Corporation and is protected under all * applicable laws, including copyright laws. * THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING THIS SOFTWARE, WHETHER EXPRESS, IMPLIED * OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY * LAW, NEITHER RENESAS ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE FOR ANY DIRECT, * INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR * ITS AFFILIATES HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. * Renesas reserves the right, without notice, to make changes to this software and to discontinue the availability * of this software. By using this software, you agree to the additional terms and conditions found by accessing the * following link: * http://www.renesas.com/disclaimer * * Copyright (C) 2011, 2021 Renesas Electronics Corporation. All rights reserved. ***********************************************************************************************************************/

/*********************************************************************************************************************** * File Name : r_cg_timer_user.c * Version : CodeGenerator for RL78/G14 V2.05.06.02 [08 Nov 2021] * Device(s) : R5F104FE * Tool-Chain : CCRL * Description : This file implements device driver for TAU module. * Creation Date: 2022/6/7 ***********************************************************************************************************************/

/*********************************************************************************************************************** Includes ***********************************************************************************************************************/
#include "r_cg_macrodriver.h"
#include "r_cg_timer.h"
/* Start user code for include. Do not edit comment generated here */
/* End user code. Do not edit comment generated here */
#include "r_cg_userdefine.h"

/*********************************************************************************************************************** Pragma directive ***********************************************************************************************************************/
#pragma interrupt r_tau0_channel0_interrupt(vect=INTTM00)
/* Start user code for pragma. Do not edit comment generated here */
uint16_t time_count0=0;//timer count
uint8_t display_buffer[4]={ 
        1,2,3,4,};//display num
uint8_t  display_count0=0;//
/* End user code. Do not edit comment generated here */

/*********************************************************************************************************************** Global variables and functions ***********************************************************************************************************************/
/* Start user code for global. Do not edit comment generated here */

/************************************************************* Function:Display one digit *************************************************************/
 void display_7seg(unsigned char led_digit)
 { 
        
 	unsigned char digit_bak;
	digit_bak = led_digit;
	switch(digit_bak)
	{ 
        
		case 0:	  //display 0
			SEG_A=1;SEG_B=1;SEG_C=1;SEG_D=1;SEG_E=1;SEG_F=1;SEG_G=0;
			break;
		case 1:	    //display 1
			SEG_A=0;SEG_B=1;SEG_C=1;SEG_D=0;SEG_E=0;SEG_F=0;SEG_G=0;
			break;
		case 2:	    //display 2
			SEG_A=1;SEG_B=1;SEG_C=0;SEG_D=1;SEG_E=1;SEG_F=0;SEG_G=1;
			break;
		case 3:	   //display 3
			SEG_A=1;SEG_B=1;SEG_C=1;SEG_D=1;SEG_E=0;SEG_F=0;SEG_G=1;
			break;
		case 4:	   //display 4
			SEG_A=0;SEG_B=1;SEG_C=1;SEG_D=0;SEG_E=0;SEG_F=1;SEG_G=1;
			break;
		case 5:	   //display 5
			SEG_A=1;SEG_B=0;SEG_C=1;SEG_D=1;SEG_E=0;SEG_F=1;SEG_G=1;
			break;
		case 6:	   //display 6
			SEG_A=1;SEG_B=0;SEG_C=1;SEG_D=1;SEG_E=1;SEG_F=1;SEG_G=1;	
			break;
		case 7:	   //display 7
			SEG_A=1;SEG_B=1;SEG_C=1;SEG_D=0;SEG_E=0;SEG_F=0;SEG_G=0;	
			break;
		case 8:	  //display 8
			SEG_A=1;SEG_B=1;SEG_C=1;SEG_D=1;SEG_E=1;SEG_F=1;SEG_G=1;	
			break;
		case 9:	 //display 9
			SEG_A=1;SEG_B=1;SEG_C=1;SEG_D=1;SEG_E=0;SEG_F=1;SEG_G=1;	
			break;
		case 10://off display 
			SEG_A = 0;SEG_B = 0;SEG_C = 0;SEG_D = 0;SEG_E = 0;SEG_F = 0;SEG_G = 0;
			break;
		case 11://display E
			SEG_A=1;SEG_B=0;SEG_C=0;SEG_D=1;SEG_E=1;SEG_F=1;SEG_G=1;	
			break;//
		case 12://display G0 G1 
			SEG_A = 0;SEG_B = 0;SEG_C = 0;SEG_D = 0;SEG_E = 0;SEG_F = 0;SEG_G = 1;
			break;//
		case 13://display b
			SEG_A = 0;SEG_B = 0;SEG_C = 1;SEG_D = 1;SEG_E = 1;SEG_F = 1;SEG_G = 1;
			break;		
		default:
			NOP();//
			NOP();//
			break;
	}
}
 void display_digit_led(void)
{ 
        
	display_count0+=1;//
	COM5 = 0;
	switch(display_count0%4+1)
	{ 
        
		case 1:
			display_7seg(display_buffer[0]);//
			COM1 = 0;COM2 = 1;COM3 = 1;COM4 = 1;
			SEG_DP=0;
			break;//
		case 2:
			display_7seg(display_buffer[1]);// 
			COM1 = 1;COM2 = 0;COM3 = 1;COM4 = 1;//
			//SEG_DP=1;
			break;//
		case 3:
			display_7seg(display_buffer[2]);// 
			COM1 = 1;COM2 = 1;COM3 = 0;COM4 = 1;	
			SEG_DP=0;//off clock char
			break;//
		case 4:
			display_7seg(display_buffer[3]);// 
			COM1 = 1;COM2 = 1;COM3 = 1;COM4 = 0;				
			break;//
	}
}

 void display_one_led(int id)
{ 
        
	COM5 = 0;
	switch(id%4+1)
	{ 
        
		case 1:
			display_7seg(display_buffer[0]);//
			COM1 = 0;COM2 = 1;COM3 = 1;COM4 = 1;
			SEG_DP=0;
			break;//
		case 2:
			display_7seg(display_buffer[1]);// 
			COM1 = 1;COM2 = 0;COM3 = 1;COM4 = 1;//
			//SEG_DP=1;
			break;//
		case 3:
			display_7seg(display_buffer[2]);// 
			COM1 = 1;COM2 = 1;COM3 = 0;COM4 = 1;	
			SEG_DP=0;//off clock char
			break;//
		case 4:
			display_7seg(display_buffer[3]);// 
			COM1 = 1;COM2 = 1;COM3 = 1;COM4 = 0;				
			break;//
	}
}

void set_led_num(int num)
{ 
        
	display_buffer[0]=num/1000;
	display_buffer[1]=num%1000/100;
	display_buffer[2]=num%1000%100/10;
	display_buffer[3]=num%1000%100%10;
}

 void display_LED(void)
 { 
        
	 static int count=0;
	 if(++count>10)
	 { 
        
	    count=0;	
	    display_digit_led();
	    //display_one_led(2);
	 }
 }
/* End user code. Do not edit comment generated here */

/*********************************************************************************************************************** * Function Name: r_tau0_channel0_interrupt * Description : This function is INTTM00 interrupt service routine. * Arguments : None * Return Value : None ***********************************************************************************************************************/
static void __near r_tau0_channel0_interrupt(void)
{ 
        
    /* Start user code. Do not edit comment generated here */
    time_count0+=1;
    /* End user code. Do not edit comment generated here */
}

/* Start user code for adding. Do not edit comment generated here */
/* End user code. Do not edit comment generated here */

3.my_key.h

#ifndef _MY_KEY_H
#define _MY_KEY_H

#include "iodefine.h"
#include "r_cg_userdefine.h"

#define KEY_NO 0
#define KEY_S 1
#define KEY_M 2
#define KEY_L 3

#define key KEY1
#define key2 KEY2
#define key3 KEY3
#define key4 KEY4
#define key5 KEY5

#endif

4.my_key.c

#include "my_key.h"
#include "r_cg_timer.h"

unsigned char KEY_FLAG=KEY_NO;
unsigned char KEY2_FLAG=KEY_NO;
unsigned char KEY3_FLAG=KEY_NO;
unsigned char KEY4_FLAG=KEY_NO;
unsigned char KEY5_FLAG=KEY_NO;

#define time_interval 400

void KEYx_SCAN_SML(void)
{ 
        
	static unsigned char Mode=0;
	static unsigned int count1=0;
	static unsigned int count2=0;
	static unsigned char Flag=0;
	
	switch(Mode)
	{ 
        
		case 0: 
		{ 
        
			if(!key)//状态0,检测到按键被按下
			{ 
        
				Mode=1;//跳转到状态1
			}
		}
		break;
		
		case 1:
		{ 
        
			count1++;
			if(count1>time_interval*1)//去抖10ms,可以修改具体count1值
			{ 
        
				count1=0;
				if(key)//按键释放
				{ 
        
					Mode=0;//回到状态0,重新检测
				}
				else  //按键确实被按下
				{ 
        
					Mode=2;//进入状态2,开始状态2测量时间
				}
			}
		}
		break;
		
		case 2:
		{ 
        
			count1++;
			if(count1>time_interval*120)//按下的时间大于2s,count1值可修改
			{ 
        
				count1=0;
				Mode=4;
			}
			else
			{ 
        
				count2=count1;
				if(key)	//如果按键释放
				{ 
        
					Mode=3;//跳转到状态3
					Flag++;//标志增加
				}
			}
		}
		break;
		
		case 3:
		{ 
        
			count2++;
			if(count2>time_interval*60)//如果时间很久了,3000可修改
			{ 
        
				count2=0;
				Mode=4; //跳转到状态4
			}
			else
			{ 
        
				if((count2-count1)>time_interval*5)//如果小于上面的时间,并且大于上面的时间
				{ 
        
					if(!key)//第二次按下
					{ 
        
						Flag++;
					}
				}
			}
		}
		break;
		
		case 4:
		{ 
        
			if(key)//如果已经释放了
			{ 
        
				Mode=0;//状态清0
				if(Flag>1)//标志位增加过,说明双击了
				{ 
        
					Flag=0;
					KEY_FLAG=KEY_M; //标志位清零,赋值 双击
				}
				else
				{ 
        
					Flag=0;
					KEY_FLAG=KEY_S; //标志位清零,赋值 单击
				}
			}
			else
			{ 
        
				Flag=0;//标志位清零,赋值 长按
				KEY_FLAG=KEY_L;
				Mode=5;
			}
		}
		break;
		
		case 5:
		{ 
        
			if(key) //如果按键被释放
			{ 
        
				Mode=0;//状态清零
			}
		}
		break;
	}
}


#define key_interval 3000
#define KEY_ALL ((KEY2==1)&& 

标签: g14hdcrq流量传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台