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)&&